diff --git a/IntersCurveCurve.cpp b/IntersCurveCurve.cpp index 0b88c9e..ec3ee45 100644 --- a/IntersCurveCurve.cpp +++ b/IntersCurveCurve.cpp @@ -689,6 +689,30 @@ IntersCurveCurve::CalcCurveInOrOut( const ICurve* pCurveA, const ICurve* pCurveB iCC.GetIntCrvCrvInfo( 0, aInfo) ; if ( aInfo.IciA[0].nPrevTy == ICCT_IN) nClass = CRVC_IN ; + else if ( aInfo.IciA[0].nPrevTy == ICCT_OUT) + nClass = CRVC_OUT ; + else if ( aInfo.IciA[0].nPrevTy == ICCT_NULL) { + // se il primo punto scelto non va bene allora ne cerco uno che mi dia informazioni sull'essere interno o esterno + CurveLine clLine ; + Point3d ptNewChoice ; pCurveA->GetPointD1D2( 0.25, ICurve::FROM_MINUS, ptNewChoice) ; + if ( ! clLine.SetPDL( ptNewChoice, 0, dLen)) + return false ; + // calcolo l'intersezione + IntersCurveCurve iCC( clLine, *pCurveB) ; + if ( iCC.GetIntersCount() > 0) { + // se quanto precede la prima intersezione è interno, allora la curva è interna + IntCrvCrvInfo aInfo ; + iCC.GetIntCrvCrvInfo( 0, aInfo) ; + if ( aInfo.IciA[0].nPrevTy == ICCT_IN) + nClass = CRVC_IN ; + else if ( aInfo.IciA[0].nPrevTy == ICCT_OUT) + nClass = CRVC_OUT ; + else + return false ; // se arrivo qui potrei ritentare la ricerca + } + else + return false ; + } } // altrimenti sono esterni tra loro else { diff --git a/IntersLineLine.cpp b/IntersLineLine.cpp index c87691c..5e204d2 100644 --- a/IntersLineLine.cpp +++ b/IntersLineLine.cpp @@ -158,7 +158,27 @@ IntersLineLine::IntersFiniteLines( const CurveLine& Line1, const CurveLine& Line bool bParallel = ( abs( dCrossXY) < SIN_EPS_ANG_ZERO * ( dLen1XY * dLen2XY)) ; // flag per segmenti che si allontanano significativamente bool bFarEnds = ( nS1Side != 0 || nE1Side != 0 || nS2Side != 0 || nE2Side != 0) ; - // analisi casi speciali di quasi parallelismo + + // analisi casi speciali di quasi parallelismo + // segmento sovrapposto all'altro + double dDist1, dDist2 ; + if( nS1Side == 0 || nE1Side == 0 || nS1Side == nE1Side) { + dDist1 = CrossXY( ptS1 - ptS2, vtDir2) ; + dDist2 = CrossXY( ptE1 - ptS2, vtDir2) ; + if( abs( dDist1 - dDist2) < EPS_SMALL * dLen2XY) { + bParallel = true ; + bFarEnds = ! ( (nS1Side == 0 && nE1Side == 0) || (nS2Side == 0 && nE2Side == 0)) ; + } + } + else if( nS2Side == 0 || nE2Side == 0 || nS2Side == nE2Side) { + dDist1 = CrossXY( ptS2 - ptS1, vtDir1) ; + dDist2 = CrossXY( ptE2 - ptS1, vtDir1) ; + if( abs( dDist1 - dDist2) < EPS_SMALL * dLen1XY){ + bParallel = true ; + bFarEnds = ! ( (nS1Side == 0 && nE1Side == 0) || (nS2Side == 0 && nE2Side == 0)) ; + } + } + // estremità sovrapposte di poco if ( ! bParallel && abs( dCrossXY) < ( 0.1 * DEGTORAD) * ( dLen1XY * dLen2XY)) { if (( nS1Side == 0 && nS2Side == 0 && ! AreSamePointXYEpsilon( ptS1, ptS2, 2 * EPS_SMALL)) || ( nS1Side == 0 && nE2Side == 0 && ! AreSamePointXYEpsilon( ptS1, ptE2, 2 * EPS_SMALL)) ||