diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 089ec0e..eabbce0 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -3875,7 +3875,7 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int if ( ( plU1.IsClosed() && plU1.GetPointNbr() < 3) || plU1.GetPointNbr() < 2) return false ; - // determino il numero di span che avrà lòa superficie basandomi sulla curva con più sottocurve + // determino il numero di span che avrà la superficie basandomi sulla curva con più sottocurve int nSpanU = max( nSpanU0, nSpanU1) ; // punti per curva int nLastPoint = nDegU + 1 ; @@ -3886,8 +3886,6 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int // se sto usando la ISOPARM o la MINDIST semplice allora collego più span di una curva allo stesso punto // ( aggiungo virtualmente delle span alla curva che localmente ne ha di meno, semplicemente riprendo più volte lo stesso punto) if ( nRuledType != RLT_B_MINDIST_PLUS){ - // inizializzo la superficie - Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ; if ( nRuledType == RLT_B_MINDIST) { // creo le liste di punti per le isoparametriche in U PNTIVECTOR vPnt0Match, vPnt1Match ; @@ -3904,8 +3902,11 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int if ( nIndMatch != nIndMatchNext) nRep0 += nIndMatchNext - nIndMatch - 1; } + int nRep1 = int( vPnt1Match.size() - 1) - vPnt0Match.back().second ; // reinizializzo la superficie con il nuovo numero di span in U - nSpanU = nSpanU0 + nRep0 ; + nSpanU = nSpanU0 + nRep0 + nRep1 ; + if ( nSpanU < max(nSpanU0, nSpanU1)) + nSpanU = max(nSpanU0, nSpanU1) ; nSecondRowInd = nDegU * nSpanU + 1 ; Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ; @@ -3942,7 +3943,6 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int } else { // ripeto l'ultimo punto aggiunto per il numero di curve balzate della seconda curva - 1 - // aggiungo una sottocurva dalla prima curva for( int k = 0 ; k < nIndMatchNext - nIndMatch - 1 ; ++k) { pSubCrv0 = GetCurveBezier( pCrvU0->GetCurve( i != 0 ? i - 1 : i)) ; for ( int j = nCount0 == 0 ? 0 : 1 ; j < nLastPoint ; ++j) { @@ -3979,6 +3979,40 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int } } + //controllo se ho aggiunto tutti i punti della seconda curva + if ( vPnt0Match.back().second != nSpanU1) { + // riaggiungo l'ultimo punto + const ICurveBezier* pSubCrv0 = GetCurveBezier( pCrvU0->GetCurve( nSpanU0 - 1)) ; + int nPoint = nDegU ; + while( nCount0 - 1 < nSpanU1) { + for ( int j = 1 ; j < nLastPoint ; ++j) { + if ( ! bRat0) + SetControlPoint( nCount0 * nDegU + j, pSubCrv0->GetControlPoint( nPoint)) ; + else + SetControlPoint( nCount0 * nDegU + j, pSubCrv0->GetControlPoint( nPoint), pSubCrv0->GetControlWeight( nPoint)) ; + } + ++ nCount0 ; + } + + // aggiungo le restanti sottocurve della curva 2 + int nCrv1 = vPnt0Match.back().second ; + while( nCrv1 < nSpanU1) { + const ICurveBezier* pSubCrv1 = GetCurveBezier( pCrvU1->GetCurve( nCrv1)) ; + for ( int j = 1 ; j < nLastPoint ; ++j) { + if ( ! bRat1) + SetControlPoint( nSecondRowInd + nCount1 * nDegU + j, pSubCrv1->GetControlPoint( j)) ; + else + SetControlPoint( nSecondRowInd + nCount1 * nDegU + j, pSubCrv1->GetControlPoint( j), pSubCrv1->GetControlWeight( j)) ; + } + ++ nCount1 ; + ++ nCrv1 ; + } + } + + + + + ////////////////// ORA SI PUò CANCELLARE //// // QUESTO PEZZO E' DA SISTEMARE //// controllo di aver aggiunto anche gli ultimi punti //int nInd = nIndMatchNext < nSpanU0 ? nIndMatchNext : nIndMatchNext - 1 ; @@ -4043,6 +4077,8 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int } if ( nRuledType == RLT_B_ISOPAR) { + // inizializzo la superficie + Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ; Point3d ptP0Start ; pCrvU0->GetStartPoint( ptP0Start) ; Point3d ptP1Start ; pCrvU1->GetStartPoint( ptP1Start) ; // setto i primi due punti delle righe @@ -4167,6 +4203,8 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int int nAtStart1 = 0 ; int nAtEnd1 = 0 ; Point3d ptP0 ; plU0.GetFirstPoint( ptP0) ; + int c = 0 ; // debug + int nCrvCount = 0 ; while ( plU0.GetNextPoint( ptP0, true)) { // devo salvarmi se matcho più punti con lo start o l'end della curva totale DistPointCurve dpc( ptP0, *pCrvU1, false) ; @@ -4181,13 +4219,18 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int continue ; } Point3d ptJoint ; dpc.GetMinDistPoint( 0, ptJoint, nFlag) ; // devo verificare se ho già un punto di start/end nelle vicinanze + nCrvCount = pCrvU1->GetCurveCount() ; //debug pCrvU1->AddJoint( dParam) ; + if( nCrvCount == pCrvU1->GetCurveCount())//debug + int a = 0 ; //debug nSpanU1 = pCrvU1->GetCurveCount() ; // devo aggiungere un controllo in modo che i parametri trovati siano sempre crescenti + ++c ;// debug } int nAtStart0 = 0 ; int nAtEnd0 = 0 ; Point3d ptP1 ; plU1.GetFirstPoint( ptP1) ; + c = 0 ;// debug while ( plU1.GetNextPoint( ptP1, true)) { DistPointCurve dpc( ptP1, *pCrvU0, false) ; int nFlag = 0 ; @@ -4201,16 +4244,24 @@ SurfBezier::CreateByTwoCurves( const ICurve* pCurve0, const ICurve* pCurve1, int continue ; } Point3d ptJoint ; dpc.GetMinDistPoint( 0, ptJoint, nFlag) ; // devo verificare se ho già un punto di start/end nelle vicinanze + nCrvCount = pCrvU0->GetCurveCount() ; // debug pCrvU0->AddJoint( dParam) ; + if( nCrvCount == pCrvU0->GetCurveCount()) + int a = 0 ; nSpanU0 = pCrvU0->GetCurveCount() ; + ++c ;// debug } nSpanU = max( nSpanU0, nSpanU1) ; - // se la differenza tra il numero di span delle due curve non è colmata dalla ripetizione dello start o dello'end allora devo tenere conto anche - // delle addJoint che non hanno fatto nulla ( perché chieste di splittare la curva troppo vicino ad un punto già esistente di split, magari in un caso anche di multimatch per lo stesso punto) - if ( (nSpanU0 > nSpanU1 && nSpanU0 != nSpanU1 + nAtStart1 + nAtEnd1) || - (nSpanU0 < nSpanU1 && nSpanU1 != nSpanU0 + nAtStart0 + nAtEnd0)) - return false ; + + // questo controllo SERVE??? è da cambiare per tenere dentro anche il caso di mismatch?? + //// se la differenza tra il numero di span delle due curve non è colmata dalla ripetizione dello start o dell'end allora devo tenere conto anche + //// delle addJoint che non hanno fatto nulla ( perché chieste di splittare la curva troppo vicino ad un punto già esistente di split, magari in un caso anche di multimatch per lo stesso punto) + //if ( (nSpanU0 > nSpanU1 && nSpanU0 != nSpanU1 + nAtStart1 + nAtEnd1) || + // (nSpanU0 < nSpanU1 && nSpanU1 != nSpanU0 + nAtStart0 + nAtEnd0)) + // return false ; + + nSecondRowInd = nDegU * nSpanU + 1 ; // inizializzo la superficie Init( nDegU, nDegV, nSpanU, nSpanV, bRat) ;