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  // ------------------------------------------------------------------
46  typedef enum
47  {
48  DATA_NO = 0,
64  } NData;
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,
85  PROC_ST_VOLUME = 0x202,
86  PROC_ST_POS = 0x204,
87  PROC_ST_NODE_SUM = 0x208
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  };
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 
197  VesselNode::NodeSetFkt setFkt,
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
298 public:
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 
363 private:
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 
471  typedef enum {
479  CMP_LABEL
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  }
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  }
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  }
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 
— Class EdgeAnalyser
EdgeAnalyser(long NMode, DataMap *pData=nullptr)
constructor: connect operator() to the requested functionality
— Class GraphAnalyser
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.
VesselNode * suggestRoot(float fSignificanceLevel=0.7f, int nPreferedDirection=0)
Search for root-node: look for leaf with thick edge seated remote from the barycenter of the Graph.
void measureSkeletonArea(int nAvLength=5)
measure floating average of SkeletonArea and set area property
void measureST_Volume(bool bIgnoreOrientation=false)
Get the euclidean volume of all graph edges connected with given root, nodes cumulate them according ...
void sumupST_Value(VesselNode::NodeGetFkt getFkt, VesselNode::NodeSetFkt setFkt, bool bIgnoreOrientation=false)
bool calcPositionFromNodeBase(std::vector< CIdxFloat > vBase, Vector3 *pvResult)
Calculate spatial vector position form relative node coordinates.
bool calcDistanceMatrix(MatrixTemplate< double > &dm, std::vector< int > &vId, int nMaxNodes)
Calculate Distance Matrix for rooted Graph, taking hierarchy into account: dm(n1, n2) := minimal dist...
void searchMaxSubTrees(std::vector< VesselEdge * > vStartEdges, unsigned int nNum, std::vector< VesselEdge * > *pvMaxEdges, float *pfActValue, float *pfActSum)
calculate set of edges representing nNum subtrees maximizing selected feature stored in label propert...
VesselNode * getParent(VesselNode *pN1, VesselNode *pN2)
void searchMaxSubTrees(std::vector< VesselEdge * >::iterator iBegin, std::vector< VesselEdge * >::iterator iEnd, int nNum, std::vector< VesselEdge * > *pvMaxEdges, float *pfActValue, float *pfActSum)
calculate set of edges representing nNum subtrees maximizing selected feature stored in label propert...
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()
Get the euclidean volume of all graph edges and set edge 'Volume' property in the Graph.
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)
calculate set of edges representing nNum subtrees maximizing selected feature stored in label propert...
const VesselNode * getParent(const VesselNode *pN1, const VesselNode *pN2) const
get pointer to common parent if exists or NULL
float measureAvMinDistance()
Get the average minimal distance over all skeletons of an edge and set edge 'averageMinDistance' prop...
short sampleConnectedCluster()
identify connected subgraph return value is number of identified cluster
void tansferLabels(Skeleton::LABELTYPE NType, float fThresh=0.1f)
transfer Vessel-Edge labels to Skeleton
GraphAnalyser(Graph *pGraph)
constructor: provide pointer pGraph for easy access to Graph object
void measureLength()
Get the euclidean length of all graph edges and set edge 'Length' property in the Graph.
bool calcNodeBaseFromPosition(const Vector3 &vPosition, const std::vector< int > &vId, std::vector< CIdxFloat > *pvResult)
Calculate representation of spatial position in node coordinates.
void measureST_Barycenter(bool bIgnoreOrientation=false)
Get the euclidean volume of all graph edges connected with given root, nodes cumulate them according ...
const VesselNode * getParent(const VesselEdge *pE1, const VesselEdge *pE2) const
void searchST_MajorBifurcation(VesselEdge *pStartEdge, float fMinorLimitStart, float fMinorLimitStep, int nMinorLimitNumber, std::vector< VesselEdge * > *pvEdges, bool bClear=true)
search for first major bifurcation following main edge starting with pStartEdge, use label property t...
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)
search for first major bifurcation following main edge starting with pStartEdge, use label property t...
bool calcNodeClassifikator(CDoubleArray *pArAssoc, std::vector< int > *pvId, int nMaxNodes)
stack Node classificators in (*pArAssoc) (n1,n1): classificators based on single Node n1 respect to g...
Defines the basic Graph class which holds sets of nodes, edges and roots to model tubular structures ...
Definition: mlGraph.h:64
— Class NodeAnalyser
NodeAnalyser(long NMode, DataMap *pData=nullptr)
constructor: connect operator() to the requested functionality
Skeleton objects represent centerline voxels stored in a VesselEdge object.
Definition: mlSkeleton.h:35
Class VesselEdge.
Definition: mlVesselEdge.h:35
double(VesselEdge::* EdgeGetFkt)(void) const
object bound function pointer: position of function relative to (individual) object base
Definition: mlVesselEdge.h:117
VesselNode is derived from GraphNode, hence it can be stored as node item in a class Graph object.
Definition: mlVesselNode.h:29
void(VesselNode::* NodeSetFkt)(const MLdouble &)
function to set double parameter value
Definition: mlVesselNode.h:128
MLdouble(VesselNode::* NodeGetFkt)() const
object bound function pointer: position of function relative to (individual) object base
Definition: mlVesselNode.h:127
— Class compareEdges
int operator()(const VesselEdge *pE1, const VesselEdge *pE2) const
compareEdges(CMP_FEATURE NFeature, Vector3 planeNormal=Vector3(0))
constructor: connect operator() to the requested functionality
— Class measureSkeletonAgent
friend class Process
allow functor access to all internal stuff
void operator()(const Skeleton &oSkeleton)
add Skeleton successive
measureSkeletonAgent(int nMode, DataMap *pData=nullptr)
constructor: connect operator() to start functionality and initialize parameter for accumulation of p...
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
Flags for processing instructions and control of used functionalty.
@ 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
NData
data structure for passing informations down the processing pipe
@ 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
Definiert systemspezifische Macros, die f"ur diese DLL gelten sollen.
#define VESSELGRAPH_BEGIN_NAMESPACE
Tvec3< MLdouble > Vector3
A vector with 3 components of type double.
Definition: mlVector3.h:300
std::vector< CDouble2Vec > CDoubleArray
Definition: AssocGraph.h:35
CIdxFloat(const CIdxFloat &oIF)
CIdxFloat(int nIdx=0, float fValue=0.0)
CIdxFloat & operator=(const CIdxFloat &oIF)
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
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