From 6942f5fc2370b5d428cf63b2148c0146bfd0d9ee Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 15 Apr 2026 08:54:32 +0200 Subject: [PATCH] EgtGeomKernel : - nella proiezione di curve su superfici aggiunto paramtetro bFromVsTo. --- ProjectCurveSurf.cpp | 241 ++++++++++++++++++++++++++++++------------- 1 file changed, 172 insertions(+), 69 deletions(-) diff --git a/ProjectCurveSurf.cpp b/ProjectCurveSurf.cpp index 6c189f7..e403193 100644 --- a/ProjectCurveSurf.cpp +++ b/ProjectCurveSurf.cpp @@ -393,7 +393,7 @@ typedef std::vector INTPARLINESTMPVECTOR ; //---------------------------------------------------------------------------- static bool ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const Frame3d& frRefLine, const INTPARLINESTMPVECTOR& vpIntPLSTM, - double dPar, Point5ax& Pt5ax) + double dPar, bool bFromVsTo, Point5ax& Pt5ax) { // intersezione retta di proiezione con superfici (conservo l'intersezione più alta) Point3d ptL = GetToLoc( ptP, frRefLine) ; @@ -402,23 +402,48 @@ ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const Frame for ( int i = 0 ; i < ssize( vpIntPLSTM) ; ++ i) { ILSIVECTOR vIntRes ; if ( vpIntPLSTM[i]->GetInters( ptL, 1, vIntRes, false)) { - // cerco la prima intersezione valida a partire dall'ultima (è la più alta) - int nI = ssize( vIntRes) - 1 ; - while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) - --nI ; - // se trovata - if ( nI >= 0) { - if ( nInd < 0) { - IntRes = vIntRes[nI] ; - nInd = i ; - } - else { - double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ; - double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ; - if ( dU > dUref) { + // se dalla direzione + if ( bFromVsTo) { + // cerco la prima intersezione valida a partire dall'ultima (è la più alta) + int nI = ssize( vIntRes) - 1 ; + while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) + --nI ; + // se trovata + if ( nI >= 0) { + if ( nInd < 0) { IntRes = vIntRes[nI] ; nInd = i ; } + else { + double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ; + double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ; + if ( dU > dUref) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + } + } + } + // altrimenti verso la direzione + else { + // cerco la prima intersezione valida a partire dalla prima (è la più alta) + int nI = 0 ; + while ( nI < ssize( vIntRes) && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) + ++nI ; + // se trovata + if ( nI < ssize( vIntRes)) { + if ( nInd < 0) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + else { + double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU : IntRes.dU2) ; + double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU : vIntRes[nI].dU2) ; + if ( dU < dUref) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + } } } } @@ -455,7 +480,7 @@ ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const Frame //---------------------------------------------------------------------------- bool ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const Vector3d& vtDir, - double dLinTol, double dMaxSegmLen, bool bSharpEdges, PNT5AXVECTOR& vPt5ax) + double dLinTol, double dMaxSegmLen, bool bSharpEdges, bool bFromVsTo, PNT5AXVECTOR& vPt5ax) { // sistemazioni per tipo di superficie CISRFTMPVECTOR vpSurfTm ; @@ -521,7 +546,7 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const Vect while ( bFound) { // se trovo proiezione, la salvo Point5ax Pt5ax ; - if ( ProjectPointOnSurf( ptP, vpSurfTm, frRefLine, vpIntPLSTM, dPar, Pt5ax)) + if ( ProjectPointOnSurf( ptP, vpSurfTm, frRefLine, vpIntPLSTM, dPar, bFromVsTo, Pt5ax)) vPt5ax.emplace_back( Pt5ax) ; // passo al successivo bFound = PL.GetNextUPoint( &dPar, &ptP) ; @@ -543,7 +568,8 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const Vect //---------------------------------------------------------------------------- static bool -ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const IGeoPoint3d& gpRef, double dPar, Point5ax& Pt5ax) +ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const IGeoPoint3d& gpRef, double dPar, bool bFromVsTo, + Point5ax& Pt5ax) { // punto di riferimento Point3d ptMin = gpRef.GetPoint() ; @@ -558,23 +584,48 @@ ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const IGeoP for ( int i = 0 ; i < ssize( vpStm) ; ++ i) { ILSIVECTOR vIntRes ; if ( IntersLineSurfTm( ptP, vtLine, dLineLen, *vpStm[i], vIntRes, false)) { - // cerco la prima intersezione valida a partire dall'ultima (è la più alta) - int nI = ssize( vIntRes) - 1 ; - while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) - --nI ; - // se trovata - if ( nI >= 0) { - if ( nInd < 0) { - IntRes = vIntRes[nI] ; - nInd = i ; - } - else { - double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ; - double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ; - if ( dU > dUref) { + // se dal punto + if ( bFromVsTo) { + // cerco la prima intersezione valida a partire dall'ultima (è la più alta) + int nI = ssize( vIntRes) - 1 ; + while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) + --nI ; + // se trovata + if ( nI >= 0) { + if ( nInd < 0) { IntRes = vIntRes[nI] ; nInd = i ; } + else { + double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ; + double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ; + if ( dU > dUref) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + } + } + } + // altrimenti verso il punto + else { + // cerco la prima intersezione valida a partire dalla prima (è la più alta) + int nI = 0 ; + while ( nI < ssize( vIntRes) && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) + ++nI ; + // se trovata + if ( nI < ssize( vIntRes)) { + if ( nInd < 0) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + else { + double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU : IntRes.dU2) ; + double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU : vIntRes[nI].dU2) ; + if ( dU < dUref) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + } } } } @@ -612,7 +663,7 @@ ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const IGeoP //---------------------------------------------------------------------------- bool ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const IGeoPoint3d& gpRef, - double dLinTol, double dMaxSegmLen, bool bSharpEdges, PNT5AXVECTOR& vPt5ax) + double dLinTol, double dMaxSegmLen, bool bSharpEdges, bool bFromVsTo, PNT5AXVECTOR& vPt5ax) { // sistemazioni per tipo di superficie CISRFTMPVECTOR vpSurfTm ; @@ -663,7 +714,7 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const IGeo while ( bFound) { // se trovo proiezione, la salvo Point5ax Pt5ax ; - if ( ProjectPointOnSurf( ptP, vpSurfTm, gpRef, dPar, Pt5ax)) + if ( ProjectPointOnSurf( ptP, vpSurfTm, gpRef, dPar, bFromVsTo, Pt5ax)) vPt5ax.emplace_back( Pt5ax) ; // passo al successivo bFound = PL.GetNextUPoint( &dPar, &ptP) ; @@ -681,7 +732,8 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const IGeo //---------------------------------------------------------------------------- static bool -ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const ICurve& crRef, double dPar, Point5ax& Pt5ax) +ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const ICurve& crRef, double dPar, bool bFromVsTo, + Point5ax& Pt5ax) { // punto a minima distanza DistPointCurve dPC( ptP, crRef) ; @@ -699,23 +751,48 @@ ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const ICurv for ( int i = 0 ; i < ssize( vpStm) ; ++ i) { ILSIVECTOR vIntRes ; if ( IntersLineSurfTm( ptP, vtLine, dLineLen, *vpStm[i], vIntRes, false)) { - // cerco la prima intersezione valida a partire dall'ultima (è la più alta) - int nI = ssize( vIntRes) - 1 ; - while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) - --nI ; - // se trovata - if ( nI >= 0) { - if ( nInd < 0) { - IntRes = vIntRes[nI] ; - nInd = i ; - } - else { - double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ; - double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ; - if ( dU > dUref) { + // se dalla curva + if ( bFromVsTo) { + // cerco la prima intersezione valida a partire dall'ultima (è la più alta) + int nI = ssize( vIntRes) - 1 ; + while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) + --nI ; + // se trovata + if ( nI >= 0) { + if ( nInd < 0) { IntRes = vIntRes[nI] ; nInd = i ; } + else { + double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ; + double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ; + if ( dU > dUref) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + } + } + } + // altrimenti verso la curva + else { + // cerco la prima intersezione valida a partire dalla prima (è la più alta) + int nI = 0 ; + while ( nI < ssize( vIntRes) && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) + ++nI ; + // se trovata + if ( nI < ssize( vIntRes)) { + if ( nInd < 0) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + else { + double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU : IntRes.dU2) ; + double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU : vIntRes[nI].dU2) ; + if ( dU < dUref) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + } } } } @@ -738,7 +815,7 @@ ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const ICurv // assegno valori al punto 5assi Pt5ax.ptP = ptInt ; Pt5ax.vtDir1 = vtN ; - Pt5ax.vtDir2 = vtLine ; + Pt5ax.vtDir2 = ( bFromVsTo ? vtLine : -vtLine) ; Pt5ax.vtDirU = V_NULL ; Pt5ax.vtDirV = V_NULL ; Pt5ax.dPar = dPar ; @@ -754,7 +831,7 @@ ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const ICurv //---------------------------------------------------------------------------- bool ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const ICurve& crRef, - double dLinTol, double dMaxSegmLen, bool bSharpEdges, PNT5AXVECTOR& vPt5ax) + double dLinTol, double dMaxSegmLen, bool bSharpEdges, bool bFromVsTo, PNT5AXVECTOR& vPt5ax) { // Sistemazioni per tipo di superficie CISRFTMPVECTOR vpSurfTm ; @@ -805,7 +882,7 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const ICur while ( bFound) { // se trovo proiezione, la salvo Point5ax Pt5ax ; - if ( ProjectPointOnSurf( ptP, vpSurfTm, crRef, dPar, Pt5ax)) + if ( ProjectPointOnSurf( ptP, vpSurfTm, crRef, dPar, bFromVsTo, Pt5ax)) vPt5ax.emplace_back( Pt5ax) ; // passo al successivo bFound = PL.GetNextUPoint( &dPar, &ptP) ; @@ -823,7 +900,8 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const ICur //---------------------------------------------------------------------------- static bool -ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const SurfTriMesh& stmRef, double dPar, Point5ax& Pt5ax) +ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const SurfTriMesh& stmRef, double dPar, bool bFromVsTo, + Point5ax& Pt5ax) { // punto sulla superficie guida a minima distanza DistPointSurfTm dPS( ptP, stmRef) ; @@ -850,23 +928,48 @@ ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const SurfT for ( int i = 0 ; i < ssize( vpStm) ; ++ i) { ILSIVECTOR vIntRes ; if ( IntersLineSurfTm( ptP, vtLine, dLineLen, *vpStm[i], vIntRes, false)) { - // cerco la prima intersezione valida a partire dall'ultima (è la più alta) - int nI = ssize( vIntRes) - 1 ; - while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) - --nI ; - // se trovata - if ( nI >= 0) { - if ( nInd < 0) { - IntRes = vIntRes[nI] ; - nInd = i ; - } - else { - double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ; - double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ; - if ( dU > dUref) { + // se dalla superficie + if ( bFromVsTo) { + // cerco la prima intersezione valida a partire dall'ultima (è la più alta) + int nI = ssize( vIntRes) - 1 ; + while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) + --nI ; + // se trovata + if ( nI >= 0) { + if ( nInd < 0) { IntRes = vIntRes[nI] ; nInd = i ; } + else { + double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ; + double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ; + if ( dU > dUref) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + } + } + } + // altrimenti verso la superficie + else { + // cerco la prima intersezione valida a partire dalla prima (è la più alta) + int nI = 0 ; + while ( nI < ssize( vIntRes) && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM) + ++nI ; + // se trovata + if ( nI < ssize( vIntRes)) { + if ( nInd < 0) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + else { + double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU : IntRes.dU2) ; + double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU : vIntRes[nI].dU2) ; + if ( dU < dUref) { + IntRes = vIntRes[nI] ; + nInd = i ; + } + } } } } @@ -911,7 +1014,7 @@ ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const SurfT //---------------------------------------------------------------------------- bool ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const ISurf& sfRef, - double dLinTol, double dMaxSegmLen, bool bSharpEdges, PNT5AXVECTOR& vPt5ax) + double dLinTol, double dMaxSegmLen, bool bSharpEdges, bool bFromVsTo, PNT5AXVECTOR& vPt5ax) { // sistemazioni per tipo di superficie CISRFTMPVECTOR vpSurfTm ; @@ -983,7 +1086,7 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const ISur while ( bFound) { // se trovo proiezione, la salvo Point5ax Pt5ax ; - if ( ProjectPointOnSurf( ptP, vpSurfTm, *pRefTm, dPar, Pt5ax)) + if ( ProjectPointOnSurf( ptP, vpSurfTm, *pRefTm, dPar, bFromVsTo, Pt5ax)) vPt5ax.emplace_back( Pt5ax) ; // passo al successivo bFound = PL.GetNextUPoint( &dPar, &ptP) ;