MeVisLab Toolbox Reference
mlGraphAnalyser.h
Go to the documentation of this file.
1/*************************************************************************************
2**
3** Copyright 2007, MeVis Medical Solutions AG
4**
5** The user may use this file in accordance with the license agreement provided with
6** the Software or, alternatively, in accordance with the terms contained in a
7** written agreement between the user and MeVis Medical Solutions AG.
8**
9** For further information use the contact form at https://www.mevislab.de/contact
10**
11**************************************************************************************/
12
13#ifndef ML_GRAPH_ANALYSER_H
14#define ML_GRAPH_ANALYSER_H
15
16
18
19// Include dll-specific settings.
20#include "mlVesselGraphSystem.h"
21#include "VesselGraphTypes.h"
22
23// Include vessel graph class.
25#include <map>
26#include <memory.h>
28#include "mlGraphComponents.h"
29
30#ifndef VESSELGRAPH_USE_MPIF
31#include "AssocGraph.h"
32#endif
33
34
35
36// Be sure that all your modules are part of the ml. So collisions
37// with names in system files or other libraries are minimized.
39
40 // ------------------------------------------------------------------
43 // ------------------------------------------------------------------
65
66 typedef std::map<NData, void *> DataMap;
68
69 //----------------------------------------------------------
72 //----------------------------------------------------------
75 typedef enum
76 {
77 PROC_NONE = 0x000,
78 PROC_LENGTH = 0x001,
79 PROC_VOLUME = 0x002,
82 PROC_SCL = 0x010,
84 PROC_ROOT = 0x100,
86 PROC_ST_POS = 0x204,
88#ifndef VESSELGRAPH_USE_MPIF
89 , PROC_CLUSTER = 0x400
90#endif
92
93
94
95
97
98 // ------------------------------------------------------------------
101 // ------------------------------------------------------------------
107 struct CIdxFloat{
108 int _nIdx;
109 float _fValue;
110
111
112 CIdxFloat(const CIdxFloat & oIF) : _nIdx(oIF._nIdx), _fValue(oIF._fValue) {};
113 CIdxFloat(int nIdx = 0, float fValue = 0.0) : _nIdx(nIdx), _fValue(fValue) {};
114 CIdxFloat& operator=(const CIdxFloat &oIF) {if (this != &oIF){ this->_nIdx = oIF._nIdx; this->_fValue=oIF._fValue;} return *this; }
115
116
118 inline bool operator> (const CIdxFloat& oIF) const { if(_fValue != oIF._fValue){return _fValue > oIF._fValue;} else {return _nIdx > oIF._nIdx;} }
119 inline bool operator< (const CIdxFloat& oIF) const { if(_fValue != oIF._fValue){return _fValue < oIF._fValue;} else {return _nIdx < oIF._nIdx;} }
120 inline bool operator==(const CIdxFloat& oIF) const { return ((_nIdx == oIF._nIdx) && (_fValue == oIF._fValue)); }
122 };
123
127 struct CIdxIdx{
128 int _n1;
129 int _n2;
130 CIdxIdx(const CIdxIdx & oII) : _n1(oII._n1), _n2(oII._n2) {};
131 CIdxIdx& operator=(const CIdxIdx &oII) {if (this != &oII){ this->_n1 = oII._n1; this->_n2=oII._n2;} return *this; }
133 inline bool operator< (const CIdxIdx& oII) const { if(_n1 != oII._n1){return _n1 < oII._n1;} else {return _n2 < oII._n2;} }
134 inline bool operator==(const CIdxIdx& oII) const { return ((_n1 == oII._n1) && (_n2 == oII._n2)); }
136 };
137
138
139
140
141 // ------------------------------------------------------------------
143 // ------------------------------------------------------------------
149 {
150 public:
151 //--------------------------------------------------------
154 //--------------------------------------------------------
157 explicit GraphAnalyser (Graph * pGraph) : _pGraph(pGraph) {};
159
160 //----------------------------------------------------------
163 //----------------------------------------------------------
167
171
175 void measureST_Volume(bool bIgnoreOrientation=false
177 );
178
182
184 void measureSkeletonArea(int nAvLength=5);
185
188
192 void measureST_Barycenter(bool bIgnoreOrientation=false
194 );
195
198 bool bIgnoreOrientation=false
200 );
201
204
207 void searchMaxSubTrees(std::vector<VesselEdge *>::iterator iBegin,
208 std::vector<VesselEdge *>::iterator iEnd,
209 int nNum,
210 std::vector<VesselEdge *> * pvMaxEdges,
211 float * pfActValue,
212 float * pfActSum
213 );
214
217 inline void searchMaxSubTrees(std::vector<VesselEdge *> vStartEdges,
218 unsigned int nNum,
219 std::vector<VesselEdge *> * pvMaxEdges,
220 float * pfActValue,
221 float * pfActSum
222 )
223 {
224 searchMaxSubTrees(vStartEdges.begin(), vStartEdges.end(), static_cast<int>(nNum), pvMaxEdges, pfActValue, pfActSum);
225 }
226
229 inline void searchMaxSubTrees(std::vector<VesselEdge *> vStartEdges,
230 int nPos,
231 unsigned int nNum,
232 std::vector<VesselEdge *> * pvMaxEdges,
233 float * pfActValue,
234 float * pfActSum
235 )
236 {
237 searchMaxSubTrees(vStartEdges.begin()+nPos, vStartEdges.begin()+nPos+1, static_cast<int>(nNum), pvMaxEdges, pfActValue, pfActSum);
238 }
239
240 // Starting at node pRoot, search for two subtrees (originating from a common node) with barycenters at a large distance
241 // in separationDirection and large volumes. Push_back() them to vClassifiedEdges ordered by descending position in separationDirection.
242 // If (pRoot==NULL) all nodes in the graph are considered.
243 void searchSubTreeSeparation(VesselNode* pRoot, const Vector3& separationDirection, std::vector<VesselEdge*>& vClassifiedEdges);
244
249 float fMinorLimit,
250 std::vector<VesselEdge *> *pvEdges,
251 bool bClear = true
252 );
253
259 float fMinorLimitStart,
260 float fMinorLimitStep,
261 int nMinorLimitNumber,
262 std::vector<VesselEdge *> *pvEdges,
263 bool bClear = true
264 );
266
267
268
269 //----------------------------------------------------------
272 //----------------------------------------------------------
275 VesselNode* suggestRoot(float fSignificanceLevel = 0.7f, int nPreferedDirection = 0);
276
278 const VesselNode * getParent(const VesselNode *pN1, const VesselNode *pN2) const;
279 const VesselNode * getParent(const VesselEdge *pE1, const VesselEdge *pE2) const;
283
284 private:
285 //----------------------------------------------------------
288 //----------------------------------------------------------
290 Graph * _pGraph;
291
293 DataMap _MData;
295
296
297#ifndef VESSELGRAPH_USE_MPIF
298public:
300 inline void sumupST_DrainVolume(bool bIgnoreOrientation=false
302 )
303 { sumupST_Value (&VesselNode::getDrainVolume, &VesselNode::setDrainVolume, bIgnoreOrientation); }
304
305
312 bool calcDistanceMatrix(MatrixTemplate<double>& dm, std::vector<int>& vId, int nMaxNodes);
313
314
333 bool calcNodeClassifikator(CDoubleArray * pArAssoc, std::vector<int>* pvId, int nMaxNodes);
334
335
339 bool calcNodeBaseFromPosition(const Vector3 & vPosition, const std::vector<int> & vId, std::vector<CIdxFloat> * pvResult);
340
344 bool calcPositionFromNodeBase(std::vector<CIdxFloat> vBase, Vector3 * pvResult);
345
347 double calcSpannedVolume(const std::vector<int> & vId);
348
352
354 void tansferLabels(Skeleton::LABELTYPE NType, float fThresh = 0.1f);
358 void scanSkeletonLabelMinMax( float *min, float *max );
359
361 void collectLeafs(VesselNode *pRoot, std::vector<VesselNode*>& pLeafs);
362
363private:
364 //----------------------------------------------------------
367 //----------------------------------------------------------
371 void calcRootPath(int nParentStart, int nParentEnd, int * pFreeIdx, std::vector<PathInfo>::iterator iPathBase, std::vector<PathInfo>::iterator iPathEnd);
373
374#endif
375
376 };
377
378
379
380
381
382 // ------------------------------------------------------------------
384 // ------------------------------------------------------------------
390 {
391 public:
392
393 //--------------------------------------------------------
396 //--------------------------------------------------------
399 explicit EdgeAnalyser (long NMode, DataMap * pData = nullptr);
401
402
403
404 //--------------------------------------------------------
407 //--------------------------------------------------------
408 // function \c operator() provide singular outer access point
409 inline void operator() (VesselEdge *pEdge){(this->*_actMeasure)(pEdge);}
411
412
413 private:
414 //--------------------------------------------------------
417 //--------------------------------------------------------
419 void measureNothing(VesselEdge * /*pEdge*/) {}
420
423 void measureLength (VesselEdge *pEdge);
424
427 void measureVolume (VesselEdge *pEdge);
428
430 void measurePosition (VesselEdge *pEdge);
431
433 void averageMinDistance (VesselEdge *pEdge);
434
437 void measureST_Volume(VesselEdge *pEdge);
438
441 void measureST_Barycenter(VesselEdge *pEdge);
442
444 void measure_avSkeletonArea(VesselEdge *pEdge);
445
446
449 void sumupST_NodeValue(VesselEdge *pEdge);
450
452
453 //----------------------------------------------------------
456 //----------------------------------------------------------
458 void (EdgeAnalyser::*_actMeasure) (VesselEdge *pEdge);
459
461 float _fVoxVolume;
463 DataMap * _pData;
465 long _NMode;
467 };
468
469
470
481
482 // ------------------------------------------------------------------
484 // ------------------------------------------------------------------
489 public:
492 explicit compareEdges (CMP_FEATURE NFeature, Vector3 planeNormal = Vector3(0)){
493 _planeNormal = planeNormal;
494 switch(NFeature){
495 case (CMP_LENGTH):
496 _actComperator = &compareEdges::compareLength;
497 break;
498 case (CMP_VOLUME):
499 _actComperator = &compareEdges::compareVolume;
500 break;
501 case (CMP_STVOLUME):
502 _actComperator = &compareEdges::compareSTVolume;
503 break;
504 case (CMP_STCENTER_X):
505 _actComperator = &compareEdges::compareSTCenterX;
506 break;
507 case (CMP_STCENTER_Y):
508 _actComperator = &compareEdges::compareSTCenterY;
509 break;
510 case (CMP_STCENTER_Z):
511 _actComperator = &compareEdges::compareSTCenterZ;
512 break;
513 case (CMP_STCENTER_PLANE):
514 _actComperator = &compareEdges::compareSTCenterPlane;
515 break;
516 case (CMP_LABEL):
517 default:
518 _actComperator = &compareEdges::compareLabel;
519 break;
520 }
521 }
522
523 int operator() (const VesselEdge *pE1, const VesselEdge *pE2) const
524 { return (this->*_actComperator)(pE1, pE2); }
525
526 private:
528 int (compareEdges::*_actComperator) (const VesselEdge *pE1, const VesselEdge *pE2) const;
529 Vector3 _planeNormal;
530
531 int compareLabel (const VesselEdge *pE1, const VesselEdge *pE2) const { return pE1->getLabel() > pE2->getLabel(); }
532 int compareLength (const VesselEdge *pE1, const VesselEdge *pE2) const { return pE1->getLength() > pE2->getLength(); }
533 int compareVolume (const VesselEdge *pE1, const VesselEdge *pE2) const { return pE1->getVolume() > pE2->getVolume(); }
534 int compareSTVolume (const VesselEdge *pE1, const VesselEdge *pE2) const { return pE1->getSTVolume() > pE2->getSTVolume(); }
535 int compareSTCenterX (const VesselEdge *pE1, const VesselEdge *pE2) const { return (pE1->getSTBarycenter())[0] > (pE2->getSTBarycenter())[0]; }
536 int compareSTCenterY (const VesselEdge *pE1, const VesselEdge *pE2) const { return (pE1->getSTBarycenter())[1] > (pE2->getSTBarycenter())[1]; }
537 int compareSTCenterZ (const VesselEdge *pE1, const VesselEdge *pE2) const { return (pE1->getSTBarycenter())[2] > (pE2->getSTBarycenter())[2]; }
538 int compareSTCenterPlane (const VesselEdge *pE1, const VesselEdge *pE2) const { return (pE1->getSTBarycenter()-pE2->getSTBarycenter()).dot(_planeNormal) > 0; }
539
540 };
541
542
543 // ------------------------------------------------------------------
545 // ------------------------------------------------------------------
551 {
552 public:
553
554 //--------------------------------------------------------
557 //--------------------------------------------------------
560 explicit NodeAnalyser (long NMode, DataMap * pData = nullptr) :
561 _actMeasure (&NodeAnalyser::doNothing),
562 _pData(pData)
563 {
564 switch(NMode){
565 case PROC_ROOT:
566 if(_pData != nullptr){
567 if((*pData)[OUTDATA_ROOT] != nullptr){
568 *( reinterpret_cast<long *>((*pData)[OUTDATA_ROOT])) = 0;
569 _fDist = 0.0;
570 _actMeasure = &NodeAnalyser::suggestRoot;
571 }
572 } else {
573 _actMeasure = &NodeAnalyser::doNothing;
574 }
575 break;
576#ifndef VESSELGRAPH_USE_MPIF
577 case PROC_CLUSTER:
578 if(_pData != nullptr){
579 if((*pData)[OUTDATA_CLUSTER] != nullptr){
580 _actMeasure = &NodeAnalyser::setClusterLabel;
581 }
582 } else {
583 _actMeasure = &NodeAnalyser::doNothing;
584 }
585 break;
586#endif
587 default:
588 _actMeasure = &NodeAnalyser::doNothing;
589 }
590 }
591
592
593
594 //--------------------------------------------------------
597 //--------------------------------------------------------
598 // function \c operator() provide singular outer access point
599 inline void operator() (VesselNode *pNode){(this->*_actMeasure)(pNode);}
601
602
603 private:
604 //--------------------------------------------------------
607 //--------------------------------------------------------
609 void doNothing (VesselNode * /*pNode*/) {}
610
612 void suggestRoot (VesselNode *pNode);
613
614#ifndef VESSELGRAPH_USE_MPIF
616 void setClusterLabel (VesselNode *pNode);
617#endif
619
620 //----------------------------------------------------------
623 //----------------------------------------------------------
625 void (NodeAnalyser::*_actMeasure) (VesselNode *pNode);
626
628 DataMap * _pData;
629
630 float _fDist;
632 };
633
634 // ------------------------------------------------------------------
636 // ------------------------------------------------------------------
644 {
645
647 class Process
648 {
650 typedef void (measureSkeletonAgent::*ProcessFkt) (const Skeleton & oSkeleton, Process * pProcess);
651 public:
652 ProcessFkt oProcess = &measureSkeletonAgent::doNothing;
653 void *pResult = nullptr;
654 };
655
657 friend class Process;
658
660 typedef std::map<NProcessMode, Process>::iterator IProcess;
661
662 public:
663
664
665 //--------------------------------------------------------
668 //--------------------------------------------------------
671 measureSkeletonAgent(int nMode, DataMap * pData = nullptr) :
672 _fLastLength(0.0),
673 _pScale(nullptr),
674 _pData(pData)
675 {
676 _MProcess.erase(_MProcess.begin(), _MProcess.end());
677
678 if(_pData != nullptr){
679 if(nMode & PROC_LENGTH)
680 {
681 Process oProcess;
682 oProcess.pResult = (*_pData)[OUTDATA_LENGTH];
683 if(nMode & PROC_SCL){
684 _pScale = static_cast<Vector3 *>((*_pData)[DATA_SCL]);
685 oProcess.oProcess = &measureSkeletonAgent::ProcessL1Scale;
686 }
687 else {
688 oProcess.oProcess =&measureSkeletonAgent::ProcessL1;
689 }
690 _MProcess[PROC_LENGTH] = oProcess;
691 }
692
693 if(nMode & PROC_VOLUME)
694 {
695 Process oProcess;
696 oProcess.pResult = (*_pData)[OUTDATA_VOLUME];
697 oProcess.oProcess = &measureSkeletonAgent::ProcessV1;
698 _MProcess[PROC_VOLUME] = oProcess;
699 }
700
701 if(nMode & PROC_WEIGHTED_POS)
702 {
703 Process oProcess;
704 oProcess.pResult = (*_pData)[OUTDATA_POS];
705 oProcess.oProcess = &measureSkeletonAgent::ProcessP1;
706 _MProcess[PROC_WEIGHTED_POS] = oProcess;
707 }
708
709 if(nMode & PROC_AV_MIN_DIST)
710 {
711 Process oProcess;
712 oProcess.pResult = (*_pData)[OUTDATA_AV_MIN_DIST];
713 oProcess.oProcess = &measureSkeletonAgent::ProcessD1;
714 _MProcess[PROC_AV_MIN_DIST] = oProcess;
715 }
716 }
717 }
718
719
720
721 //--------------------------------------------------------
724 //--------------------------------------------------------
726 inline void operator() (const Skeleton & oSkeleton)
727 {
728 for(IProcess iProcess = _MProcess.begin(); iProcess != _MProcess.end(); ++iProcess){
729 (this->*((iProcess->second).oProcess))(oSkeleton, &(iProcess->second));
730 }
731 }
732 inline void operator() (Skeleton* oSkeleton)
733 {
734 for(IProcess iProcess = _MProcess.begin(); iProcess != _MProcess.end(); ++iProcess){
735 (this->*((iProcess->second).oProcess))(*oSkeleton, &(iProcess->second));
736 }
737 }
738
739
740
741
742 private:
743
744 //--------------------------------------------------------
747 //--------------------------------------------------------
749 void doNothing (const Skeleton & /*oSkeleton*/, Process * /*pProcess*/) {}
750
753 void ProcessL1 (const Skeleton & oSkeleton, Process * pProcess);
754 void ProcessL1Scale (const Skeleton & oSkeleton, Process * pProcess);
756 void ProcessL2 (const Skeleton & oSkeleton, Process * pProcess);
757 void ProcessL2Scale (const Skeleton & oSkeleton, Process * pProcess);
759 void ProcessL3 (const Skeleton & oSkeleton, Process * pProcess);
760 void ProcessL3Scale (const Skeleton & oSkeleton, Process * pProcess);
761
763 void ProcessV1 (const Skeleton & oSkeleton, Process * pProcess);
764
766 void ProcessP1 (const Skeleton & oSkeleton, Process * pProcess);
767
769 void ProcessD1 (const Skeleton & oSkeleton, Process * pProcess);
770
771
773
774 //----------------------------------------------------------
777 //----------------------------------------------------------
779 std::map<NProcessMode, Process> _MProcess;
780
781
783 float _fLastLength;
784
786 std::list<Vector3> _LPoints;
788 std::list<Vector3>::iterator IBack;
790 std::list<Vector3>::iterator IMiddle;
792 std::list<Vector3>::iterator IFront;
793
794 // interpolated Skeleton position
795 Vector3 _vMean;
797 Vector3 * _pScale;
798
800 DataMap * _pData;
802 };
803
805
806#endif // __GRAPHANALYSER_H
807
808
809
810
EdgeAnalyser(long NMode, DataMap *pData=nullptr)
VesselNode * suggestRoot(float fSignificanceLevel=0.7f, int nPreferedDirection=0)
VesselNode * getParent(VesselEdge *pE1, VesselEdge *pE2)
void tansferLabelsInverse(void)
transfer skeleton labels to vessel edge label (take label of most frequent skeleton)
void searchSubTreeSeparation(VesselNode *pRoot, const Vector3 &separationDirection, std::vector< VesselEdge * > &vClassifiedEdges)
Vector3 measureBarycenter()
Get barycenter position of all the Graph.
void measureSkeletonArea(int nAvLength=5)
measure floating average of SkeletonArea and set area property
void measureST_Volume(bool bIgnoreOrientation=false)
void sumupST_Value(VesselNode::NodeGetFkt getFkt, VesselNode::NodeSetFkt setFkt, bool bIgnoreOrientation=false)
bool calcPositionFromNodeBase(std::vector< CIdxFloat > vBase, Vector3 *pvResult)
bool calcDistanceMatrix(MatrixTemplate< double > &dm, std::vector< int > &vId, int nMaxNodes)
void searchMaxSubTrees(std::vector< VesselEdge * > vStartEdges, unsigned int nNum, std::vector< VesselEdge * > *pvMaxEdges, float *pfActValue, float *pfActSum)
void searchMaxSubTrees(std::vector< VesselEdge * >::iterator iBegin, std::vector< VesselEdge * >::iterator iEnd, int nNum, std::vector< VesselEdge * > *pvMaxEdges, float *pfActValue, float *pfActSum)
void collectLeafs(VesselNode *pRoot, std::vector< VesselNode * > &pLeafs)
Collect all leafs which are children of node pRoot and append them to pLeafs.
double calcSpannedVolume(const std::vector< int > &vId)
Calculate Volume of minimal cube including all supplied nodes.
void measureVolume()
void sumupST_DrainVolume(bool bIgnoreOrientation=false)
cumulate DrainVolumes given at the leafs
void searchMaxSubTrees(std::vector< VesselEdge * > vStartEdges, int nPos, unsigned int nNum, std::vector< VesselEdge * > *pvMaxEdges, float *pfActValue, float *pfActSum)
float measureAvMinDistance()
short sampleConnectedCluster()
void tansferLabels(Skeleton::LABELTYPE NType, float fThresh=0.1f)
transfer Vessel-Edge labels to Skeleton
GraphAnalyser(Graph *pGraph)
void measureLength()
bool calcNodeBaseFromPosition(const Vector3 &vPosition, const std::vector< int > &vId, std::vector< CIdxFloat > *pvResult)
void measureST_Barycenter(bool bIgnoreOrientation=false)
void searchST_MajorBifurcation(VesselEdge *pStartEdge, float fMinorLimitStart, float fMinorLimitStep, int nMinorLimitNumber, std::vector< VesselEdge * > *pvEdges, bool bClear=true)
const VesselNode * getParent(const VesselEdge *pE1, const VesselEdge *pE2) const
void scanSkeletonLabelMinMax(float *min, float *max)
evaluate min/max value of skeleton labels
void measureMaxPathValue(VesselNode *pRootNode, VesselEdge::EdgeGetFkt edgeGetFkt, VesselNode::NodeGetFkt nodeGetFkt, VesselNode::NodeSetFkt nodeSetFkt)
For each node calculate the maximum sum of edge values in a single path below this node....
void searchST_MajorBifurcation(VesselEdge *pStartEdge, float fMinorLimit, std::vector< VesselEdge * > *pvEdges, bool bClear=true)
const VesselNode * getParent(const VesselNode *pN1, const VesselNode *pN2) const
get pointer to common parent if exists or NULL
VesselNode * getParent(VesselNode *pN1, VesselNode *pN2)
bool calcNodeClassifikator(CDoubleArray *pArAssoc, std::vector< int > *pvId, int nMaxNodes)
Defines the basic Graph class which holds sets of nodes, edges and roots to model tubular structures ...
Definition mlGraph.h:64
NodeAnalyser(long NMode, DataMap *pData=nullptr)
Skeleton objects represent centerline voxels stored in a VesselEdge object.
Definition mlSkeleton.h:35
Class VesselEdge.
double(VesselEdge::* EdgeGetFkt)(void) const
object bound function pointer: position of function relative to (individual) object base
VesselNode is derived from GraphNode, hence it can be stored as node item in a class Graph object.
void(VesselNode::* NodeSetFkt)(const MLdouble &)
function to set double parameter value
MLdouble(VesselNode::* NodeGetFkt)() const
object bound function pointer: position of function relative to (individual) object base
— Class compareEdges
int operator()(const VesselEdge *pE1, const VesselEdge *pE2) const
compareEdges(CMP_FEATURE NFeature, Vector3 planeNormal=Vector3(0))
measureSkeletonAgent(int nMode, DataMap *pData=nullptr)
std::map< NData, void * > DataMap
CMP_FEATURE
@ CMP_LENGTH
@ CMP_STCENTER_Z
@ CMP_STCENTER_PLANE
@ CMP_STCENTER_Y
@ CMP_STVOLUME
@ CMP_VOLUME
@ CMP_LABEL
@ CMP_STCENTER_X
NProcessMode
@ PROC_ST_POS
@ PROC_NONE
@ PROC_ST_NODE_SUM
@ PROC_VOLUME
@ PROC_SKELETON_AREA
@ PROC_SCL
@ PROC_WEIGHTED_POS
@ PROC_LENGTH
@ PROC_ROOT
@ PROC_ST_VOLUME
@ PROC_CLUSTER
@ PROC_AV_MIN_DIST
@ DATA_SET_FKT
@ DATA_GET_FKT
@ OUTDATA_POS
@ DATA_NODE
@ DATA_DISTANCE
@ OUTDATA_LENGTH
@ OUTDATA_VOLUME
@ OUTDATA_GLOBAL_MIN_DIST
@ DATA_FLAG
@ DATA_BARYCENTER
@ OUTDATA_AV_MIN_DIST
@ DATA_NO
@ OUTDATA_ROOT
@ DATA_AV_LEN
@ DATA_SCL
@ OUTDATA_CLUSTER
#define VESSELGRAPH_END_NAMESPACE
#define VESSELGRAPH_EXPORT
#define VESSELGRAPH_BEGIN_NAMESPACE
Tvec3< MLdouble > Vector3
A vector with three components of type double.
Definition mlVector3.h:286
CIdxFloat(const CIdxFloat &oIF)
CIdxFloat(int nIdx=0, float fValue=0.0)
bool operator<(const CIdxFloat &oIF) const
bool operator>(const CIdxFloat &oIF) const
supply comparison operator to induce an order for assistance of non-abiguous sequences
CIdxFloat & operator=(const CIdxFloat &oIF)
bool operator==(const CIdxFloat &oIF) const
bool operator<(const CIdxIdx &oII) const
supply comparison operator to induce an order for assistance of non-abiguous sequences
CIdxIdx(const CIdxIdx &oII)
CIdxIdx & operator=(const CIdxIdx &oII)
bool operator==(const CIdxIdx &oII) const