00001 #ifndef _Geom_VesselCrawler_cxx
00002 #define _Geom_VesselCrawler_cxx
00003 #include "Geom_VesselCrawler.h"
00004
00005 namespace mial
00006 {
00007
00008 template <class dType, int nDims,class MType, class VType >
00009 void
00010 Geom_VesselCrawler<dType, nDims,MType,VType>
00011 ::updateMatrixConnections()
00012 {
00013
00014
00015
00016
00017 }
00018 template < class dType, int nDims, class MType, class VType >
00019 typename Geom_VesselCrawler<dType,nDims,MType,VType>::VectorType
00020 Geom_VesselCrawler< dType, nDims, MType, VType >
00021 ::getActiveSprings(int cls)
00022 {
00023
00024
00025 int cnt =0;
00026 for(int a=0;a<numConnections;a++)
00027 if( (connectionClass(a)==cls || cls==-1) && (connectionLayers(a)==numLayers ) )
00028 cnt++;
00029
00030 VectorType springs(cnt);
00031 cnt=0;
00032 for(int a=0;a<numConnections;a++)
00033 if( (connectionClass(a)==cls || cls==-1) && (connectionLayers(a)==numLayers ) )
00034 springs(cnt) = a;
00035
00036 return springs;
00037 }
00038
00039 template < class dType, int nDims, class MType, class VType >
00040 typename Geom_VesselCrawler<dType,nDims,MType,VType>::VectorType
00041 Geom_VesselCrawler< dType, nDims, MType, VType >
00042 ::getActiveNodes(int cls)
00043 {
00044
00045
00046 int cnt =0;
00047 for(int a=numNodes;a>numNodes-numNodesPerLayer;a--)
00048 if(nodeClass(a)==cls || cls==-1 )
00049 cnt++;
00050
00051 VectorType nodes(cnt);
00052 cnt=0;
00053 for(int a=numNodes;a>numNodes-numNodesPerLayer;a--)
00054 if(nodeClass(a)==cls || cls ==-1)
00055 nodes(cnt) = a;
00056
00057 return nodes;
00058 }
00059
00060 template < class dType, int nDims, class MType, class VType >
00061 bool
00062 Geom_VesselCrawler< dType, nDims, MType, VType >
00063 ::addConnection(int start,int end,int cls, int layer)
00064 {
00065
00066 MatrixType tmpCon;
00067 tmpCon.set_size(numConnections+1,2);
00068 VectorType tmpCls(numConnections+1);
00069 VectorType tmpLayer(numConnections+1);
00070
00071
00072
00073
00074
00075
00076 for(int i=0;i<numConnections;i++)
00077 {
00078 tmpCon(i,0) = mConnections(i,0);
00079 tmpCon(i,1) = mConnections(i,1);
00080 tmpCls(i) = connectionClass(i);
00081 tmpLayer(i) = connectionLayers(i);
00082 }
00083 tmpCon(numConnections,0) = start;
00084 tmpCon(numConnections,1) = end;
00085 tmpCls(numConnections) = cls;
00086 tmpLayer(numConnections) = layer;
00087
00088 numConnections++;
00089
00090
00091 mConnections = tmpCon;
00092
00093 connectionClass = tmpCls;
00094
00095 connectionLayers = tmpLayer;
00096
00097 topologyChange = true;
00098 return false;
00099 }
00100
00101 template < class dType, int nDims, class MType, class VType >
00102 bool
00103 Geom_VesselCrawler< dType, nDims, MType, VType >
00104 ::addLayer(MType nodes, VType classes )
00105 {
00106 this->addNodes(nodes,classes);
00107 numLayers++;
00108
00109
00110
00111 if(numLayers>1)
00112 {
00113 for (int e=0; e<numNodesPerLayer;e++)
00114 {
00115 this->addConnection(e+((numLayers-2)*numNodesPerLayer),e+((numLayers-1)*numNodesPerLayer,3,numLayers));
00116
00117 }
00118
00119 for(int e=1; e<numNodesPerLayer;e++)
00120 {
00121
00122 if(e+numNodesPerLayer-1<=1+numNodesPerLayer)
00123 {
00124 this->addConnection(e+((numLayers-2)*numNodesPerLayer), numNodes,3,numLayers);
00125
00126 }
00127 else{
00128 this->addConnection(e+((numLayers-2)*numNodesPerLayer), e+((numLayers-1)*numNodesPerLayer)-1,3,numLayers);
00129
00130 }
00131 if(e+((numLayers-1)*numNodesPerLayer) < numNodes)
00132 {
00133 this->addConnection(e+((numLayers-2)*numNodesPerLayer), e+((numLayers-1)*numNodesPerLayer)+1,3,numLayers);
00134
00135 }
00136 else
00137 {
00138 this->addConnection(e+((numLayers-2)*numNodesPerLayer), e+((numLayers-2)*numNodesPerLayer)+2,3,numLayers);
00139
00140 }
00141 }
00142 }
00143
00144
00145 for(int e=1; e<numNodesPerLayer;e++)
00146 {
00147 this->addConnection(1+(numLayers-1)*numNodesPerLayer, e+((numLayers-1)*numNodesPerLayer),1,numLayers);
00148
00149 }
00150
00151 for(int e = 0; e<numNodesPerLayer-2;e++)
00152 {
00153 this->addConnection(e+1+(numLayers-1)*numNodesPerLayer, e+2+(numLayers-1)*numNodesPerLayer,2,numLayers);
00154
00155 }
00156 this->addConnection(numLayers*numNodesPerLayer,2+(numLayers-1)*numNodesPerLayer,2,numLayers);
00157
00158 return false;
00159 }
00160 }
00161 #endif