From: Eduardo DAVILA Date: Sun, 16 May 2021 14:12:07 +0000 (+0200) Subject: #3463 box ManualContourModel optimisation of SIN() distribution by contour X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=18dbff04b15ed33bf26707fc59051755522ad746;p=creaMaracasVisu.git #3463 box ManualContourModel optimisation of SIN() distribution by contour --- diff --git a/bbtk/src/bbcreaMaracasVisuManualContourModel_Box.cxx b/bbtk/src/bbcreaMaracasVisuManualContourModel_Box.cxx index 9623d4c..b7cea8e 100644 --- a/bbtk/src/bbcreaMaracasVisuManualContourModel_Box.cxx +++ b/bbtk/src/bbcreaMaracasVisuManualContourModel_Box.cxx @@ -146,7 +146,7 @@ void ManualContourModel_Box::ExtractContour( std::vector *lstX, std::vector *lstOutZ ) { int i; - int iLstIndex; +// int iLstIndex; int iContour; int sizeLstIndexslstIndexs; int iGeneral; @@ -186,7 +186,7 @@ void ManualContourModel_Box::PutPointsInContour(std::vector *lstTmpX, std::vector *lstOutIndexs ) { int i; - int iLstIndex; +// int iLstIndex; int iContour; int sizeLstIndexslstIndexs; int iGeneral; @@ -211,8 +211,10 @@ void ManualContourModel_Box::PutPointsInContour(std::vector *lstTmpX, if(SizeContour==(*lstTmpX).size() ) { int iSize=0; +printf("\n ManualContourModel_Box::PutPointsInContour y=%f\n", (*lstTmpY)[0] ); for ( i=iGeneral ; i *lstTmpX, } // NULL } -double ManualContourModel_Box::SizeContour( std::vector *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 *lstC2X, std::vector *lstC2Y, - std::vector *lstC2Z ) + std::vector *lstC2Z ) { std::vector lstRstX; std::vector lstRstY; @@ -272,7 +254,6 @@ void ManualContourModel_Box::Redistribution_SIN( double alpha, int firstK; double iiByDelta; double dist2,distSeg; -// double delta; double dd,dx,dy,dz; double t,tt, PI; double TwoPI; @@ -281,116 +262,88 @@ void ManualContourModel_Box::Redistribution_SIN( double alpha, PI = 3.14159265; TwoPI = 2*PI; iGeneral = 0; -// for (iLstIndexOut=0; iLstIndexOut2) + + size = (*lstC1X).size(); + iGeneralPlusSize = iGeneral+size; + if (size>2) + { + firstK = 0; + for (i=iGeneral; i=1) { tt=tt-1; } + if (tt<0) { tt=tt+1; } + iiByDelta = tt * dist; -// delta = dist/(size-1); - firstK = 0; - for (i=iGeneral; i= iiByDelta ) { -//if ( 385==(*lstOutY)[k] ) -//{ - t = ((double)ii) / ((double)(size-1)); -// Beta = 0.20; // [0..1] -// Alpha = 0.0; // [0..1] -// Beta = bbGetInputParam()[0]; -// Alpha = bbGetInputParam()[1]; - tt = t + 0.70710678182*sin(t*TwoPI)*beta + alpha; - if (tt>1) { 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) { - if (distSeg==0) - { - dd = 0; - } else { - dd=(iiByDelta-dist2)/distSeg; - }// 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==iGeneralPlusSize-1-1 ) + { + dd = 1; 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 lstRstX.size()=%d size=%d\n", lstRstX.size(), size); - } - (*lstC2X).clear(); - (*lstC2Y).clear(); - (*lstC2Z).clear(); - for (i=iGeneral; i2 -// iGeneral=iGeneral+size; -// }// for iLstIndexOut + } // if k + }// 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 lstRstX.size()=%d size=%d\n", lstRstX.size(), size); + } + (*lstC2X).clear(); + (*lstC2Y).clear(); + (*lstC2Z).clear(); + for (i=iGeneral; i2 } void ManualContourModel_Box::CopyContour2InContour1( @@ -431,11 +384,123 @@ double ManualContourModel_Box::IntegralDistanceTwoContours(std::vector * dx = (*lstTmpAX)[i]-(*lstTmpBX)[i]; dy = (*lstTmpAY)[i]-(*lstTmpBY)[i]; dz = (*lstTmpAZ)[i]-(*lstTmpBZ)[i]; - dist = dist + sqrt( dx*dx + dy*dy + dz*dz ); +// dist = dist + sqrt( dx*dx + dy*dy + dz*dz ); + dist = dist + (dx*dx + dy*dy + dz*dz) ; } //for i return dist; } +void ManualContourModel_Box::findAlphaBetaSinDistribution( std::vector *ptrLstTmp2X, + std::vector *ptrLstTmp2Y, + std::vector *ptrLstTmp2Z , + int sizeContour, + std::vector *ptrLstTmp1X, + std::vector *ptrLstTmp1Y, + std::vector *ptrLstTmp1Z, + double *alphaOut, + double *betaOut) +{ + std::vector lstTmp2aX; + std::vector lstTmp2aY; + std::vector lstTmp2aZ; + double alpha,iAlpha,deltaAlpha; + double beta,iBeta,deltaBeta; + double distAcum; + double minDistAcum; + deltaAlpha = 0.1 / 2; + deltaBeta = 0.01 / 2; + beta = 0.05; + alpha = 0; + minDistAcum = 999999999999; + for (iAlpha=0 ; iAlpha<1; iAlpha=iAlpha+deltaAlpha ) + { + Redistribution_SIN( iAlpha,beta, ptrLstTmp2X,ptrLstTmp2Y,ptrLstTmp2Z ,sizeContour, &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); + distAcum = IntegralDistanceTwoContours( ptrLstTmp1X,ptrLstTmp1Y,ptrLstTmp1Z , &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); + if (distAcum *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 *lstOutX, + std::vector *lstOutY, + std::vector *lstOutZ, + std::vector *lstIndexsOut, + std::vector *lstSizeContours ) +{ + int i; +// int iLstIndex; + int iContour; + int sizeLstIndexs; + int iGeneral; + int iGeneralPlusSize; + double dx,dy,dz; + double dist; + (*lstSizeContours).clear(); + if ( (lstOutX!=NULL) && (lstOutY!=NULL) && (lstOutZ!=NULL) && (lstIndexsOut!=NULL) ) + { + sizeLstIndexs = (*lstIndexsOut).size(); + if ( sizeLstIndexs!=0 ) + { + iGeneral = 0; + for ( iContour=0 ; iContour *lstOutX, std::vector *lstOutY, @@ -451,471 +516,139 @@ void ManualContourModel_Box::RedistributionPointsAllContours_SIN( std::vector lstTmp2aX; std::vector lstTmp2aY; std::vector lstTmp2aZ; - std::vector lstTmp2bX; - std::vector lstTmp2bY; - std::vector lstTmp2bZ; - std::vector lstTmp2cX; - std::vector lstTmp2cY; - std::vector lstTmp2cZ; std::vector lstTmp3X; std::vector lstTmp3Y; std::vector lstTmp3Z; std::vector lstContourExeption; + std::vector lstSizeContours; int iContour; double nbContours = (*lstIndexsOut).size(); - double alpha,iAlpha; - double beta,iBeta; + double alpha,beta; double sizeContour1; double sizeContour2; double sizeContour3; - double distAcum; - double minDistAcum; - // ------------ Wave 1 ----------------- + CalculeLstSizeContours(lstOutX,lstOutY,lstOutZ,lstIndexsOut, &lstSizeContours); +// ------------ Wave 1 Back to Fordward (redistribution for the little one)----------------- ExtractContour(lstOutX,lstOutY,lstOutZ,lstIndexsOut,0,&lstTmp1X,&lstTmp1Y,&lstTmp1Z); - sizeContour1 = SizeContour( &lstTmp1X, &lstTmp1Y, &lstTmp1Z ); +// sizeContour1 = SizeContour( &lstTmp1X, &lstTmp1Y, &lstTmp1Z ); + sizeContour1 = lstSizeContours[0]; // Increment - for ( iContour=0; iContoursizeContour2) && (sizeContour2>sizeContour3) ) { - beta = 0.05; - alpha = 0; - minDistAcum = 999999999; - for (iAlpha=0 ; iAlpha<1; iAlpha=iAlpha+0.1 ) - { - Redistribution_SIN( iAlpha,beta, &lstTmp2X,&lstTmp2Y,&lstTmp2Z ,sizeContour2, &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); - distAcum = IntegralDistanceTwoContours( &lstTmp1X,&lstTmp1Y,&lstTmp1Z , &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); - if (distAcumsizeContour2>sizeContour3 - else { - if ( (sizeContour1>sizeContour2) && (sizeContour2sizeContour2) && (sizeContour2sizeContour3) ) // Warning for a maximum local + { + lstInconsistentContourY.push_back( lstTmp2Y[0] ); + lstInconsistentContourID.push_back( iContour+1 ); + } // if maximum local + CopyContour2InContour1( &lstTmp2aX,&lstTmp2Y,&lstTmp2Z , &lstTmp1X,&lstTmp1Y,&lstTmp1Z ); + } //if sizeContour1>sizeContour2>sizeContour3 sizeContour1 = sizeContour2; - CopyContour2InContour1( &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ , &lstTmp1X,&lstTmp1Y,&lstTmp1Z ); - } // for iContour + - - - - - // ------------ Wave 2 ----------------- - +// ------------ Wave 2 fordward to back (redistribute the litle one)----------------- ExtractContour(lstOutX,lstOutY,lstOutZ,lstIndexsOut,nbContours-1,&lstTmp1X,&lstTmp1Y,&lstTmp1Z); - sizeContour1 = SizeContour( &lstTmp1X, &lstTmp1Y, &lstTmp1Z ); - +// sizeContour1 = SizeContour( &lstTmp1X, &lstTmp1Y, &lstTmp1Z ); + sizeContour1 = lstSizeContours[ nbContours-1 ]; + // Increment - for ( iContour=nbContours-1; iContour>=0 ; iContour-- ) + for ( iContour=nbContours-1; iContour>0 ; iContour-- ) // Fordward to Back { - beta = 0; - alpha = 0; -// find Alpha ExtractContour( lstOutX,lstOutY,lstOutZ,lstIndexsOut, iContour-1 ,&lstTmp2X,&lstTmp2Y,&lstTmp2Z ); - sizeContour2 = SizeContour( &lstTmp2X, &lstTmp2Y, &lstTmp2Z ); - - - if (iContour-2<=0) +// sizeContour2 = SizeContour( &lstTmp2X, &lstTmp2Y, &lstTmp2Z ); + sizeContour2 = lstSizeContours[ iContour-1 ]; + if (iContour-2>=0) { - ExtractContour( lstOutX,lstOutY,lstOutZ,lstIndexsOut, iContour-2 ,&lstTmp3X,&lstTmp3Y,&lstTmp3Z ); - sizeContour3 = SizeContour( &lstTmp3X, &lstTmp3Y, &lstTmp3Z ); +// ExtractContour( lstOutX,lstOutY,lstOutZ,lstIndexsOut, iContour-2 ,&lstTmp3X,&lstTmp3Y,&lstTmp3Z ); +// sizeContour3 = SizeContour( &lstTmp3X, &lstTmp3Y, &lstTmp3Z ); + sizeContour3 = lstSizeContours[ iContour-2 ]; } else { sizeContour3=-1; } - - if ( (sizeContour1>sizeContour2) && (sizeContour2>sizeContour3) ){ - beta = 0.05; - alpha = 0; - minDistAcum = 999999999; - for (iAlpha=0 ; iAlpha<1; iAlpha=iAlpha+0.1 ) - { - Redistribution_SIN( iAlpha,beta, &lstTmp2X,&lstTmp2Y,&lstTmp2Z ,sizeContour2, &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); - distAcum = IntegralDistanceTwoContours( &lstTmp1X,&lstTmp1Y,&lstTmp1Z , &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); - if (distAcumsizeContour2) && (sizeContour2>sizeContour3) ) + { + findAlphaBetaSinDistribution( &lstTmp2X,&lstTmp2Y,&lstTmp2Z ,sizeContour2, &lstTmp1X,&lstTmp1Y,&lstTmp1Z, &alpha,&beta); + Redistribution_SIN( alpha,beta, &lstTmp2X,&lstTmp2Y,&lstTmp2Z ,sizeContour2, &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); + sizeContour2 = SizeContour( &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); + lstSizeContours[ iContour-1 ] = sizeContour2; + PutPointsInContour(&lstTmp2aX,&lstTmp2aY,&lstTmp2aZ, iContour-1 ,lstOutX,lstOutY,lstOutZ,lstIndexsOut); + CopyContour2InContour1( &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ , &lstTmp1X,&lstTmp1Y,&lstTmp1Z ); + } else { + if ( (sizeContour1>sizeContour2) && (sizeContour2sizeContour3) ) // Warning for a maximum local + { + lstInconsistentContourY.push_back( lstTmp2Y[0] ); + lstInconsistentContourID.push_back( iContour-1 ); + } // if Maximum local + CopyContour2InContour1( &lstTmp2X,&lstTmp2Y,&lstTmp2Z , &lstTmp1X,&lstTmp1Y,&lstTmp1Z ); } //if sizeContour1>sizeContour2>sizeContour3 -// Set Alpha y Beta - - - Redistribution_SIN( alpha,beta, &lstTmp2X,&lstTmp2Y,&lstTmp2Z ,sizeContour2, &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); - - PutPointsInContour(&lstTmp2aX,&lstTmp2aY,&lstTmp2aZ, iContour-1 ,lstOutX,lstOutY,lstOutZ,lstIndexsOut); sizeContour1 = sizeContour2; - CopyContour2InContour1( &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ , &lstTmp1X,&lstTmp1Y,&lstTmp1Z ); - } // for iContour - - - - // ------------ Wave 3 ----------------- - + +// ------------ Wave 3 redistribution for the minimun detected in Wave 1 ----------------- double alpha1,alpha2; double beta1,beta2; double iExtra,sizeExtra=lstContourExeption.size(); for ( iExtra=0 ; iExtrabeta1) { alpha = alpha2; } else { alpha = alpha1; } - beta = ( beta1 + beta2 ) / 2; - Redistribution_SIN( alpha,beta, &lstTmp2X,&lstTmp2Y,&lstTmp2Z ,sizeContour2, &lstTmp2bX,&lstTmp2bY,&lstTmp2bZ ); - PutPointsInContour(&lstTmp2bX,&lstTmp2bY,&lstTmp2bZ, lstContourExeption[iExtra] ,lstOutX,lstOutY,lstOutZ,lstIndexsOut); - -// Redistribution_SIN( alpha1,beta1, &lstTmp2X,&lstTmp2Y,&lstTmp2Z ,sizeContour2, &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); -// Redistribution_SIN( alpha2,beta2, &lstTmp2X,&lstTmp2Y,&lstTmp2Z ,sizeContour2, &lstTmp2bX,&lstTmp2bY,&lstTmp2bZ ); -// Mixing2DistributionVectors(&lstTmp2aX,&lstTmp2aY,&lstTmp2aZ,&lstTmp2bX,&lstTmp2bY,&lstTmp2bZ, &lstTmp2cX,&lstTmp2cY,&lstTmp2cZ ); -// PutPointsInContour(&lstTmp2cX,&lstTmp2cY,&lstTmp2cZ, lstContourExeption[iExtra] ,lstOutX,lstOutY,lstOutZ,lstIndexsOut); - - + beta = ( beta1 + beta2 ) / 2; + Redistribution_SIN( alpha,beta, &lstTmp2X,&lstTmp2Y,&lstTmp2Z ,sizeContour2, &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); + sizeContour2 = SizeContour( &lstTmp2aX,&lstTmp2aY,&lstTmp2aZ ); + lstSizeContours[ iContour ] = sizeContour2; + PutPointsInContour(&lstTmp2aX,&lstTmp2aY,&lstTmp2aZ, iContour ,lstOutX,lstOutY,lstOutZ,lstIndexsOut); } // for iExtra - -} - - - -void ManualContourModel_Box::Mixing2DistributionVectors( std::vector *lstAX, - std::vector *lstAY, - std::vector *lstAZ, - std::vector *lstBX, - std::vector *lstBY, - std::vector *lstBZ, - std::vector *lstOutX, - std::vector *lstOutY, - std::vector *lstOutZ) -{ - (*lstOutX).clear(); - (*lstOutY).clear(); - (*lstOutZ).clear(); - - std::vector lstTmpX; - std::vector lstTmpY; - std::vector lstTmpZ; - double dx,dy,dz; - double distA,distAT; - double distB,distBT; - int i,j,size; - int ii,sizeTmpX; - bool flagA,flagB; - distAT = 0; - distBT = 0; - i = 1; - j = 1; - size = (*lstAX).size(); - - lstTmpX.push_back( (*lstAX)[0] ); - lstTmpY.push_back( (*lstAY)[0] ); - lstTmpZ.push_back( (*lstAZ)[0] ); - lstTmpX.push_back( (*lstBX)[0] ); - lstTmpY.push_back( (*lstBY)[0] ); - lstTmpZ.push_back( (*lstBZ)[0] ); - - while ((i(distBT+distB)) - { - flagB=true; - } else { - flagA=true; - flagB=true; - } // if distAT+distA distBT+distB - - if (flagA==true) - { - lstTmpX.push_back( (*lstAX)[i] ); - lstTmpY.push_back( (*lstAY)[i] ); - lstTmpZ.push_back( (*lstAZ)[i] ); - distAT = distAT+distA; - i++; - } // if flagA - if (flagB==true) - { - lstTmpX.push_back( (*lstBX)[j] ); - lstTmpY.push_back( (*lstBY)[j] ); - lstTmpZ.push_back( (*lstBZ)[j] ); - distBT = distBT+distB; - j++; - } // if flagA - - } // while i j - - sizeTmpX = lstTmpX.size(); - for (ii=0; ii *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, @@ -1020,141 +753,6 @@ void ManualContourModel_Box::ClockwisePoints( std::vector *lstInX, } -/* -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, @@ -1171,10 +769,7 @@ void ManualContourModel_Box::ShiftValues( std::vector *lstInX, std::vector LstTmpY; std::vector LstTmpZ; if (sizeLstIndexIn>=2) - { - - - + { for (iLstIndexIn=0; iLstIndexIn *lstInX, //find min distance and iBack distMin = 10000000; iBack = 0; - // Comparing distance between two contours // Both contours need the same size for (ig=0; ig *lstInX, dz = (*lstInZ)[iGeneral+i]-(*lstInZ)[iGeneral+size+(i+ig)%size]; dist= dist + sqrt( dx*dx + dy*dy + dz*dz ); } // for i size2 - if ( dist *lstInX, LstTmpZ.push_back( (*lstInZ)[iGeneral+size+ii] ); } } // for i - //Repeat the first item at the end to close the contour LstTmpX.push_back( LstTmpX[0] ); LstTmpY.push_back( LstTmpY[0] ); LstTmpZ.push_back( LstTmpZ[0] ); - for (i=0 ; i *lstInX, } iGeneral=iGeneral+size; } // for iLstIndexIn - - } // if sizeLstIndexIn - } - - - void ManualContourModel_Box::Process() { // THE MAIN PROCESSING METHOD BODY @@ -1265,171 +845,171 @@ void ManualContourModel_Box::Process() // bbSetOutputOut( bbGetInputIn() ); // std::cout << "Output value = " < lstInX=bbGetInputLstControlPointsX(); - std::vector lstInY=bbGetInputLstControlPointsY(); - std::vector lstInZ=bbGetInputLstControlPointsZ(); - if ( (lstInX.size()!=lstInY.size()) || (lstInY.size()!=lstInZ.size()) ) - { - printf("Warnning !! .. ManualContourModel_Box: The list X Y Z, no have the same number of elements \n"); - return; - } - std::vector lstIndexsIn=bbGetInputLstIndexsIn(); - std::vector lstIndexsOut; - std::vector lstOutX; - std::vector lstOutY; - std::vector lstOutZ; - if (bbGetInputLstIndexsIn().size()==0) + if (bbGetInputActive()==true) { - 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 lstInX=bbGetInputLstControlPointsX(); + std::vector lstInY=bbGetInputLstControlPointsY(); + std::vector lstInZ=bbGetInputLstControlPointsZ(); + if ( (lstInX.size()!=lstInY.size()) || (lstInY.size()!=lstInZ.size()) ) + { + printf("Warnning !! .. ManualContourModel_Box: The list X Y Z, no have the same number of elements \n"); + return; + } + std::vector lstIndexsIn=bbGetInputLstIndexsIn(); + std::vector lstIndexsOut; + std::vector lstOutX; + std::vector lstOutY; + std::vector lstOutZ; + if (bbGetInputLstIndexsIn().size()==0) { - for (j=0;j=1) + { + if (bbGetInputParam()[0]==1) + { + RedistributionPointsAllContours_SIN( &lstOutX,&lstOutY,&lstOutZ,&lstIndexsOut); + ShiftValues( &lstOutX, &lstOutY, &lstOutZ, &lstIndexsOut ); + } // if 1 + } // if size + // Step 3.4 Transpose the vectors + lstInX.clear(); + lstInY.clear(); + lstInZ.clear(); + lstIndexsIn.clear(); + size = bbGetInputNbPoints(); + int j,size2 = lstIndexsOut.size(); + for (i=0;i); BBTK_DECLARE_OUTPUT(LstContourPointsZ,std::vector); BBTK_DECLARE_OUTPUT(LstIndexsOut,std::vector); + BBTK_DECLARE_OUTPUT(LstPssblIncnsnstntCntrY,std::vector); + BBTK_DECLARE_OUTPUT(LstPssblIncnsnstntCntrID,std::vector); + BBTK_PROCESS(Process); void Process(); @@ -78,6 +82,16 @@ void RedistributionPointsAllContours_SIN( std::vector *lstOutX, std::vector *lstOutZ, std::vector *lstIndexsOut ); +void findAlphaBetaSinDistribution( std::vector *lstTmp2X, + std::vector *lstTmp2Y, + std::vector *lstTmp2Z , + int sizeContour, + std::vector *lstTmp1X, + std::vector *lstTmp1Y, + std::vector *lstTmp1Z, + double *alpha, + double *beta); + void Redistribution_SIN( double alpha, double beta, std::vector *lstC1X, @@ -92,6 +106,13 @@ double SizeContour( std::vector *lstX, std::vector *lstY, std::vector *lstZ ); +void CalculeLstSizeContours( std::vector *lstOutX, + std::vector *lstOutY, + std::vector *lstOutZ, + std::vector *lstIndexsOut, + std::vector *lstSizeContours ); + + void ExtractContour(std::vector *lstX, std::vector *lstY, std::vector *lstZ, @@ -123,19 +144,9 @@ void CopyContour2InContour1( std::vector *lstInX, std::vector *lstOutX, std::vector *lstOutY, std::vector *lstOutZ ); - -void Mixing2DistributionVectors( std::vector *lstAX, - std::vector *lstAY, - std::vector *lstAZ, - std::vector *lstBX, - std::vector *lstBY, - std::vector *lstBZ, - std::vector *lstOutX, - std::vector *lstOutY, - std::vector *lstOutZ); - - +std::vector lstInconsistentContourY; +std::vector lstInconsistentContourID; //===== // 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) @@ -148,6 +159,7 @@ BBTK_BEGIN_DESCRIBE_BLACK_BOX(ManualContourModel_Box,bbtk::AtomicBlackBox); BBTK_DESCRIPTION("No Description."); BBTK_CATEGORY("empty"); + BBTK_INPUT(ManualContourModel_Box,Active,"(true default) Active true/false",bool,""); BBTK_INPUT(ManualContourModel_Box,Type,"(1 default) 1=spline, 2=rectangle, 3=circle, 4=bullEye, 6=Line, 7=points, 8=rotationTool, 10=polygon, 12=Spline3D",int,""); BBTK_INPUT(ManualContourModel_Box,DoubleContour,"(0 default) 0=Simple, 1=Double (This is used to construct surface, use LstIndexesIn)",int,""); BBTK_INPUT(ManualContourModel_Box,OpenClose,"(false default) false=open, true=close",bool,""); @@ -162,6 +174,10 @@ BBTK_BEGIN_DESCRIBE_BLACK_BOX(ManualContourModel_Box,bbtk::AtomicBlackBox); BBTK_OUTPUT(ManualContourModel_Box,LstContourPointsY,"List of points in the contour",std::vector,""); BBTK_OUTPUT(ManualContourModel_Box,LstContourPointsZ,"List of points in the contour",std::vector,""); BBTK_OUTPUT(ManualContourModel_Box,LstIndexsOut,"Lst number of points by segment",std::vector,""); + BBTK_OUTPUT(ManualContourModel_Box,LstPssblIncnsnstntCntrY,"Lst of possible Inconsinstent Contour Y, little contour between two big contour, Difficult for the SIN distribution (DoubleContour 1)",std::vector,""); + BBTK_OUTPUT(ManualContourModel_Box,LstPssblIncnsnstntCntrID,"Lst of possible Inconsinstent Contour ID, little contour between two big contour, Difficult for the SIN distribution (DoubleContour 1)",std::vector,""); + + BBTK_END_DESCRIBE_BLACK_BOX(ManualContourModel_Box); //=====