C:/cmcintos/defOrgs/examples/vesselCrawler/source/Geom_VesselCrawler.cxx

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                 //Matrix connections can not be updated from the mesh,
00014                 //as the mesh only has triangles and thus does not hold all connections
00015 
00016                 //TODO throw an exception saying this function cannot be called
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                 //Active springs are considered to be those connected to
00024                 //the front-most layer
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                 //Active nodes are defined as those on the frontmost layer
00045                 //i.e the numNodesPerLayer'th last elements
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                 //std::cout << start << " " << end << " " << cls << " " << layer << std::endl;
00066                 MatrixType tmpCon;
00067                 tmpCon.set_size(numConnections+1,2);
00068                 VectorType tmpCls(numConnections+1);
00069                 VectorType tmpLayer(numConnections+1);
00070 
00071                 //Copy the information
00072                 //tmpCon.update(mConnections,0,0);
00073                 //tmpCls.update(connectionClass,0);
00074                 //tmpLayer.update(connectionLayers,0);
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                 //mConnections.set_size(numConnections,2);
00091                 mConnections = tmpCon;//Copy back the old information plus the new information
00092                 //connectionClass.set_size(numConnections);
00093                 connectionClass = tmpCls;
00094                 //connectionLayers.set_size(numConnections);
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                 //%%Note e always refers to the node#
00110                 //%Link the new layer to the previous layer (if one exists)
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                                 //springsClass(a(1)+1,:) = [numLayers-1 numLayers];
00117                         }
00118                         //Stability Springs
00119                         for(int e=1; e<numNodesPerLayer;e++)
00120                         {
00121                                 //    a = size(springsNodes);
00122                                 if(e+numNodesPerLayer-1<=1+numNodesPerLayer)
00123                                 {
00124                                         this->addConnection(e+((numLayers-2)*numNodesPerLayer), numNodes,3,numLayers);
00125                                         //springsClass(a(1)+1,:) = [-3 numLayers];
00126                                 }
00127                                 else{
00128                                         this->addConnection(e+((numLayers-2)*numNodesPerLayer), e+((numLayers-1)*numNodesPerLayer)-1,3,numLayers);
00129                                         //springsClass(a(1)+1,:) = [-3 numLayers];
00130                                 }
00131                                 if(e+((numLayers-1)*numNodesPerLayer) < numNodes)
00132                                 {
00133                                         this->addConnection(e+((numLayers-2)*numNodesPerLayer), e+((numLayers-1)*numNodesPerLayer)+1,3,numLayers);
00134                                         //springsClass(end+1,:) = [-3 numLayers];
00135                                 }
00136                                 else
00137                                 {
00138                                         this->addConnection(e+((numLayers-2)*numNodesPerLayer), e+((numLayers-2)*numNodesPerLayer)+2,3,numLayers);
00139                                         //springsClass(end+1,:) = [-3 numLayers];
00140                                 }
00141                         }
00142                 }
00143                 //%%%%%%%%%%%%%%%%%%%%%%%%%
00144                 //%%Radial Springs (thickness)
00145                 for(int e=1; e<numNodesPerLayer;e++)
00146                 {
00147                         this->addConnection(1+(numLayers-1)*numNodesPerLayer, e+((numLayers-1)*numNodesPerLayer),1,numLayers);
00148                         //springsClass(a(1)+1,:) = [-1 numLayers];
00149                 }
00150                 //%%Boundary Springs
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                         //springsClass(a(1)+1,:) = [-2 numLayers];
00155                 }
00156                 this->addConnection(numLayers*numNodesPerLayer,2+(numLayers-1)*numNodesPerLayer,2,numLayers);
00157                 //springsClass(a(1)+1,:) = [-2 numLayers];
00158                 return false;
00159         }
00160 }//end mial
00161 #endif

Generated on Wed Jul 19 13:05:16 2006 for IDO by  doxygen 1.4.7