+ 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;i<size;i++)
+ {
+ m->AddPoint( (*lstInX)[i] , (*lstInY)[i] , (*lstInZ)[i] );
+ } // for
+ m->UpdateSpline();
+ int sizeContour = bbGetInputNbPoints();
+ for (i=0;i<sizeContour;i++)
+ {
+ m->GetSpline_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<double> *lstOutX,
+ std::vector<double> *lstOutY,
+ std::vector<double> *lstOutZ,
+ std::vector<int> *lstIndexsOut )
+{
+ 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
+}
+