int &iGeneral, int sizeSegment,
std::vector<double> *lstInX,std::vector<double> *lstInY, std::vector<double> *lstInZ,
std::vector<double> *lstOutX,std::vector<double> *lstOutY, std::vector<double> *lstOutZ,
- std::vector<int> *lstIndexsOut )
+ std::vector<int> *lstIndexsOut, bool open )
{
creaContoursFactory f;
manualContourModel *m;
m = (manualContourModel*)f.getContourModel( bbGetInputType() );
m->SetNumberOfPointsSpline( bbGetInputNbPoints() );
- m->SetCloseContour( bbGetInputOpenClose() );
+ m->SetCloseContour( open );
for (i=iGeneral;i<size;i++)
{
m->AddPoint( (*lstInX)[i] , (*lstInY)[i] , (*lstInZ)[i] );
delete m;
}
+
+void ManualContourModel_Box::RedistributionPoints( std::vector<double> *lstOutX,
+ std::vector<double> *lstOutY,
+ std::vector<double> *lstOutZ,
+ std::vector<int> *lstIndexsOut )
+{
+ printf("EED Warnning! ManualContourModel_Box::RedistributionPoints Start\n");
+
+ std::vector<double> lstRstX;
+ std::vector<double> lstRstY;
+ std::vector<double> lstRstZ;
+
+ int iLstIndexOut,sizeLstIndexOut=lstIndexsOut->size();
+ int ii, iGeneral=0;
+ int size;
+
+ for (iLstIndexOut=0; iLstIndexOut<sizeLstIndexOut; iLstIndexOut++)
+ {
+//printf("EED ManualContourModel_Box::RedistributionPoints iLstIndexOut=%d \n", iLstIndexOut);
+
+ lstRstX.clear();
+ lstRstY.clear();
+ lstRstZ.clear();
+
+ size=(*lstIndexsOut)[iLstIndexOut];
+ if (size>2)
+ {
+ double dist=0,dist2,distSeg,delta;
+ double dd,dx,dy,dz;
+ int i,k;
+ for (i=iGeneral+1; i<iGeneral+size;i++)
+ {
+ dx=(*lstOutX)[i]-(*lstOutX)[i-1];
+ dy=(*lstOutY)[i]-(*lstOutY)[i-1];
+ dz=(*lstOutZ)[i]-(*lstOutZ)[i-1];
+ dist = dist+sqrt( dx*dx + dy*dy + dz*dz );
+ } //for
+ delta=dist/(size-1);
+
+ lstRstX.push_back( (*lstOutX)[iGeneral] );
+ lstRstY.push_back( (*lstOutY)[iGeneral] );
+ lstRstZ.push_back( (*lstOutZ)[iGeneral] );
+ for (i=iGeneral+1; i<iGeneral+size;i++)
+ {
+//printf("EED ManualContourModel_Box::RedistributionPointsi=%d \n", i-iGeneral );
+
+ dist2 = 0;
+ for (k=iGeneral+1; k<iGeneral+size;k++)
+ {
+ dx=(*lstOutX)[k]-(*lstOutX)[k-1];
+ dy=(*lstOutY)[k]-(*lstOutY)[k-1];
+ dz=(*lstOutZ)[k]-(*lstOutZ)[k-1];
+ distSeg = sqrt( dx*dx + dy*dy + dz*dz );
+ ii=i-iGeneral;
+ if ( dist2+distSeg>=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 );
+// printf("EED ManualContourModel_Box::RedistributionPoints iLstIndexOut=%d i=%d k=%d dist2+distSeg=%f ii*delta=%f dif=%f \n", iLstIndexOut,i-iGeneral, k-iGeneral, dist2+distSeg , ii*delta , (dist2+distSeg) - ii*delta);
+ }
+ }// 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; i<iGeneral+size;i++)
+ {
+ ii=i-iGeneral;
+ (*lstOutX)[i] = lstRstX[ii];
+ (*lstOutY)[i] = lstRstY[ii];
+ (*lstOutZ)[i] = lstRstZ[ii];
+ } // for i
+
+ } // if size>2
+
+ iGeneral=iGeneral+size;
+
+ }// for iLstIndexOut
+
+ printf("EED Warnning! ManualContourModel_Box::RedistributionPoints End\n");
+
+}
+
+
+
+void ManualContourModel_Box::ShiftValues( std::vector<double> *lstInX,
+ std::vector<double> *lstInY,
+ std::vector<double> *lstInZ,
+ std::vector<int> *lstIndexsIn )
+{
+ int iLstIndexIn,sizeLstIndexIn=lstIndexsIn->size();
+ int ii, iGeneral=0;
+ int size,size2;
+ double dist,distMin;
+ int i,iBack;
+ double dx,dy,dz;
+
+ std::vector<double> LstTmpX;
+ std::vector<double> LstTmpY;
+ std::vector<double> LstTmpZ;
+
+ if (sizeLstIndexIn>=2)
+ {
+ for (iLstIndexIn=0; iLstIndexIn<sizeLstIndexIn-1; iLstIndexIn++)
+ {
+ size = (*lstIndexsIn)[iLstIndexIn];
+ size2 = (*lstIndexsIn)[iLstIndexIn+1];
+
+ //find min distance and iBack
+ distMin = 10000000;
+ iBack = 0;
+ for ( i=0 ; i<size2 ; i++ )
+ {
+ dx = (*lstInX)[iGeneral]-(*lstInX)[iGeneral+size+i];
+ dy = (*lstInY)[iGeneral]-(*lstInY)[iGeneral+size+i];
+ dz = (*lstInZ)[iGeneral]-(*lstInZ)[iGeneral+size+i];
+ dist= sqrt( dx*dx + dy*dy + dz*dz );
+ if ( dist<distMin )
+ {
+ iBack = i;
+ distMin = dist;
+ }
+ } // for dist
+
+
+ if (iBack!=0)
+ {
+ LstTmpX.clear();
+ LstTmpY.clear();
+ LstTmpZ.clear();
+ for (i=0 ; i<size2 ; i++)
+ {
+ ii= (i+iBack)%size2;
+ LstTmpX.push_back( (*lstInX)[iGeneral+size+ii] );
+ LstTmpY.push_back( (*lstInY)[iGeneral+size+ii] );
+ LstTmpZ.push_back( (*lstInZ)[iGeneral+size+ii] );
+ } // for i
+ for (i=0 ; i<size2 ; i++)
+ {
+ (*lstInX)[iGeneral+size+i] = LstTmpX[i];
+ (*lstInY)[iGeneral+size+i] = LstTmpY[i];
+ (*lstInZ)[iGeneral+size+i] = LstTmpZ[i];
+ } // for i
+ }
+
+ iGeneral=iGeneral+size;
+ } // for iLstIndexIn
+ } // sizeLstIndexIn
+}
+
+
+
void ManualContourModel_Box::Process()
{
// THE MAIN PROCESSING METHOD BODY
// std::cout << "Output value = " <<bbGetOutputOut() << std::endl;
+ // First Step Spline Interpolation
std::vector<double> lstInX=bbGetInputLstControlPointsX();
std::vector<double> lstInY=bbGetInputLstControlPointsY();
std::vector<double> lstInZ=bbGetInputLstControlPointsZ();
lstIndexsIn.push_back( lstInX.size() );
}
+
+ if (bbGetInputDoubleContour()==1)
+ {
+ ShiftValues( &lstInX , &lstInY , &lstInZ , &lstIndexsIn );
+ } // DoubleContour
+
int i,size=lstIndexsIn.size();
int iGeneral=0;
for (i=0;i<size;i++)
{
ProcessBySegment( bbGetInputType() ,
- iGeneral, lstIndexsIn[i] ,
- &lstInX,&lstInY,&lstInZ,
- &lstOutX,&lstOutY,&lstOutZ,
- &lstIndexsOut);
+ iGeneral, lstIndexsIn[i] ,
+ &lstInX , &lstInY , &lstInZ,
+ &lstOutX , &lstOutY , &lstOutZ,
+ &lstIndexsOut,bbGetInputOpenClose() );
} // for
- bbSetOutputLstContourPointsX(lstOutX);
- bbSetOutputLstContourPointsY(lstOutY);
- bbSetOutputLstContourPointsZ(lstOutZ);
- bbSetOutputLstIndexsOut(lstIndexsOut);
+
+ if (bbGetInputDoubleContour()==0)
+ {
+ //////////////////// Set Out DoubleContour = 0
+ bbSetOutputLstContourPointsX(lstOutX);
+ bbSetOutputLstContourPointsY(lstOutY);
+ bbSetOutputLstContourPointsZ(lstOutZ);
+ bbSetOutputLstIndexsOut(lstIndexsOut);
+ } else {
+ RedistributionPoints(&lstOutX,&lstOutY,&lstOutZ,&lstIndexsOut);
+ ///////////// Second Step Transpose the vectors
+ lstInX.clear();
+ lstInY.clear();
+ lstInZ.clear();
+ lstIndexsIn.clear();
+ size = bbGetInputNbPoints();
+ int j,size2 = lstIndexsOut.size();
+ for (i=0;i<size;i++)
+ {
+ for (j=0;j<size2;j++)
+ {
+ lstInX.push_back( lstOutX[ j*lstIndexsOut[j] + i ] );
+ lstInY.push_back( lstOutY[ j*lstIndexsOut[j] + i ] );
+ lstInZ.push_back( lstOutZ[ j*lstIndexsOut[j] + i ] );
+ } // for j
+ lstIndexsIn.push_back( size2 );
+ } // for i
+ lstOutX.clear();
+ lstOutY.clear();
+ lstOutZ.clear();
+ lstIndexsOut.clear();
+ ///////////////////// Third step Interponation 2
+ size=lstIndexsIn.size();
+ iGeneral=0;
+ for (i=0;i<size;i++)
+ {
+ ProcessBySegment( bbGetInputType() ,
+ iGeneral, lstIndexsIn[i] ,
+ &lstInX,&lstInY,&lstInZ,
+ &lstOutX,&lstOutY,&lstOutZ,
+ &lstIndexsOut,bbGetInputOpenClose2());
+ } // for
+ RedistributionPoints(&lstOutX,&lstOutY,&lstOutZ,&lstIndexsOut);
+ //////////////////// Forth step Transpose the vectors
+ lstInX.clear();
+ lstInY.clear();
+ lstInZ.clear();
+ lstIndexsIn.clear();
+ size = bbGetInputNbPoints();
+ size2 = lstIndexsOut.size();
+ for (i=0;i<size;i++)
+ {
+ for (j=0;j<size2;j++)
+ {
+ lstInX.push_back( lstOutX[ j*lstIndexsOut[j] + i ] );
+ lstInY.push_back( lstOutY[ j*lstIndexsOut[j] + i ] );
+ lstInZ.push_back( lstOutZ[ j*lstIndexsOut[j] + i ] );
+ } // for j
+ lstIndexsIn.push_back( size2 );
+ } // for i
+ lstOutX.clear();
+ lstOutY.clear();
+ lstOutZ.clear();
+ lstIndexsOut.clear();
+
+ //////////////////// Set Out DoubleContour = 1
+ bbSetOutputLstContourPointsX(lstInX);
+ bbSetOutputLstContourPointsY(lstInY);
+ bbSetOutputLstContourPointsZ(lstInZ);
+ bbSetOutputLstIndexsOut(lstIndexsIn);
+
+ } // if DoubleContour
}
//=====
// SET HERE THE DEFAULT INPUT/OUTPUT VALUES OF YOUR BOX
// Here we initialize the input 'In' to 0
bbSetInputType(1);
+ bbSetInputDoubleContour(0);
bbSetInputOpenClose(false);
+ bbSetInputOpenClose2(false);
bbSetInputNbPoints(100);
}