//===== // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost) //===== #include "bbcreaMaracasVisuManualContourModel_Box.h" #include "bbcreaMaracasVisuPackage.h" #include namespace bbcreaMaracasVisu { BBTK_ADD_BLACK_BOX_TO_PACKAGE(creaMaracasVisu,ManualContourModel_Box) BBTK_BLACK_BOX_IMPLEMENTATION(ManualContourModel_Box,bbtk::AtomicBlackBox); //===== // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost) //===== void ManualContourModel_Box::ProcessBySegment( int Type, int &iGeneral, int sizeSegment, std::vector *lstInX,std::vector *lstInY, std::vector *lstInZ, std::vector *lstOutX,std::vector *lstOutY, std::vector *lstOutZ, std::vector *lstIndexsOut, bool open ) { creaContoursFactory f; manualContourModel *m; int i,size=iGeneral+sizeSegment; double x,y,z; m = (manualContourModel*)f.getContourModel( bbGetInputType() ); m->SetNumberOfPointsSpline( bbGetInputNbPoints() ); m->SetCloseContour( open ); for (i=iGeneral;iAddPoint( (*lstInX)[i] , (*lstInY)[i] , (*lstInZ)[i] ); } // for m->UpdateSpline(); int sizeContour = bbGetInputNbPoints(); for (i=0;iGetSpline_i_Point(i,&x,&y,&z); lstOutX->push_back(x); lstOutY->push_back(y); lstOutZ->push_back(z); } // for iGeneral=iGeneral+sizeSegment; lstIndexsOut->push_back( sizeContour ); delete m; } void ManualContourModel_Box::RedistributionPoints( std::vector *lstOutX, std::vector *lstOutY, std::vector *lstOutZ, std::vector *lstIndexsOut ) { std::vector lstRstX; std::vector lstRstY; std::vector lstRstZ; int iLstIndexOut,sizeLstIndexOut = lstIndexsOut->size(); int ii, iGeneral=0; int size; for (iLstIndexOut=0; iLstIndexOut2) { double dist=0,dist2,distSeg,delta; double dd,dx,dy,dz; int i,k; for ( i=iGeneral+1 ; i= ii*delta ) { dd=(ii*delta-dist2)/distSeg; if (distSeg==0) { dd = 0; } // if distSeg == 0 lstRstX.push_back( (*lstOutX)[k-1] + dd*dx ); lstRstY.push_back( (*lstOutY)[k-1] + dd*dy ); lstRstZ.push_back( (*lstOutZ)[k-1] + dd*dz ); k=iGeneral+size; } else { if ( k==iGeneral+size-1 ) { dd = 1; lstRstX.push_back( (*lstOutX)[k-1] + dd*dx ); lstRstY.push_back( (*lstOutY)[k-1] + dd*dy ); lstRstZ.push_back( (*lstOutZ)[k-1] + dd*dz ); } }// if dist2 dist2 = dist2+distSeg; } // for k } //for i if (lstRstX.size()!=size) { printf("EED Warnning! ManualContourModel_Box::RedistributionPoints >> This list is not coherent iLstIndexOut=%d lstRstX.size()=%d size=%d\n",iLstIndexOut, lstRstX.size(), size); } for (i=iGeneral; i2 iGeneral=iGeneral+size; }// for iLstIndexOut } //------------------------------------------------------------------------------------------------------------- void ManualContourModel_Box::ExtractContour( std::vector *lstX, std::vector *lstY, std::vector *lstZ, std::vector *lstIndexs, int contour, std::vector *lstOutX, std::vector *lstOutY, std::vector *lstOutZ ) { int i; int iLstIndex; int iContour; int sizeLstIndexslstIndexs; int iGeneral; int iGeneralPlusSize; if ( (lstX!=NULL) && (lstY!=NULL) && (lstZ!=NULL) && (lstIndexs!=NULL) && (lstOutX!=NULL) && (lstOutY!=NULL) && (lstOutZ!=NULL) ) { sizeLstIndexslstIndexs = (*lstIndexs).size(); if ( sizeLstIndexslstIndexs!=0 ) { (*lstOutX).clear(); (*lstOutY).clear(); (*lstOutZ).clear(); iGeneral = 0; iGeneralPlusSize = (*lstIndexs)[0]; for ( iContour=1 ; iContour<=contour ; iContour++ ) { iGeneral = iGeneral+(*lstIndexs)[iContour-1]; iGeneralPlusSize = iGeneral+(*lstIndexs)[iContour]; } // for iContour for ( i=iGeneral ; i *lstTmpX, std::vector *lstTmpY, std::vector *lstTmpZ, int contour, std::vector *lstOutX, std::vector *lstOutY, std::vector *lstOutZ, std::vector *lstOutIndexs ) { int i; int iLstIndex; int iContour; int sizeLstIndexslstIndexs; int iGeneral; int iGeneralPlusSize; int iSize; int SizeContour; if ( (lstTmpX!=NULL) && (lstTmpY!=NULL) && (lstTmpZ!=NULL) && (lstOutX!=NULL) && (lstOutY!=NULL) && (lstOutZ!=NULL) && (lstOutIndexs!=NULL) ) { sizeLstIndexslstIndexs = (*lstOutIndexs).size(); if ( sizeLstIndexslstIndexs!=0 ) { iGeneral = 0; iGeneralPlusSize = (*lstOutIndexs)[0]; for ( iContour=1 ; iContour<=contour ; iContour++ ) { iGeneral = iGeneral + (*lstOutIndexs)[iContour-1]; SizeContour = (*lstOutIndexs)[iContour]; iGeneralPlusSize = iGeneral + SizeContour; } // for iContour if(SizeContour==(*lstTmpX).size() ) { int iSize=0; for ( i=iGeneral ; i *lstX, std::vector *lstY, std::vector *lstZ) { int i; double dx; double dy; double dz; double dist = 0; int iSize = (*lstX).size() - 1; for ( i=0 ; i *lstC1X, std::vector *lstC1Y, std::vector *lstC1Z, double sizeOfContour, std::vector *lstC2X, std::vector *lstC2Y, std::vector *lstC2Z ) { printf("EED ManualContourModel_Box::Redistribution_SIN Start \n"); std::vector lstRstX; std::vector lstRstY; std::vector lstRstZ; int ii,iGeneral; double iiByDelta; int size,iGeneralPlusSize; double Alpha,Beta,t,tt, PI=3.14159265; double TwoPI=2*PI; double dist=sizeOfContour; double dist2,distSeg,delta; double dd,dx,dy,dz; int i,k; int firstK; double tmpX,tmpY,tmpZ; iGeneral=0; // for (iLstIndexOut=0; iLstIndexOut2) { // dist=0; // for ( i=iGeneral ; i1) { tt=tt-1; } if (tt<0) { tt=tt+1; } iiByDelta = tt * dist; //} else { // iiByDelta = ii*delta; //} // dx = (*lstOutX)[k+1]-(*lstOutX)[k]; // dy = (*lstOutY)[k+1]-(*lstOutY)[k]; // dz = (*lstOutZ)[k+1]-(*lstOutZ)[k]; dx = (*lstC1X)[k+1]-(*lstC1X)[k]; dy = (*lstC1Y)[k+1]-(*lstC1Y)[k]; dz = (*lstC1Z)[k+1]-(*lstC1Z)[k]; distSeg = sqrt( dx*dx + dy*dy + dz*dz ); if ( dist2+distSeg >= iiByDelta ) { if (distSeg==0) { dd = 0; } else { dd=(iiByDelta-dist2)/distSeg; }// if distSeg == 0 lstRstX.push_back( (*lstC1X)[k] + dd*dx ); lstRstY.push_back( (*lstC1Y)[k] + dd*dy ); lstRstZ.push_back( (*lstC1Z)[k] + dd*dz ); if (ii==0) { firstK=k; } k = iGeneralPlusSize-1; } else { if ( k==iGeneral+size-2 ) { dd = 1; lstRstX.push_back( (*lstC1X)[k] + dd*dx ); lstRstY.push_back( (*lstC1Y)[k] + dd*dy ); lstRstZ.push_back( (*lstC1Z)[k] + dd*dz ); } }// if dist2 dist2 = dist2+distSeg; } // for k } //for i if (lstRstX.size()!=size) { printf("EED Warnning! ManualContourModel_Box::Redistribution_SIN >> This list is not coherent iLstIndexOut=%d lstRstX.size()=%d size=%d\n",iLstIndexOut, lstRstX.size(), size); tmpX = lstRstX[iGeneral]; tmpY = lstRstY[iGeneral]; tmpZ = lstRstZ[iGeneral]; lstRstX.push_back( tmpX ); lstRstY.push_back( tmpY ); lstRstZ.push_back( tmpZ ); } for (i=iGeneral; i2 // iGeneral=iGeneral+size; // }// for iLstIndexOut printf("EED ManualContourModel_Box::Redistribution_SIN End \n"); } void ManualContourModel_Box::CopyContour2InContour1( std::vector *lstInX, std::vector *lstInY, std::vector *lstInZ, std::vector *lstOutX, std::vector *lstOutY, std::vector *lstOutZ ) { int i,sizeLstInX=(*lstInX).size(); (*lstOutX).clear(); (*lstOutY).clear(); (*lstOutZ).clear(); for ( i=0 ; i *lstTmpAX, std::vector *lstTmpAY, std::vector *lstTmpAZ, std::vector *lstTmpBX, std::vector *lstTmpBY, std::vector *lstTmpBZ ) { int i; double dx; double dy; double dz; double dist = 0; int iSize = (*lstTmpAX).size(); for ( i=0 ; i *lstOutX, std::vector *lstOutY, std::vector *lstOutZ, std::vector *lstIndexsOut ) { std::vector lstTmp1X; std::vector lstTmp1Y; std::vector lstTmp1Z; std::vector lstTmp2X; std::vector lstTmp2Y; std::vector lstTmp2Z; std::vector lstTmp1aX; std::vector lstTmp1aY; std::vector lstTmp1aZ; int iContour; double nbContours = (*lstIndexsOut).size()-1; double alpha,iAlpha; double beta,iBeta; double sizeContour1; double sizeContour2; double distAcum; double minDistAcum; ExtractContour(lstOutX,lstOutY,lstOutZ,lstIndexsOut,0,&lstTmp1X,&lstTmp1Y,&lstTmp1Z); sizeContour1 = SizeContour( &lstTmp1X, &lstTmp1Y, &lstTmp1Z ); // Increment for ( iContour=0; iContour *lstOutX, std::vector *lstOutY, std::vector *lstOutZ, std::vector *lstIndexsOut,double alpha, double beta ) { printf("EED ManualContourModel_Box::RedistributionPoints_SIN_iContour Start \n"); std::vector lstRstX; std::vector lstRstY; std::vector lstRstZ; int iLstIndexOut,sizeLstIndexOut = lstIndexsOut->size(); int ii,iGeneral; double iiByDelta; int size,iGeneralPlusSize; double Alpha,Beta,t,tt, PI=3.14159265; double TwoPI=2*PI; double dist=0,dist2,distSeg,delta; double dd,dx,dy,dz; int i,k; int firstK; double tmpX,tmpY,tmpZ; iGeneral=0; for (iLstIndexOut=0; iLstIndexOut2) { dist=0; for ( i=iGeneral ; i1) { tt=tt-1; } if (tt<0) { tt=tt+1; } iiByDelta = tt * dist; } else { iiByDelta = ii*delta; } dx = (*lstOutX)[k+1]-(*lstOutX)[k]; dy = (*lstOutY)[k+1]-(*lstOutY)[k]; dz = (*lstOutZ)[k+1]-(*lstOutZ)[k]; distSeg = sqrt( dx*dx + dy*dy + dz*dz ); if ( dist2+distSeg >= iiByDelta ) { if (distSeg==0) { dd = 0; } else { dd=(iiByDelta-dist2)/distSeg; }// if distSeg == 0 lstRstX.push_back( (*lstOutX)[k] + dd*dx ); lstRstY.push_back( (*lstOutY)[k] + dd*dy ); lstRstZ.push_back( (*lstOutZ)[k] + dd*dz ); if (ii==0) { firstK=k; } k = iGeneralPlusSize-1; } else { if ( k==iGeneral+size-2 ) { dd = 1; lstRstX.push_back( (*lstOutX)[k] + dd*dx ); lstRstY.push_back( (*lstOutY)[k] + dd*dy ); lstRstZ.push_back( (*lstOutZ)[k] + dd*dz ); } }// if dist2 dist2 = dist2+distSeg; } // for k } //for i if (lstRstX.size()!=size) { printf("EED Warnning! ManualContourModel_Box::RedistributionPoints >> This list is not coherent iLstIndexOut=%d lstRstX.size()=%d size=%d\n",iLstIndexOut, lstRstX.size(), size); tmpX = lstRstX[iGeneral]; tmpY = lstRstY[iGeneral]; tmpZ = lstRstZ[iGeneral]; lstRstX.push_back( tmpX ); lstRstY.push_back( tmpY ); lstRstZ.push_back( tmpZ ); } int iii; for (i=iGeneral; i2 iGeneral=iGeneral+size; }// for iLstIndexOut printf("EED ManualContourModel_Box::RedistributionPoints_SIN_iContour End \n"); } void ManualContourModel_Box::ClockwisePoints( std::vector *lstInX, std::vector *lstInY, std::vector *lstInZ, std::vector *lstIndexsIn ) { int iLstIndexIn,sizeLstIndexIn=lstIndexsIn->size(); int i,iGeneral=0; int size,size2; double cx,cy,cz; double px,py,pz; double backpx,backpy,backpz; double ang; char dir=-1; bool dirx,diry,dirz; int flagAng=0; float backang; double tmp; // For each contour for (iLstIndexIn=0; iLstIndexIn2) // for contour with more than 2 points { cx = 0; cy = 0; cz = 0; dirx = true; diry = true; dirz = true; for ( i=0 ; i0) { if (backang2 iGeneral = iGeneral+size; } // for iLstIndexIn } /* void ManualContourModel_Box::ShiftValues( std::vector *lstInX, std::vector *lstInY, std::vector *lstInZ, std::vector *lstIndexsIn ) { int iLstIndexIn,sizeLstIndexIn=lstIndexsIn->size(); int ii, iGeneral=0; int size,size2; double dist,distMin; int i,iBack; int ig; double dx,dy,dz; std::vector LstTmpX; std::vector LstTmpY; std::vector LstTmpZ; if (sizeLstIndexIn>=2) { for (iLstIndexIn=0; iLstIndexIn *lstInX, std::vector *lstInY, std::vector *lstInZ, std::vector *lstIndexsIn ) { int iLstIndexIn,sizeLstIndexIn=lstIndexsIn->size(); int ii, iGeneral=0; int size,size2; double dist,distMin; int i,iBack; int ig; double dx,dy,dz; std::vector LstTmpX; std::vector LstTmpY; std::vector LstTmpZ; if (sizeLstIndexIn>=2) { for (iLstIndexIn=0; iLstIndexIn lstIndexsIn=bbGetInputLstIndexsIn(); std::vector lstIndexsOut; std::vector lstOutX; std::vector lstOutY; std::vector lstOutZ; if (bbGetInputLstIndexsIn().size()==0) { lstIndexsIn.push_back( lstInX.size() ); } // Step 1. All contours the same clockwise direction (Control Points) if (bbGetInputDoubleContour()==1) { ClockwisePoints( &lstInX , &lstInY , &lstInZ , &lstIndexsIn ); // ShiftValues( &lstInX , &lstInY , &lstInZ , &lstIndexsIn ); } // DoubleContour int i,size=lstIndexsIn.size(); int iGeneral=0; // Step 2. Spline interpolation of control points for (i=0;i