X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=bbtk_creaVtk_PKG%2Fsrc%2FbbcreaVtkCreateMeshFromPoints.cxx;h=79b999135824b68eafc2a10a76d7e737a2ccad67;hb=d59326dc256aa89dd33ca55cfa4b0a37fcae095c;hp=f32a210e5feb9fcdc472de48bfa62047257574a4;hpb=1a5b6111398aa346bd621b19b4884cb0359a4ebf;p=creaVtk.git diff --git a/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.cxx b/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.cxx index f32a210..79b9991 100644 --- a/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.cxx +++ b/bbtk_creaVtk_PKG/src/bbcreaVtkCreateMeshFromPoints.cxx @@ -5,6 +5,7 @@ #include "bbcreaVtkPackage.h" #include "vtkTriangleStrip.h" +#include "vtkTriangle.h" #include namespace bbcreaVtk @@ -37,7 +38,7 @@ void CreateMeshFromPoints::Process() std::vector lstY = bbGetInputLstY(); std::vector lstZ = bbGetInputLstZ(); std::vector lstIndexs = bbGetInputLstIndexs(); - if ( (lstIndexs.size()<=1) || (lstX.size()==0) || (lstX.size()!=lstY.size()) || (lstY.size()!=lstZ.size()) ) + if ( (lstIndexs.size()<1) || (lstX.size()==0) || (lstX.size()!=lstY.size()) || (lstY.size()!=lstZ.size()) ) { printf("Warning! CreateMeshFromPoints::Process: List of points X Y Z and LstIndexes is not correct\n"); bbSetOutputOut(NULL); @@ -78,36 +79,35 @@ void CreateMeshFromPoints::Process() triangleStrip->GetPointIds()->SetId(ii*2+1,iSeg2); iSeg1++; iSeg2++; - if (iSeg1>=maxSegment1) { iSeg1=maxSegment1-1; } - if (iSeg2>=maxSegment2) { iSeg2=maxSegment2-1; } + if (iSeg1>=maxSegment1) { iSeg1=maxSegment1-1; } + if (iSeg2>=maxSegment2) { iSeg2=maxSegment2-1; } } // for ii iGeneral=iGeneral+sizeSegment1; cells->InsertNextCell(triangleStrip); } //for LstIndexs - int lastId1 = lstIndexs[0]-1; - int lastId2 = sizeLstX - 1; - int firstId2 = sizeLstX - lstIndexs[sizeLstIdexes - 1]; - bool face1open = lstX[0] != lstX[lastId1] && lstY[0] != lstY[lastId1] && lstZ[0] != lstZ[lastId1]; - bool face2open = lstX[firstId2] != lstX[lastId2] && lstY[firstId2] != lstY[lastId2] && lstZ[firstId2] != lstZ[lastId2]; - - bool altFace1open = lstX[0] != lstX[firstId2] && lstY[0] != lstY[firstId2] && lstZ[0] != lstZ[firstId2]; - bool altFace2open = lstX[lastId1] != lstX[lastId2] && lstY[lastId1] != lstY[lastId2] && lstZ[lastId1] != lstZ[lastId2]; - - isClosedCont = false; if(bbGetInputCloseSurface()) - { + { + int lastId1 = lstIndexs[0]-1; + int lastId2 = sizeLstX - 1; + int firstId2 = sizeLstX - lstIndexs[sizeLstIdexes - 1]; + bool face1open = std::fabs(lstX[0] - lstX[lastId1]) > 0.0001 && std::fabs(lstY[0] - lstY[lastId1]) > 0.0001 && std::fabs(lstZ[0] - lstZ[lastId1]) > 0.0001; + bool face2open = std::fabs(lstX[firstId2] - lstX[lastId2]) > 0.0001 && std::fabs(lstY[firstId2] - lstY[lastId2]) > 0.0001 && std::fabs(lstZ[firstId2] - lstZ[lastId2]) > 0.0001; + + bool altFace1open = std::fabs(lstX[0] - lstX[firstId2]) > 0.0001 && std::fabs(lstY[0] - lstY[firstId2]) > 0.0001 && std::fabs(lstZ[0] - lstZ[firstId2]) > 0.0001; + bool altFace2open = std::fabs(lstX[lastId1] - lstX[lastId2]) > 0.0001 && std::fabs(lstY[lastId1] - lstY[lastId2]) > 0.0001 && std::fabs(lstZ[lastId1] - lstZ[lastId2]) > 0.0001; + //false = Open Contour //true = Closed Contour if(!face1open && !face2open) { - isClosedCont = true; - CloseContourSides(lstIndexs, true); +// isClosedCont = true; + CloseContourSides(lstIndexs, true, true); } else if(!altFace1open && !altFace2open) { - isClosedCont = true; - CloseContourSides(lstIndexs, false); +// isClosedCont = true; + CloseContourSides(lstIndexs, false, true); } else{ CloseOpenContourSurface(lstIndexs); @@ -134,14 +134,13 @@ void CreateMeshFromPoints::Process() }// if listXYZ size //printf("PG CreateMeshFromPoints::Process: End\n"); } - /** * Closes the sides of the contour * iterates in one way or the other, depending on the order of the points and calculated vectors. * uPointOrder: Points are order in a U shape * lstIndexs: number of points on each spline */ -void CreateMeshFromPoints::CloseContourSides(std::vector lstIndexs, bool uPointOrder){ +void CreateMeshFromPoints::CloseContourSides(std::vector lstIndexs, bool uPointOrder, bool isClosedCont){ int sizeLstIdexes = lstIndexs.size(); int sizePoints = bbGetInputLstX().size(); @@ -149,7 +148,6 @@ void CreateMeshFromPoints::CloseContourSides(std::vector lstIndexs, bool uP int increment = uPointOrder?1:sizeLstIdexes; double centroid[3]; int numProcessFaces = sizeLstIdexes > 1?2:1; - for(int facesIdx = 0; facesIdx < numProcessFaces; facesIdx++){ std::fill(std::begin(centroid), std::end(centroid), 0); if(facesIdx == 0) @@ -171,36 +169,42 @@ void CreateMeshFromPoints::CloseContourSides(std::vector lstIndexs, bool uP { bool normalOrder = isPointingCorrectly(firstIndex, firstIndex+increment, centroid, contraryId); centroidId = points->InsertNextPoint(centroid[0], centroid[1], centroid[2]); - vtkSmartPointer triangleStrip1 = vtkSmartPointer::New(); - triangleStrip1->GetPointIds()->SetNumberOfIds(numPointsFace*2 + (!isClosedCont?2:0)); if( normalOrder ) { - int initial = firstIndex; - int triangleIndex = 0; - for(int index = initial; index < end; index+=increment){ - triangleStrip1->GetPointIds()->SetId(triangleIndex,index); - triangleStrip1->GetPointIds()->SetId(triangleIndex+1,centroidId);//1 + int initial = firstIndex; + for(int index = initial; index < end; index+=increment){ if(index+increment >= end && !isClosedCont){ - triangleStrip1->GetPointIds()->SetId(triangleIndex+2,initial);//2 - triangleStrip1->GetPointIds()->SetId(triangleIndex+3,centroidId);//3 + vtkNew triangle; + triangle->GetPointIds()->SetId(0, index); + triangle->GetPointIds()->SetId(1, initial); + triangle->GetPointIds()->SetId(2, centroidId); + cells->InsertNextCell(triangle); + }else if(index+increment < end){ + vtkNew triangle; + triangle->GetPointIds()->SetId(0, index); + triangle->GetPointIds()->SetId(1, index+increment); + triangle->GetPointIds()->SetId(2, centroidId); + cells->InsertNextCell(triangle); } - triangleIndex+=2; } - cells->InsertNextCell(triangleStrip1); } else { int initial = firstIndex-1; - int triangleIndex = 0; int triangleStripStart = end-1; for(int index = triangleStripStart; index > initial; index-=increment){ - triangleStrip1->GetPointIds()->SetId(triangleIndex,index); - triangleStrip1->GetPointIds()->SetId(triangleIndex+1,centroidId); if(index-increment <= initial && !isClosedCont){ - triangleStrip1->GetPointIds()->SetId(triangleIndex+2,triangleStripStart); - triangleStrip1->GetPointIds()->SetId(triangleIndex+3,centroidId); + vtkNew triangle; + triangle->GetPointIds()->SetId(0, index); + triangle->GetPointIds()->SetId(1, triangleStripStart); + triangle->GetPointIds()->SetId(2, centroidId); + cells->InsertNextCell(triangle); + }else if(index-increment > initial){ + vtkNew triangle; + triangle->GetPointIds()->SetId(0, index); + triangle->GetPointIds()->SetId(1, index-increment); + triangle->GetPointIds()->SetId(2, centroidId); + cells->InsertNextCell(triangle); } - triangleIndex+=2; } - cells->InsertNextCell(triangleStrip1); } }//if validCentroid }//if numPointsFace @@ -271,7 +275,7 @@ bool CreateMeshFromPoints::CheckLinePointOrder(){ */ void CreateMeshFromPoints::CloseOpenContourSurface(std::vector lstIndexs){ bool linePointOrder = CheckLinePointOrder(); - CloseContourSides(lstIndexs, !linePointOrder); + CloseContourSides(lstIndexs, !linePointOrder, false); CloseContourBottom(!linePointOrder); } @@ -291,11 +295,11 @@ bool CreateMeshFromPoints::CalcValidCentroid(double(¢roid)[3], int start, in bool samePoint = true; int splineMidPoint = numPoints/2; bool collinear = true; - + points->GetPoint(start, firstPoint); points->GetPoint(splineMidPoint, middlePoint); vtkMath::Subtract(middlePoint, firstPoint, vector1); - + for(int i = start; i < end; i+=increment){ points->GetPoint(i, currPoint); if(samePoint && i > start && (currPoint[0] != prevPoint[0] || currPoint[1] != prevPoint[1] || currPoint[2] != prevPoint[2])){ @@ -354,7 +358,6 @@ void CreateMeshFromPoints::bbUserSetDefaultValues() // Here we initialize the input 'In' to 0 // bbSetInputIn(0); bbSetInputCloseSurface(false); - isClosedCont = NULL; points = NULL; cells = NULL; polydata = NULL;