diff --git a/Trimming.cpp b/Trimming.cpp index 4e1fbb8..7777e2a 100644 --- a/Trimming.cpp +++ b/Trimming.cpp @@ -63,7 +63,7 @@ #define DEBUG_EDGES 0 #define DEBUG_SHAPE_STM 0 #define DEBUG_HOLES 0 -#define DEBUG_SMOOTH_CURVATURE 0 +#define DEBUG_SMOOTH_CURVATURE 1 #if DEBUG_BASIC_BORDERS || DEBUG_CHAIN_CURVES || DEBUG_ANG_APPROX || DEBUG_BEZIER_INTERP || \ DEBUG_FACE_SEARCH || DEBUG_FACE_SEARCH_TRIA_MODIF || DEBUG_BRK_POINTS || DEBUG_BRK_THICK || \ DEBUG_BRK || DEBUG_BORDERS_BY_NORMALS || DEBUG_SYNC_POINTS || DEBUG_SYNC_INTERPOLATION || \ @@ -5035,9 +5035,9 @@ RegolarizeBordersLocally( const ISurfBezier* pSurfBz, const BIPOINT& bpIsoStart, } PtrOwner pCrvOrig1( pCrv1->CopyParamRange( dParS1, dParS2)) ; PtrOwner pCrvOrig2( pCrv2->CopyParamRange( dParS1, dParS2)) ; - Vector3d vtTang1 ; pCrvOrig1->GetStartDir( vtTang1) ; - Frame3d frStart ; frStart.Set( ptS1, vtTang1, vtDir1) ; // uso la tangente e l'isocurva in V per il frame iniziale - RotationMinimizingFrame rmf ; rmf.Set( pCrvOrig1, frStart) ; + //Vector3d vtTang1 ; pCrvOrig1->GetStartDir( vtTang1) ; + //Frame3d frStart ; frStart.Set( ptS1, vtTang1, vtDir1) ; // uso la tangente e l'isocurva in V per il frame iniziale + //RotationMinimizingFrame rmf ; rmf.Set( pCrvOrig1, frStart) ; // scorro le isocurve a partire dallo start e dell'end della zona indicata // controllo il twist rispetto alla isocurva precedente @@ -5058,49 +5058,83 @@ RegolarizeBordersLocally( const ISurfBezier* pSurfBz, const BIPOINT& bpIsoStart, // scorro le isocurve di separazione tra patch for ( int i = nUS1 + 3 ; i < nUS2 ; i +=3) { // recupero precedente e successivo - Point3d ptThird1Curr = pSurfBz->GetControlPoint( i - 1, 0, &bOk) ; - Point3d ptThird2Curr = pSurfBz->GetControlPoint( i - 1, 1, &bOk) ; + Point3d ptThird1Prev = pSurfBz->GetControlPoint( i - 1, 0, &bOk) ; + Point3d ptThird2Prev = pSurfBz->GetControlPoint( i - 1, 1, &bOk) ; Point3d ptSecond1Next = pSurfBz->GetControlPoint( i + 1, 0, &bOk) ; Point3d ptSecond2Next = pSurfBz->GetControlPoint( i + 1, 1, &bOk) ; // recupero corrente e verifico la torsione - Point3d ptCurrS = pSurfBz->GetControlPoint( i, 0, &bOk) ; - Point3d ptCurrE = pSurfBz->GetControlPoint( i, 1, &bOk) ; - Vector3d vtIsoCurr = ptCurrE - ptCurrS ; + Point3d ptCurr1 = pSurfBz->GetControlPoint( i, 0, &bOk) ; + Point3d ptCurr2 = pSurfBz->GetControlPoint( i, 1, &bOk) ; + Vector3d vtIsoCurr = ptCurr2 - ptCurr1 ; double dDist = vtIsoCurr.Len() ; vtIsoCurr.Normalize() ; Vector3d vtDirPrev = vtIsoPrev ^ vtNPrev ; Vector3d vtCurrInPlane = OrthoCompo( vtIsoCurr, vtDirPrev) ; bool bDet = false ; double dAng = 0 ; vtIsoPrev.GetRotation( vtCurrInPlane, vtDirPrev, dAng, bDet) ; + double dSinAngTol = sin( 5 * DEGTORAD) ; + Vector3d vtPrev1 = ptCurr1 - ptThird1Prev ; vtPrev1.Normalize() ; + Vector3d vtNext1 = ptSecond1Next - ptCurr1 ; vtNext1.Normalize() ; + bool bAngularPoint1 = ! AreSameVectorEpsilon( vtPrev1, vtNext1, dSinAngTol) ; + Vector3d vtPrev2 = ptCurr2 - ptThird2Prev ; vtPrev2.Normalize() ; + Vector3d vtNext2 = ptSecond2Next - ptCurr2 ; vtNext2.Normalize() ; + bool bAngularPoint2 = ! AreSameVectorEpsilon( vtPrev2, vtNext2, dSinAngTol) ; if ( abs( dAng) > 0) { // se l'isocurva di separazione dalla patch successiva è torta rispetto alla precedente // allora prendo il penultimo punto della curva corrente, l'ultimo e il secondo della prossima e li sposto lungo la normale della superficie dDist *= dAng * DEGTORAD / 2 ; - ptThird1Curr += vtNPrev * dDist ; - ptCurrS += vtNPrev * dDist ; - ptSecond1Next += vtNPrev * dDist ; - ptThird2Curr -= vtNPrev * dDist ; - ptCurrE -= vtNPrev * dDist ; - ptSecond2Next -= vtNPrev * dDist ; + if ( ! bAngularPoint1) { + // se non ho un punto angoloso muovo tutto il terzetto insieme + ptThird1Prev += vtNPrev * dDist ; + ptSecond1Next += vtNPrev * dDist ; + ptCurr1 += vtNPrev * dDist ; + } + else { + // altrimenti sposto solo il punto corrente verso la congiungente tra il precedente e il successivo + DistPointLine dpl( ptCurr1, ptThird1Prev, ptSecond1Next, true) ; + Point3d ptMinDist ; dpl.GetMinDistPoint( ptMinDist) ; + Vector3d vtCorrDir = ptMinDist - ptCurr1 ; vtCorrDir.Normalize() ; + double dProjDir = vtNPrev * vtCorrDir ; + if ( dProjDir < 0) + LOG_ERROR( GetEGkLogger(), "Error : regolarizing crv0 near an angular point") ; + double dDistCorr = min( dDist, Dist( ptMinDist, ptCurr1)) ; + ptCurr1 += vtCorrDir * dDistCorr ; + } + if ( ! bAngularPoint2) { + ptThird2Prev -= vtNPrev * dDist ; + ptSecond2Next -= vtNPrev * dDist ; + ptCurr2 -= vtNPrev * dDist ; + } + else { + // altrimenti sposto solo il punto corrente verso la congiungente tra il precedente e il successivo + DistPointLine dpl( ptCurr2, ptThird2Prev, ptSecond2Next, true) ; + Point3d ptMinDist ; dpl.GetMinDistPoint( ptMinDist) ; + Vector3d vtCorrDir = ptMinDist - ptCurr2 ; vtCorrDir.Normalize() ; + double dProjDir = vtNPrev * vtCorrDir ; + if ( dProjDir < 0) + LOG_ERROR( GetEGkLogger(), "Error : regolarizing crv1 near an angular point") ; + double dDistCorr = min( dDist, Dist( ptMinDist, ptCurr2)) ; + ptCurr2 -= vtCorrDir * dDistCorr ; + } } - vPnt0.push_back( ptThird1Curr) ; - vPnt0.push_back( ptCurrS) ; + vPnt0.push_back( ptThird1Prev) ; + vPnt0.push_back( ptCurr1) ; vPnt0.push_back( ptSecond1Next) ; - vPnt1.push_back( ptThird2Curr) ; - vPnt1.push_back( ptCurrE) ; + vPnt1.push_back( ptThird2Prev) ; + vPnt1.push_back( ptCurr2) ; vPnt1.push_back( ptSecond2Next) ; - vtIsoPrev = ptCurrE - ptCurrS ; vtIsoPrev.Normalize() ; - vtNPrev = ( ptSecond1Next - ptCurrS) ^ vtIsoPrev ; vtNPrev.Normalize() ; + vtIsoPrev = ptCurr2 - ptCurr1 ; vtIsoPrev.Normalize() ; + vtNPrev = ( ptSecond1Next - ptCurr1) ^ vtIsoPrev ; vtNPrev.Normalize() ; } // aggiungo gli ultimi due punti - Point3d ptThird1Curr = pSurfBz->GetControlPoint( nUS2 - 1, 0, &bOk) ; - vPnt0.push_back( ptThird1Curr) ; + Point3d ptThird1Prev = pSurfBz->GetControlPoint( nUS2 - 1, 0, &bOk) ; + vPnt0.push_back( ptThird1Prev) ; Point3d ptFourth1Curr = pSurfBz->GetControlPoint( nUS2, 0, &bOk) ; vPnt0.push_back( ptFourth1Curr) ; - Point3d ptThird2Curr = pSurfBz->GetControlPoint( nUS2 - 1, 1, &bOk) ; - vPnt1.push_back( ptThird2Curr) ; + Point3d ptThird2Prev = pSurfBz->GetControlPoint( nUS2 - 1, 1, &bOk) ; + vPnt1.push_back( ptThird2Prev) ; Point3d ptFourth2Curr = pSurfBz->GetControlPoint( nUS2, 1, &bOk) ; vPnt1.push_back( ptFourth2Curr) ; @@ -5162,15 +5196,15 @@ RegolarizeBordersLocally( const ISurfBezier* pSurfBz, const BIPOINT& bpIsoStart, // controllo di essere rimasto in tolleranza double dErr = 0 ; CalcApproxError( pCrvOrig1, pCC1, dErr, 20) ; - //if ( dErr > dTol) - // return nullptr ; + if ( dErr > dTol) + return nullptr ; CalcApproxError( pCrvOrig2, pCC2, dErr, 20) ; - //if ( dErr > dTol) - // return nullptr ; + if ( dErr > dTol) + return nullptr ; - // controllo di non aver creato dei cambi di concavità - // se ne trovo allora ruoto i terzetti attorno alla nuova isocurva - ////////////////// DA IMPLEMENTARE (prendendo dalla versione precedente della Regolarize) + //// controllo di non aver creato dei cambi di concavità + //// se ne trovo allora ruoto i terzetti attorno alla nuova isocurva + //////////////////// DA IMPLEMENTARE (prendendo dalla versione precedente della Regolarize) PtrOwner pNewSurf( pSurfBz->Clone()) ; // aggiorno i punti di controllo della superficie di bezier @@ -5178,11 +5212,11 @@ RegolarizeBordersLocally( const ISurfBezier* pSurfBz, const BIPOINT& bpIsoStart, pNewSurf->SetControlPoint( nUS1 + i, 0, vPnt0[i]) ; pNewSurf->SetControlPoint( nUS1 + i, 1, vPnt1[i]) ; } - #if DEBUG_SMOOTH_CURVATURE - VT.push_back( Release(pCC1)) ; - VT.push_back( Release(pCC2)) ; - SaveGeoObj( VT, "C:\\Temp\\bezier\\ruled\\smoothness\\regolarized.nge") ; - #endif + //#if DEBUG_SMOOTH_CURVATURE + // VT.push_back( Release(pCC1)) ; + // VT.push_back( Release(pCC2)) ; + // SaveGeoObj( VT, "C:\\Temp\\bezier\\ruled\\smoothness\\regolarized.nge") ; + //#endif return Release( pNewSurf) ; }