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