diff --git a/SurfBezier.cpp b/SurfBezier.cpp index fc92940..fd95e82 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -46,9 +46,9 @@ #define SAVEFAILEDTRIANGULATION 0 #define SAVEREBUILTISO 0 -#define SAVERULEDISO 1 +#define SAVERULEDISO 0 #define SAVERULEDGUIDEDISO 0 -#define SAVEMATCHCURVES 1 +#define SAVEMATCHCURVES 0 #if SAVEFAILEDTRIANGULATION || SAVEREBUILTISO || SAVERULEDISO || SAVERULEDGUIDEDISO || SAVEMATCHCURVES #include "/EgtDev/Include/EGkGeoObjSave.h" std::vector vGeo ; @@ -6263,23 +6263,85 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c Point3d ptU1 = vCrv[i].second ; double dParam0 ; CrvU0.GetParamAtPoint( ptU0, dParam0) ; double dParam1 ; CrvU1.GetParamAtPoint( ptU1, dParam1) ; - if ( bClosed && ( dParam0 < EPS_SMALL || nSpanU0 - dParam0 < EPS_SMALL) && + if ( bClosed) { + // curve di sync che sono esattamente sugli start/end di churve chiuse + if ( ( dParam0 < EPS_SMALL || nSpanU0 - dParam0 < EPS_SMALL) && ( dParam1 < EPS_SMALL || nSpanU1 - dParam1 < EPS_SMALL)) { - if ( ! bFirstAdded) { - dParam0 = 0 ; - dParam1 = 0 ; - bFirstAdded = true ; + if ( ! bFirstAdded) { + dParam0 = 0 ; + dParam1 = 0 ; + bFirstAdded = true ; + } + else { + dParam0 = nSpanU0 ; + dParam1 = nSpanU1 ; + } } - else { - dParam0 = nSpanU0 ; - dParam1 = nSpanU1 ; + // curve si sync che hanno solo uno dei due punti su un punto di start/end, ma NON sono a cavallo dello start + else if ( ( dParam0 < EPS_SMALL || nSpanU0 - dParam0 < EPS_SMALL)) { + if ( ( nSpanU1 - dParam1) > dParam1) + dParam0 = 0 ; + else + dParam0 = nSpanU0 ; } + else if (( dParam1 < EPS_SMALL || nSpanU1 - dParam1 < EPS_SMALL)) { + if ( ( nSpanU0 - dParam0) > dParam0) + dParam1 = 0 ; + else + dParam1 = nSpanU1 ; + } + //else if ( abs(( nSpanU0 - dParam0) / nSpanU0 - ( nSpanU1 - dParam1) / nSpanU1) > 0.1) { + // // gestisco il cambio di start se ho una sync a cavallo di start e end + // // quella sync diventa il nuovo start + + //} } vIso.emplace_back( i, dParam0, dParam1) ; } sort( vIso.begin(), vIso.end()) ; + // sposto lo start sulla prima curva di sync che trovo + if ( bClosed) { + double dNewStart0 = vIso[0].dParam0 ; + double dNewStart1 = vIso[0].dParam1 ; + CrvU0.ChangeStartPoint( dNewStart0) ; + CrvU1.ChangeStartPoint( dNewStart1) ; + vIso[0].dParam0 = 0 ; + vIso[0].dParam1 = 0 ; + double dCeil0 = ceil( dNewStart0) ; + double dFloor0 = floor( dNewStart0) ; + double dCeil1 = ceil( dNewStart1) ; + double dFloor1 = floor( dNewStart1) ; + rotate( vPnt0.begin(), vPnt0.begin() + int( dCeil0), vPnt0.end()) ; + rotate( vPnt1.begin(), vPnt1.begin() + int( dCeil1), vPnt1.end()) ; + if ( abs( dNewStart0 - round( dNewStart0)) > EPS_SMALL) { + Point3d ptNewStart ; CrvU0.GetStartPoint( ptNewStart) ; + vPnt0.insert( vPnt0.begin(), ptNewStart) ; + ++nSpanU0 ; + } + if ( abs( dNewStart1 - round( dNewStart1)) > EPS_SMALL) { + Point3d ptNewStart ; CrvU1.GetStartPoint( ptNewStart) ; + vPnt1.insert( vPnt1.begin(), ptNewStart) ; + ++nSpanU1 ; + } + for ( int i = 1 ; i < ssize( vIso) ; ++i) { + if ( vIso[i].dParam0 >= dCeil0) + vIso[i].dParam0 -= dFloor0 ; + else if ( vIso[i].dParam0 <= dFloor0) + vIso[i].dParam0 += nSpanU0 - dCeil0 ; + else + CrvU0.GetParamAtPoint( vCrv[vIso[i].nCrv].first, vIso[i].dParam0) ; + + if ( vIso[i].dParam1 >= dCeil1) + vIso[i].dParam1 -= dFloor1 ; + else if ( vIso[i].dParam1 <= dFloor1) + vIso[i].dParam1 += nSpanU1 - dCeil1 ; + else + CrvU1.GetParamAtPoint( vCrv[vIso[i].nCrv].second, vIso[i].dParam1) ; + } + } + // scorro vIso per verificare che non ci siano curve che si intersecano int c = 0 ; dLastParam0 = vIso[c].dParam0 ; @@ -6456,11 +6518,11 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c nSpanU0 = CrvU0.GetCurveCount() ; nSpanU1 = CrvU1.GetCurveCount() ; // aggiungo l'ultima coppia se necessario - if ( vPairs.back().first != nSpanU0 && vPairs.back().second != nSpanU1) + if ( vPairs.back().first != nSpanU0 || vPairs.back().second != nSpanU1) vPairs.emplace_back( nSpanU0, nSpanU1) ; // trovo il numero di span che dovrà avere la superficie - int nSpanU = int(vPairs.size()) - 1 ; + int nSpanU = int( vPairs.size()) - 1 ; int nSecondRowInd = nDegU * nSpanU + 1 ; // inizializzo la superficie