diff --git a/CurveComposite.cpp b/CurveComposite.cpp index f293018..1c7c520 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -1056,9 +1056,13 @@ CurveComposite::GetIndSCurveAndLocPar( double dU, Side nS, int& nSCrv, double& d // determino la curva di appartenenza e il valore locale (ovvero nella curva) del parametro nSCrv = static_cast( dU) ; dLocU = dU - nSCrv ; - if ( fabs( dLocU) < EPS_PARAM && nSCrv > 0 && nS == ICurve::FROM_MINUS) { + if ( fabs( dLocU) < 5 * EPS_PARAM && nSCrv > 0 && nS == ICurve::FROM_MINUS) { -- nSCrv ; - dLocU += 1 ; + dLocU = 1 ; + } + else if ( fabs( dLocU) > 1 - 5 * EPS_PARAM && nSCrv < dMaxU && nS == ICurve::FROM_PLUS) { + ++ nSCrv ; + dLocU = 0 ; } return true ; diff --git a/Simple CDSurfFrMove.cpp b/Simple CDSurfFrMove.cpp index e951b96..07b55b5 100644 --- a/Simple CDSurfFrMove.cpp +++ b/Simple CDSurfFrMove.cpp @@ -140,7 +140,7 @@ MySimpleCDSurfFrMove::Translate( const Vector3d& vtDir, double& dLen) if ( pLine1 == nullptr || pLine2 == nullptr || ! TranslateLineNoCollisionLine( pLine1, pLine2, vtDirL, dNewLenXY, scInfoCurr)) return false ; - if ( abs( dNewLenXY - dPrevLenXY) < EPS_SMALL && dNewLenXY < dLenXY - EPS_SMALL ) { + if ( abs( dNewLenXY - dPrevLenXY) < EPS_SMALL) { if ( scInfoCurr.nType == SCI_LINE_LINE || scInfoCurr.nType == SCI_PNT_LINE) { m_SCollInfo = scInfoCurr ; m_SCollInfo.nChunkM = j ; @@ -363,10 +363,12 @@ MySimpleCDSurfFrMove::TranslateLineNoCollisionLine( const CurveLine* pLine1, con } } // confronto con movimento corrente - if ( abs( dNewLen) < EPS_SMALL) + if ( dNewLen > - 5 * EPS_SMALL && dNewLen < EPS_SMALL) dLen = 0 ; - else if ( dNewLen > 0) - dLen = min( dLen, dNewLen) ; + else if ( dNewLen > 0 && dNewLen < dLen) + dLen = dNewLen ; + else // non c'è collisione, reset Info + scInfo.nType = SCI_NONE ; return true ; } @@ -460,12 +462,16 @@ MySimpleCDSurfFrMove::RotateLineNoCollisionLine( const CurveLine* pLine1, const // verifico se gli intervalli radiali si sovrappongono Vector3d vtDirS1 = ptS1 - ptCen ; + vtDirS1.z = 0 ; double dRadS1 = vtDirS1.LenXY() ; Vector3d vtDirE1 = ptE1 - ptCen ; + vtDirE1.z = 0 ; double dRadE1 = vtDirE1.LenXY() ; Vector3d vtDirS2 = ptS2 - ptCen ; + vtDirS2.z = 0 ; double dRadS2 = vtDirS2.LenXY() ; Vector3d vtDirE2 = ptE2 - ptCen ; + vtDirE2.z = 0 ; double dRadE2 = vtDirE2.LenXY() ; // ordino l'intervallo della prima linea secondo raggi crescenti