diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj index 8c884bb..6277db6 100644 --- a/EgtGeomKernel.vcxproj +++ b/EgtGeomKernel.vcxproj @@ -309,14 +309,25 @@ copy $(TargetPath) \EgtProg\Dll64 + + false + false + false + false + + + + + + diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters index c24cae1..75fe444 100644 --- a/EgtGeomKernel.vcxproj.filters +++ b/EgtGeomKernel.vcxproj.filters @@ -43,15 +43,18 @@ {f07670fd-9429-4b7e-ac6d-1c0022e756fb} - - {865b76ee-b10d-41fc-861c-b48ce52fa277} - {d96752da-1884-4a73-ba1b-5b20b606e469} {4c6a9dc5-8fac-4ecd-bde6-3e37e056712e} + + {ae52e402-3063-45e3-b9f7-1710035a1f56} + + + {865b76ee-b10d-41fc-861c-b48ce52fa277} + @@ -372,17 +375,8 @@ File di origine\GeoInters - - File di origine\GeoCollision - - - File di origine\GeoCollision - - File di origine\GeoCollision - - - File di origine\GeoCollision + File di origine\GeoCollisionDetection File di origine\GeoInters @@ -400,19 +394,19 @@ File di origine\Geo - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection File di origine\Geo @@ -430,34 +424,34 @@ File di origine\GeoDist - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection - File di origine\GeoCollision + File di origine\GeoCollisionDetection File di origine\Geo @@ -469,7 +463,7 @@ File di origine\Base - File di origine\GeoCollision + File di origine\GeoCollisionDetection File di origine\GeoCreate @@ -510,6 +504,24 @@ File di origine\GeoElevation + + File di origine\GeoInters + + + File di origine\GeoCollisionAvoid + + + File di origine\GeoCollisionAvoid + + + File di origine\GeoCollisionAvoid + + + File di origine\GeoInters + + + File di origine\GeoInters + @@ -1169,6 +1181,15 @@ File di intestazione + + File di intestazione\Include + + + File di intestazione\Include + + + File di intestazione\Include + diff --git a/IntersCurveSurfTm.cpp b/IntersCurveSurfTm.cpp new file mode 100644 index 0000000..0c564c2 --- /dev/null +++ b/IntersCurveSurfTm.cpp @@ -0,0 +1,223 @@ +//---------------------------------------------------------------------------- +// EgalTech 2024-2024 +//---------------------------------------------------------------------------- +// File : IntersCurveSurfTm.cpp Data : 23.02.24 Versione : 2.6b4 +// Contenuto : Implementazione della intersezione curva/superficie trimesh. +// +// +// +// Modifiche : 23.02.24 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "GeoConst.h" +#include "/EgtDev/Include/EGkIntersLineTria.h" +#include "/EgtDev/Include/EGkIntersCurveSurfTm.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +static void +UpdateInfoIntersCurveSurfTm( const Point3d& ptL, const Vector3d& vtDir, double dLen, double dUs, double dUe, + int nT, const Triangle3d& Tria, ICSIVECTOR& vInfo) +{ + Point3d ptInt, ptInt2 ; + int nRes = IntersLineTria( ptL, vtDir, dLen, Tria, ptInt, ptInt2, true) ; + if ( nRes == ILTT_IN || nRes == ILTT_EDGE || nRes == ILTT_VERT) { + double dU = dUs + ( ptInt - ptL) * vtDir / dLen * ( dUe - dUs) ; + double dCosDN = vtDir * Tria.GetN() ; + vInfo.emplace_back( nRes, dU, nT, dCosDN, ptInt) ; + } + else if ( nRes == ILTT_SEGM || nRes == ILTT_SEGM_ON_EDGE) { + double dU = dUs + ( ptInt - ptL) * vtDir / dLen * ( dUe - dUs) ; + double dU2 = dUs + ( ptInt2 - ptL) * vtDir / dLen * ( dUe - dUs) ; + double dCosDN = vtDir * Tria.GetN() ; + vInfo.emplace_back( nRes, dU, dU2, nT, dCosDN, ptInt, ptInt2) ; + } +} + +//---------------------------------------------------------------------------- +static void +OrderInfoIntersCurveSurfTm( ICSIVECTOR& vInfo) +{ + // se non trovati, esco + if ( vInfo.size() == 0) + return ; + // ordino il vettore delle intersezioni secondo il senso crescente del parametro di linea + sort( vInfo.begin(), vInfo.end(), + []( const IntCrvStmInfo& a, const IntCrvStmInfo& b) + { double dUa = ( ( a.nILTT == ILTT_SEGM || a.nILTT == ILTT_SEGM_ON_EDGE) ? ( a.dU + a.dU2) / 2 : a.dU) ; + double dUb = ( ( b.nILTT == ILTT_SEGM || b.nILTT == ILTT_SEGM_ON_EDGE) ? ( b.dU + b.dU2) / 2 : b.dU) ; + return ( dUa < dUb) ; }) ; +} + +//---------------------------------------------------------------------------- +// Intersezione di una curva con una superficie TriMesh +//---------------------------------------------------------------------------- +bool +IntersCurveSurfTm( const ICurve& Curve, const ISurfTriMesh& Stm, double dLinTol, ICSIVECTOR& vInfo) +{ + // verifico i parametri ricevuti + if ( & Curve == nullptr || &Stm == nullptr || &vInfo == nullptr) + return false ; + dLinTol = max( dLinTol, EPS_SMALL) ; + vInfo.clear() ; + + // approssimo la curva con una spezzata + PolyLine PL ; + if ( ! Curve.ApproxWithLines( dLinTol, ANG_TOL_APPROX_DEG, ICurve::APL_SPECIAL, PL)) + return false ; + + // per ogni segmento dell'approssimante cerco l'intersezione con la superficie + double dParS, dParE ; + Point3d ptStart, ptEnd ; + bool bFound = PL.GetFirstULine( &dParS, &ptStart, &dParE, &ptEnd) ; + while ( bFound) { + Vector3d vtDir = ptEnd - ptStart ; + double dLen = vtDir.Len() ; + if ( dLen > EPS_SMALL) { + vtDir /= dLen ; + // cerco i triangoli intersecati dal segmento + const double BOX_STEP = 10 ; + int nStep = int( ceil( dLen / BOX_STEP)) ; + Vector3d vtStep = dLen / nStep * vtDir ; + INTVECTOR vPrevT ; + for ( int i = 0 ; i < nStep ; ++ i) { + BBox3d b3Box( ptStart + i * vtStep, ptStart + ( i + 1) * vtStep) ; + INTVECTOR vT ; + if ( Stm.GetAllTriaOverlapBox( b3Box, vT)) { + for ( auto nT : vT) { + // se triangolo non ancora intersecato + if ( find( vPrevT.begin(), vPrevT.end(), nT) == vPrevT.end()) { + vPrevT.emplace_back( nT) ; + Triangle3d Tria ; + Stm.GetTriangle( nT, Tria) ; + // aggiorno info con intersezione + UpdateInfoIntersCurveSurfTm( ptStart, vtDir, dLen, dParS, dParE, nT, Tria, vInfo) ; + } + } + } + } + } + // passo al segmento successivo + bFound = PL.GetNextULine( &dParS, &ptStart, &dParE, &ptEnd) ; + } + + // ordino il vettore delle eventuali intersezioni secondo il senso crescente del parametro di linea + OrderInfoIntersCurveSurfTm( vInfo) ; + + return true ; +} +//---------------------------------------------------------------------------- +bool +IntersCurveSurfTmExt( const ICurve& Curve, const ISurfTriMesh& Stm, double dLinTol, INTDBLVECTOR& vInters) +{ + ICSIVECTOR vInfo ; + vInters.clear() ; + return ( IntersCurveSurfTm( Curve, Stm, dLinTol, vInfo) && FilterCurveSurfTmInters( Curve, vInfo, vInters)) ; +} + +//---------------------------------------------------------------------------- +bool +FilterCurveSurfTmInters( const ICurve& Curve, const ICSIVECTOR& vInfo, INTDBLVECTOR& vInters) +{ + // verifico i parametri ricevuti + if ( & Curve == nullptr || &vInfo == nullptr || &vInters == nullptr) + return false ; + vInters.clear() ; + // info sulla curva + bool bClosedCrv = Curve.IsClosed() ; + double dParSCrv, dParECrv ; + Curve.GetDomain( dParSCrv, dParECrv) ; + // ciclo sulle intersezioni + for ( const auto& Info : vInfo) { + // se intersezione puntuale + if ( Info.nILTT == ILTT_VERT || Info.nILTT == ILTT_EDGE || Info.nILTT == ILTT_IN) { + int nFlag = CSIT_NONE ; + if ( Info.dCosDN > EPS_ZERO) + nFlag = CSIT_IN_OUT ; + else if ( Info.dCosDN < -EPS_ZERO) + nFlag = CSIT_OUT_IN ; + vInters.emplace_back( nFlag, Info.dU) ; + } + // se altrimenti intersezione con coincidenza + else if ( Info.nILTT == ILTT_SEGM || Info.nILTT == ILTT_SEGM_ON_EDGE) { + vInters.emplace_back( CSIT_IN_ON, Info.dU) ; + vInters.emplace_back( CSIT_ON_IN, Info.dU2) ; + } + } + // elimino intersezioni ripetute + int nStart = ( bClosedCrv ? 0 : 1) ; + for ( int j = nStart ; j < int( vInters.size()) ; ) { + // intersezione precedente + int i = ( j > 0 ? j - 1 : int( vInters.size()) - 1) ; + // se hanno lo stesso parametro + if ( abs( vInters[i].second - vInters[j].second) < EPS_PARAM || + ( bClosedCrv && abs( vInters[i].second - dParECrv) < EPS_PARAM && abs( vInters[j].second - dParSCrv) < EPS_PARAM)) { + // flag per eseguita cancellazione + bool bSomeErased = false ; + // se sono entrambe entranti o uscenti, elimino la seconda + if ( ( vInters[i].first == CSIT_OUT_IN && vInters[j].first == CSIT_OUT_IN) || + ( vInters[i].first == CSIT_IN_OUT && vInters[j].first == CSIT_IN_OUT)) { + vInters.erase( vInters.begin() + j) ; + bSomeErased = true ; + } + // se una entrante e l'altra uscente, cambio in touch da fuori ed elimino la seconda + else if ( vInters[i].first == CSIT_OUT_IN && vInters[j].first == CSIT_IN_OUT) { + vInters[i].first = CSIT_OUT_OUT ; + vInters.erase( vInters.begin() + j) ; + bSomeErased = true ; + } + // se una uscente e l'altra entrante, cambio in touch da dentro ed elimino la seconda + else if ( vInters[i].first == CSIT_IN_OUT && vInters[j].first == CSIT_OUT_IN) { + vInters[i].first = CSIT_IN_IN ; + vInters.erase( vInters.begin() + j) ; + bSomeErased = true ; + } + // se una touch da fuori o da dentro e l'altra entrante o uscente, elimino la prima + else if ( ( vInters[i].first == CSIT_OUT_OUT || vInters[i].first == CSIT_IN_IN) && + ( vInters[j].first == CSIT_OUT_IN || vInters[j].first == CSIT_IN_OUT)) { + vInters.erase( vInters.begin() + i) ; + bSomeErased = true ; + } + // se una entrante o uscente e l'altra touch da fuori o da dentro, elimino la seconda + else if ( ( vInters[i].first == CSIT_OUT_IN || vInters[i].first == CSIT_IN_OUT) && + ( vInters[j].first == CSIT_OUT_OUT || vInters[j].first == CSIT_IN_IN)) { + vInters.erase( vInters.begin() + j) ; + bSomeErased = true ; + } + // se una puntuale e l'altra inizio di coincidenza, elimino la prima + else if ( ( vInters[i].first == CSIT_OUT_IN || vInters[i].first == CSIT_IN_OUT || vInters[i].first == CSIT_NONE) && + ( vInters[j].first == CSIT_IN_ON || vInters[j].first == CSIT_OUT_ON)) { + vInters[j].first = ( vInters[i].first == CSIT_IN_OUT ? CSIT_IN_ON : CSIT_OUT_ON) ; + vInters.erase( vInters.begin() + i) ; + bSomeErased = true ; + } + // se una fine di coincidenza e l'altra puntuale, elimino la seconda + else if ( ( vInters[i].first == CSIT_ON_IN || vInters[i].first == CSIT_ON_OUT) && + ( vInters[j].first == CSIT_OUT_IN || vInters[j].first == CSIT_IN_OUT || vInters[j].first == CSIT_NONE)) { + vInters[i].first = ( vInters[j].first == CSIT_IN_OUT ? CSIT_ON_OUT : CSIT_ON_IN) ; + vInters.erase( vInters.begin() + j) ; + bSomeErased = true ; + } + // se una fine di coincidenza e l'altra inizio di coincidenza, elimino entrambe + else if ( ( vInters[i].first == CSIT_ON_IN || vInters[i].first == CSIT_ON_OUT) && + ( vInters[j].first == CSIT_IN_ON || vInters[j].first == CSIT_OUT_ON)) { + vInters.erase( vInters.begin() + j) ; + vInters.erase( vInters.begin() + ( j > 0 ? i : i - 1)) ; + bSomeErased = true ; + } + if ( bSomeErased) { + if ( j > 0) + -- j ; + continue ; + } + } + // passo alla successiva + ++ j ; + } + return true ; +} diff --git a/IntersLineBox.cpp b/IntersLineBox.cpp index e3c30f7..552f9a6 100644 --- a/IntersLineBox.cpp +++ b/IntersLineBox.cpp @@ -22,7 +22,7 @@ using namespace std ; //---------------------------------------------------------------------------- // Linea e box allineato assi devono essere nel medesimo sistema di riferimento. -// In caso di intersezione viene restituito true e i parametri in dU1 e dU2. +// In caso di intersezione viene restituito true e i parametri lunghezza in dU1 e dU2. //---------------------------------------------------------------------------- bool IntersLineBox( const Point3d& ptL, const Vector3d& vtL, diff --git a/IntersLineBox.h b/IntersLineBox.h index 1d0af21..de145fd 100644 --- a/IntersLineBox.h +++ b/IntersLineBox.h @@ -17,7 +17,7 @@ //---------------------------------------------------------------------------- // Linea e box allineato agli assi sono nel medesimo riferimento. -// Con intersezione viene restituito true e i parametri in dU1 e dU2. +// Con intersezione viene restituito true e i parametri lunghezza in dU1 e dU2. //---------------------------------------------------------------------------- bool IntersLineBox( const Point3d& ptL, const Vector3d& vtL, diff --git a/IntersLineSurfTm.cpp b/IntersLineSurfTm.cpp index 959071a..5a0aa42 100644 --- a/IntersLineSurfTm.cpp +++ b/IntersLineSurfTm.cpp @@ -21,7 +21,7 @@ using namespace std ; //---------------------------------------------------------------------------- -void +static void UpdateInfoIntersLineSurfTm( const Point3d& ptL, const Vector3d& vtDir, double dLen, int nT, const Triangle3d& Tria, ILSIVECTOR& vInfo, bool bFinite) { @@ -41,7 +41,7 @@ UpdateInfoIntersLineSurfTm( const Point3d& ptL, const Vector3d& vtDir, double dL } //---------------------------------------------------------------------------- -void +static void OrderInfoIntersLineSurfTm( ILSIVECTOR& vInfo) { // se non trovati, esco @@ -81,7 +81,7 @@ IntersLineSurfTm( const Point3d& ptL, const Vector3d& vtL, double dLen, const IS // lo ingrandisco per non avere problemi con faccia piana su piani canonici b3Stm.Expand( 10 * EPS_SMALL) ; double dU1, dU2 ; - if ( ! IntersLineBox( ptL, vtL, b3Stm.GetMin() , b3Stm.GetMax(), dU1, dU2)) + if ( ! IntersLineBox( ptL, vtDir, b3Stm.GetMin() , b3Stm.GetMax(), dU1, dU2)) return true ; if ( bFinite) { dU1 = max( dU1, 0.) ; @@ -89,12 +89,12 @@ IntersLineSurfTm( const Point3d& ptL, const Vector3d& vtL, double dLen, const IS if ( dU2 - dU1 < EPS_SMALL) return true ; } - Point3d ptStart = ptL + dU1 * vtL ; + Point3d ptStart = ptL + dU1 * vtDir ; double dLenEff = dU2 - dU1 ; // cerco i triangoli intersecati dalla linea const double BOX_STEP = 10 ; int nStep = int( ceil( dLenEff / BOX_STEP)) ; - Vector3d vtStep = dLenEff / nStep * vtL ; + Vector3d vtStep = dLenEff / nStep * vtDir ; INTVECTOR vPrevT ; for ( int i = 0 ; i < nStep ; ++ i) { BBox3d b3Box( ptStart + i * vtStep, ptStart + ( i + 1) * vtStep) ; @@ -189,3 +189,68 @@ IntersParLinesSurfTm::GetInters( const Point3d& ptL, double dLen, ILSIVECTOR& vI return true ; } + +//---------------------------------------------------------------------------- +bool +FilterLineSurfTmInters( const ILSIVECTOR& vInfo, INTDBLVECTOR& vInters) +{ + // ciclo sulle intersezioni + for ( const auto& Info : vInfo) { + // se intersezione puntuale + if ( Info.nILTT == ILTT_VERT || Info.nILTT == ILTT_EDGE || Info.nILTT == ILTT_IN) { + int nFlag = LST_TOUCH ; + if ( Info.dCosDN > EPS_ZERO) + nFlag = LST_OUT ; + else if ( Info.dCosDN < -EPS_ZERO) + nFlag = LST_IN ; + vInters.emplace_back( nFlag, Info.dU) ; + } + // se altrimenti intersezione con coincidenza + else if ( Info.nILTT == ILTT_SEGM || Info.nILTT == ILTT_SEGM_ON_EDGE) { + vInters.emplace_back( LST_TG_INI, Info.dU) ; + vInters.emplace_back( LST_TG_FIN, Info.dU2) ; + } + } + // elimino intersezioni ripetute + for ( size_t j = 1 ; j < vInters.size() ; ) { + // intersezione precedente + size_t i = j - 1 ; + // se hanno lo stesso parametro + if ( abs( vInters[i].second - vInters[j].second) < EPS_SMALL) { + // se sono entrambe entranti o uscenti, elimino la seconda + if ( ( vInters[i].first == LST_IN && vInters[j].first == LST_IN) || + ( vInters[i].first == LST_OUT && vInters[j].first == LST_OUT)) { + vInters.erase( vInters.begin() + j) ; + continue ; + } + // se una entrante e l'altra uscente, cambio in touch ed elimino la seconda + else if ( ( vInters[i].first == LST_IN && vInters[j].first == LST_OUT) || + ( vInters[i].first == LST_OUT && vInters[j].first == LST_IN)) { + vInters[i].first = LST_TOUCH ; + vInters.erase( vInters.begin() + j) ; + continue ; + } + // se una puntuale e l'altra inizio di coincidenza, elimino la prima + else if ( ( vInters[i].first == LST_IN || vInters[i].first == LST_OUT || vInters[i].first == LST_TOUCH) && vInters[j].first == LST_TG_INI) { + vInters.erase( vInters.begin() + i) ; + continue ; + } + // se una fine di coincidenza e l'altra puntuale, elimino la seconda + else if ( vInters[i].first == LST_TG_FIN && ( vInters[j].first == LST_IN || vInters[j].first == LST_OUT || vInters[j].first == LST_TOUCH)) { + vInters.erase( vInters.begin() + j) ; + continue ; + } + // se una fine di coincidenza e l'altra inizio di coincidenza, elimino entrambe + else if ( i > 0 && vInters[i].first == LST_TG_FIN && vInters[j].first == LST_TG_INI) { + vInters.erase( vInters.begin() + j) ; + vInters.erase( vInters.begin() + i) ; + -- j ; + continue ; + } + } + // passo alla successiva + ++ j ; + } + + return true ; +} diff --git a/IntersLineVolZmap.cpp b/IntersLineVolZmap.cpp new file mode 100644 index 0000000..39e7139 --- /dev/null +++ b/IntersLineVolZmap.cpp @@ -0,0 +1,106 @@ +//---------------------------------------------------------------------------- +// EgalTech 2024-2024 +//---------------------------------------------------------------------------- +// File : IntersLineVolZmap.cpp Data : 22.02.24 Versione : 2.6b4 +// Contenuto : Implementazione della intersezione linea/VolZmap. +// +// +// +// Modifiche : 22.02.24 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "VolZmap.h" +#include "/EgtDev/Include/EGkIntersLineVolZmap.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +// Intersezione di una linea con la superficie di un solido VolZmap +//---------------------------------------------------------------------------- +bool +IntersLineVolZmap( const Point3d& ptL, const Vector3d& vtL, const IVolZmap& Vzm, ILZIVECTOR& vInfo) +{ + // verifico linea + Vector3d vtDir = vtL ; + if ( ! vtDir.Normalize( EPS_ZERO)) + return false ; + // verifico volume + const VolZmap* pVzm = GetBasicVolZmap( &Vzm) ; + if ( pVzm == nullptr) + return false ; + // verifico parametro di ritorno + if ( &vInfo == nullptr) + return false ; + + // eseguo intersezione + return pVzm->GetLineIntersection( ptL, vtL, vInfo) ; +} + +//---------------------------------------------------------------------------- +bool +FilterLineVolZmapInters( const ILZIVECTOR& vInfo, INTDBLVECTOR& vInters) +{ + // ciclo sulle intersezioni + for ( const auto& Info : vInfo) { + // se intersezione puntuale + if ( Info.nILTT == ILTT_VERT || Info.nILTT == ILTT_EDGE || Info.nILTT == ILTT_IN) { + int nFlag = LZT_TOUCH ; + if ( Info.dCosDN > EPS_ZERO) + nFlag = LZT_OUT ; + else if ( Info.dCosDN < -EPS_ZERO) + nFlag = LZT_IN ; + vInters.emplace_back( nFlag, Info.dU) ; + } + // se altrimenti intersezione con coincidenza + else if ( Info.nILTT == ILTT_SEGM || Info.nILTT == ILTT_SEGM_ON_EDGE) { + vInters.emplace_back( LZT_TG_INI, Info.dU) ; + vInters.emplace_back( LZT_TG_FIN, Info.dU2) ; + } + } + // elimino intersezioni ripetute + for ( size_t j = 1 ; j < vInters.size() ; ) { + // intersezione precedente + size_t i = j - 1 ; + // se hanno lo stesso parametro + if ( abs( vInters[i].second - vInters[j].second) < EPS_SMALL) { + // se sono entrambe entranti o uscenti, elimino la seconda + if ( ( vInters[i].first == LZT_IN && vInters[j].first == LZT_IN) || + ( vInters[i].first == LZT_OUT && vInters[j].first == LZT_OUT)) { + vInters.erase( vInters.begin() + j) ; + continue ; + } + // se una entrante e l'altra uscente, cambio in touch ed elimino la seconda + else if ( ( vInters[i].first == LZT_IN && vInters[j].first == LZT_OUT) || + ( vInters[i].first == LZT_OUT && vInters[j].first == LZT_IN)) { + vInters[i].first = LZT_TOUCH ; + vInters.erase( vInters.begin() + j) ; + continue ; + } + // se una puntuale e l'altra inizio di coincidenza, elimino la prima + else if ( ( vInters[i].first == LZT_IN || vInters[i].first == LZT_OUT || vInters[i].first == LZT_TOUCH) && vInters[j].first == LZT_TG_INI) { + vInters.erase( vInters.begin() + i) ; + continue ; + } + // se una fine di coincidenza e l'altra puntuale, elimino la seconda + else if ( vInters[i].first == LZT_TG_FIN && ( vInters[j].first == LZT_IN || vInters[j].first == LZT_OUT || vInters[j].first == LZT_TOUCH)) { + vInters.erase( vInters.begin() + j) ; + continue ; + } + // se una fine di coincidenza e l'altra inizio di coincidenza, elimino entrambe + else if ( i > 0 && vInters[i].first == LZT_TG_FIN && vInters[j].first == LZT_TG_INI) { + vInters.erase( vInters.begin() + j) ; + vInters.erase( vInters.begin() + i) ; + -- j ; + continue ; + } + } + // passo alla successiva + ++ j ; + } + + return true ; +} diff --git a/IntersPlaneVolZmap.cpp b/IntersPlaneVolZmap.cpp new file mode 100644 index 0000000..9f6e0a2 --- /dev/null +++ b/IntersPlaneVolZmap.cpp @@ -0,0 +1,37 @@ +//---------------------------------------------------------------------------- +// EgalTech 2024-2024 +//---------------------------------------------------------------------------- +// File : IntersPlaneVolZmap.cpp Data : 22.02.24 Versione : 2.6b4 +// Contenuto : Implementazione della intersezione piano/VolZmap. +// +// +// +// Modifiche : 22.02.24 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "VolZmap.h" +#include "/EgtDev/Include/EGkIntersPlaneVolZmap.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +// Intersezione di unpiano con la superficie di un solido VolZmap +//---------------------------------------------------------------------------- +bool +IntersPlaneVolZmap( const Plane3d& plPlane, const IVolZmap& Vzm, ICURVEPOVECTOR& vpLoop) +{ + // verifico volume + const VolZmap* pVzm = GetBasicVolZmap( &Vzm) ; + if ( pVzm == nullptr) + return false ; + // verifico parametro di ritorno + if ( &vpLoop == nullptr) + return false ; + + // eseguo intersezione + return pVzm->GetPlaneIntersection( plPlane, vpLoop) ; +} diff --git a/VolZmap.h b/VolZmap.h index fa0f843..40cfeb9 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -17,12 +17,15 @@ #include "GeoObjRW.h" #include "Tool.h" #include "/EgtDev/Include/EGkVolZmap.h" -#include "/EgtDev/Include/EGkIntersLineSurfTm.h" +#include "/EgtDev/Include/EGkIntersLineVolZmap.h" #include #include #include #include +// ------------------------- FORWARD ------------------------------------------------------------- +class IntersParLinesSurfTm ; + // ------------------------- STRUTTURE ----------------------------------------------------------- struct AppliedVector { Point3d ptPApp ; @@ -112,8 +115,6 @@ class VolZmap : public IVolZmap, public IGeoObjRW const Point3d& ptPs, const Vector3d& vtDs, const Vector3d& vtAs, const Point3d& ptPe, const Vector3d& vtDe, const Vector3d& vtAe) override ; bool GetDepth( const Point3d& ptP, const Vector3d& vtD, double& dInLength, double& dOutLength, bool bExact) const override ; - bool GetLineIntersection( const Point3d& ptP, const Vector3d& vtD, ILZIVECTOR& vIntersInfo) const override ; - bool GetPlaneIntersection( const Plane3d& plPlane, ICURVEPOVECTOR& vpLoop) const override ; bool CDeBox( const Frame3d& frBox, const Vector3d& vtDiag, double dSafeDist, bool bPrecise = false) const override ; bool CDeSphere( const Point3d& ptCenter, double dRad, double dSafeDist, bool bPrecise = false) const override ; bool CDeCylinder( const Frame3d& frCyl, double dR, double dH, double dSafeDist, bool bPrecise = false) const override ; @@ -149,6 +150,8 @@ class VolZmap : public IVolZmap, public IGeoObjRW { if ( ! CopyFrom( stSrc)) LOG_ERROR( GetEGkLogger(), "VolZmap : copy error") return *this ; } + bool GetLineIntersection( const Point3d& ptP, const Vector3d& vtD, ILZIVECTOR& vIntersInfo) const ; + bool GetPlaneIntersection( const Plane3d& plPlane, ICURVEPOVECTOR& vpLoop) const ; private : enum CubeType { VOX_EXTERN = 1, diff --git a/VolZmapCalculus.cpp b/VolZmapCalculus.cpp index 4a7caf4..4786ba9 100644 --- a/VolZmapCalculus.cpp +++ b/VolZmapCalculus.cpp @@ -2912,8 +2912,9 @@ VolZmap::GetLineIntersection( const Point3d& ptP, const Vector3d& vtD, ILZIVECTO else if ( nIntType == ILTT_VERT || nIntType == ILTT_EDGE || nIntType == ILTT_IN) { int nNumVox ; GetVoxNFromIJK( nCurVoxIJK[0], nCurVoxIJK[1], nCurVoxIJK[2], nNumVox) ; + double dCosDN = vtDir * trTria.GetN() ; vIntersInfo.emplace_back( nIntType, ( ptLineTria1 - ptP) * vtDir, - nNumVox, nB, ptLineTria1, trTria) ; + nNumVox, nB, trTria, dCosDN, ptLineTria1) ; } // altrimenti ci sono due intersezioni else { @@ -2921,8 +2922,9 @@ VolZmap::GetLineIntersection( const Point3d& ptP, const Vector3d& vtD, ILZIVECTO GetVoxNFromIJK( nCurVoxIJK[0], nCurVoxIJK[1], nCurVoxIJK[2], nNumVox) ; double dP1 = ( ptLineTria1 - ptP) * vtDir ; double dP2 = ( ptLineTria2 - ptP) * vtDir ; + double dCosDN = vtDir * trTria.GetN() ; vIntersInfo.emplace_back( nIntType, ( dP1 < dP2 ? dP1 : dP2), ( dP1 < dP2 ? dP2 : dP1), - nNumVox, nB, ptLineTria1, ptLineTria2, trTria) ; + nNumVox, nB, trTria, dCosDN, ptLineTria1, ptLineTria2) ; } } } @@ -2948,8 +2950,9 @@ VolZmap::GetLineIntersection( const Point3d& ptP, const Vector3d& vtD, ILZIVECTO else if ( nIntType == ILTT_VERT || nIntType == ILTT_EDGE || nIntType == ILTT_IN) { int nNumVox ; GetVoxNFromIJK( nCurVoxIJK[0], nCurVoxIJK[1], nCurVoxIJK[2], nNumVox) ; + double dCosDN = vtDir * trTria.GetN() ; vIntersInfo.emplace_back( nIntType, ( ptLineTria1 - ptP) * vtDir, - nNumVox, nB, ptLineTria1, trTria) ; + nNumVox, nB, trTria, dCosDN, ptLineTria1) ; } // altrimenti ci sono due intersezioni else { @@ -2957,8 +2960,9 @@ VolZmap::GetLineIntersection( const Point3d& ptP, const Vector3d& vtD, ILZIVECTO GetVoxNFromIJK( nCurVoxIJK[0], nCurVoxIJK[1], nCurVoxIJK[2], nNumVox) ; double dP1 = ( ptLineTria1 - ptP) * vtDir ; double dP2 = ( ptLineTria2 - ptP) * vtDir ; + double dCosDN = vtDir * trTria.GetN() ; vIntersInfo.emplace_back( nIntType, ( dP1 < dP2 ? dP1 : dP2), ( dP1 < dP2 ? dP2 : dP1), - nNumVox, nB, ptLineTria1, ptLineTria2, trTria) ; + nNumVox, nB, trTria, dCosDN, ptLineTria1, ptLineTria2) ; } } } @@ -2974,15 +2978,17 @@ VolZmap::GetLineIntersection( const Point3d& ptP, const Vector3d& vtD, ILZIVECTO continue ; // se altrimenti c'è una sola intersezione else if ( nIntType == ILTT_VERT || nIntType == ILTT_EDGE || nIntType == ILTT_IN) { + double dCosDN = vtDir * trTria.GetN() ; vIntersInfo.emplace_back( nIntType, ( ptLineTria1 - ptP) * vtDir, - -1, nB, ptLineTria1, trTria) ; + -1, nB, trTria, dCosDN, ptLineTria1) ; } // altrimenti ci sono due intersezioni else { double dP1 = ( ptLineTria1 - ptP) * vtDir ; double dP2 = ( ptLineTria2 - ptP) * vtDir ; + double dCosDN = vtDir * trTria.GetN() ; vIntersInfo.emplace_back( nIntType, ( dP1 < dP2 ? dP1 : dP2), ( dP1 < dP2 ? dP2 : dP1), - -1, nB, ptLineTria1, ptLineTria2, trTria) ; + -1, nB, trTria, dCosDN, ptLineTria1, ptLineTria2) ; } } } @@ -3007,8 +3013,9 @@ VolZmap::GetLineIntersection( const Point3d& ptP, const Vector3d& vtD, ILZIVECTO else if ( nIntType == ILTT_VERT || nIntType == ILTT_EDGE || nIntType == ILTT_IN) { int nNumVox ; GetVoxNFromIJK( nCurVoxIJK[0], nCurVoxIJK[1], nCurVoxIJK[2], nNumVox) ; + double dCosDN = vtDir * trTria.GetN() ; vIntersInfo.emplace_back( nIntType, ( ptLineTria1 - ptP) * vtDir, - nNumVox, nB, ptLineTria1, trTria) ; + nNumVox, nB, trTria, dCosDN, ptLineTria1) ; } // altrimenti ci sono due intersezioni else { @@ -3016,8 +3023,9 @@ VolZmap::GetLineIntersection( const Point3d& ptP, const Vector3d& vtD, ILZIVECTO GetVoxNFromIJK( nCurVoxIJK[0], nCurVoxIJK[1], nCurVoxIJK[2], nNumVox) ; double dP1 = ( ptLineTria1 - ptP) * vtDir ; double dP2 = ( ptLineTria2 - ptP) * vtDir ; + double dCosDN = vtDir * trTria.GetN() ; vIntersInfo.emplace_back( nIntType, ( dP1 < dP2 ? dP1 : dP2), ( dP1 < dP2 ? dP2 : dP1), - nNumVox, nB, ptLineTria1, ptLineTria2, trTria) ; + nNumVox, nB, trTria, dCosDN, ptLineTria1, ptLineTria2) ; } } } diff --git a/VolZmapCreation.cpp b/VolZmapCreation.cpp index 681bf34..a0b4a5b 100644 --- a/VolZmapCreation.cpp +++ b/VolZmapCreation.cpp @@ -17,6 +17,7 @@ #include "CurveLine.h" #include "VolZmap.h" #include "GeoConst.h" +#include "/EgtDev/Include/EGkIntersLineSurfTm.h" #include "/EgtDev/Include/EgtNumUtils.h" #include