diff --git a/CDeBoxClosedSurfTm.cpp b/CDeBoxClosedSurfTm.cpp
new file mode 100644
index 0000000..a550cc6
--- /dev/null
+++ b/CDeBoxClosedSurfTm.cpp
@@ -0,0 +1,49 @@
+//----------------------------------------------------------------------------
+// EgalTech 2016-2020
+//----------------------------------------------------------------------------
+// File : CDBoxSurfTm.cpp Data : 09.01.20 Versione : 2.2a2
+// Contenuto : Implementazione della verifica di collisione tra
+// BoundingBox e Closed SurftriMesh.
+//
+//
+// Modifiche : 05.10.16 DS Creazione modulo.
+// 09.01.20 DS Cambio nome alla funzione.
+//
+//----------------------------------------------------------------------------
+
+//--------------------------- Include ----------------------------------------
+#include "stdafx.h"
+#include "/EgtDev/Include/EGkCDeBoxTria.h"
+#include "/EgtDev/Include/EGkCDeBoxClosedSurfTm.h"
+
+using namespace std ;
+
+//----------------------------------------------------------------------------
+bool
+CDeBoxClosedSurfTm( const Frame3d& frBox, const Vector3d& vtDiag, double dSafeDist, const ISurfTriMesh& Stm)
+{
+ // verifico che la trimesh sia effettivamente un poliedro
+ if ( ! Stm.IsClosed())
+ return false ;
+ // recupero BBox del poliedro
+ BBox3d b3Poly = Stm.GetAllTriaBox() ;
+ // calcolo il BBox del parallelepipedo
+ BBox3d b3Box( ORIG, ORIG + vtDiag) ;
+ b3Box.Expand( dSafeDist) ;
+ b3Box.ToGlob( frBox) ;
+ // confronto i due Box
+ if ( ! b3Box.Overlaps( b3Poly))
+ return false ;
+ // recupero i triangoli che interferiscono con il box
+ INTVECTOR vT ;
+ Stm.GetAllTriaOverlapBox( b3Box, vT) ;
+ for ( int nT : vT) {
+ Triangle3d Tria ;
+ if ( Stm.GetTriangle( nT, Tria)) {
+ if ( CDeBoxTria( frBox, vtDiag, dSafeDist, Tria))
+ return true ;
+ }
+ }
+ return false ;
+
+}
diff --git a/CDeBoxPolyhedron.cpp b/CDeBoxPolyhedron.cpp
deleted file mode 100644
index f6a4c5d..0000000
--- a/CDeBoxPolyhedron.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-//----------------------------------------------------------------------------
-// EgalTech 2016-2016
-//----------------------------------------------------------------------------
-// File : CDBoxPolyhedron.cpp Data : 05.10.16 Versione : 1.6v1
-// Contenuto : Implementazione della verifica di collisione tra
-// BoundingBox e Polyhedron.
-//
-//
-// Modifiche : 05.10.16 DS Creazione modulo.
-//
-//
-//----------------------------------------------------------------------------
-
-//--------------------------- Include ----------------------------------------
-#include "stdafx.h"
-#include "/EgtDev/Include/EGkCDeBoxTria.h"
-#include "/EgtDev/Include/EGkCDeBoxPolyhedron.h"
-
-using namespace std ;
-
-//----------------------------------------------------------------------------
-bool
-CDeBoxPolyhedron( const BBox3d& b3Box, const ISurfTriMesh& Stm)
-{
- // verifico che la trimesh sia effettivamente un poliedro
- if ( ! Stm.IsClosed())
- return false ;
- // recupero BBox del poliedro
- BBox3d b3Poly ;
- if ( ! Stm.GetLocalBBox( b3Poly))
- return false ;
- // confronto i due Box
- if ( ! b3Box.Overlaps( b3Poly))
- return false ;
- // confronto il Box con tutti i triangoli
- Triangle3d Tria ;
- int nId = Stm.GetFirstTriangle( Tria) ;
- while ( nId != SVT_NULL) {
- if ( CDeBoxTria( b3Box, Tria))
- return true ;
- nId = Stm.GetNextTriangle( nId, Tria) ;
- }
- return false ;
-}
diff --git a/CDeBoxTria.cpp b/CDeBoxTria.cpp
index f146e2a..8107edb 100644
--- a/CDeBoxTria.cpp
+++ b/CDeBoxTria.cpp
@@ -90,10 +90,18 @@ CDeBoxPlane( const BBox3d& Box, const Plane3d& Plane)
//----------------------------------------------------------------------------
bool
-CDeBoxTria( const BBox3d& b3Box, const Triangle3d& trTria)
+CDeBoxTria( const Frame3d& frBox, const Vector3d& vtDiag, double dSafeDist, const Triangle3d& trTria)
{
// vedi Ericson, Real-Time Collision Detection, pag. 172 + Akenine-Moller
+ // Porto il triangolo nel riferimento del box
+ Triangle3d trTriaL = trTria ;
+ trTriaL.ToLoc( frBox) ;
+
+ // Calcolo il box come tale
+ BBox3d b3Box( ORIG, ORIG + vtDiag) ;
+ b3Box.Expand( dSafeDist) ;
+
// Compute box center and extents
Point3d ptCen ;
Vector3d vtExt ;
@@ -101,9 +109,9 @@ CDeBoxTria( const BBox3d& b3Box, const Triangle3d& trTria)
return false ;
// Translate triangle as conceptually moving AABB to origin
- Point3d ptV0 = trTria.GetP( 0) - ( ptCen - ORIG) ;
- Point3d ptV1 = trTria.GetP( 1) - ( ptCen - ORIG) ;
- Point3d ptV2 = trTria.GetP( 2) - ( ptCen - ORIG) ;
+ Point3d ptV0 = trTriaL.GetP( 0) - ( ptCen - ORIG) ;
+ Point3d ptV1 = trTriaL.GetP( 1) - ( ptCen - ORIG) ;
+ Point3d ptV2 = trTriaL.GetP( 2) - ( ptCen - ORIG) ;
// Compute edge vectors for triangle
Vector3d vtE0 = ptV1 - ptV0 ;
@@ -148,6 +156,6 @@ CDeBoxTria( const BBox3d& b3Box, const Triangle3d& trTria)
// Test separating axis corresponding to triangle face normal (category 2)
Plane3d Plane ;
- Plane.Set( trTria.GetP( 0), trTria.GetN()) ;
+ Plane.Set( trTriaL.GetP( 0), trTriaL.GetN()) ;
return CDeBoxPlane( b3Box, Plane) ;
}
diff --git a/CDeCylClosedSurfTm.cpp b/CDeCylClosedSurfTm.cpp
new file mode 100644
index 0000000..b9e6ca8
--- /dev/null
+++ b/CDeCylClosedSurfTm.cpp
@@ -0,0 +1,48 @@
+//----------------------------------------------------------------------------
+// EgalTech 2020-2020
+//----------------------------------------------------------------------------
+// File : CDCylSurfTm.cpp Data : 09.01.20 Versione : 2.2a2
+// Contenuto : Implementazione della verifica di collisione tra
+// Cylinder e Closed SurftriMesh.
+//
+//
+// Modifiche : 09.01.20 DS Creazione modulo.
+//
+//
+//----------------------------------------------------------------------------
+
+//--------------------------- Include ----------------------------------------
+#include "stdafx.h"
+#include "/EgtDev/Include/EGkCDeCylTria.h"
+#include "/EgtDev/Include/EGkCDeCylClosedSurfTm.h"
+
+using namespace std ;
+
+//----------------------------------------------------------------------------
+bool
+CDeCylClosedSurfTm( const Frame3d& frCyl, double dH, double dR, double dSafeDist, const ISurfTriMesh& Stm)
+{
+ // verifico che la trimesh sia effettivamente chiusa (un poliedro)
+ if ( ! Stm.IsClosed())
+ return false ;
+ // recupero BBox del poliedro
+ BBox3d b3Poly = Stm.GetAllTriaBox() ;
+ // calcolo il BBox del cilindro
+ BBox3d b3Cyl( ORIG, dR, dR, dH) ;
+ b3Cyl.Expand( dSafeDist) ;
+ b3Cyl.ToGlob( frCyl) ;
+ // confronto i due Box
+ if ( ! b3Cyl.Overlaps( b3Poly))
+ return false ;
+ // recupero i triangoli che interferiscono con il box del Cilindro
+ INTVECTOR vT ;
+ Stm.GetAllTriaOverlapBox( b3Cyl, vT) ;
+ for ( int nT : vT) {
+ Triangle3d Tria ;
+ if ( Stm.GetTriangle( nT, Tria)) {
+ if ( CDeCylTria( frCyl, dH, dR, dSafeDist, Tria))
+ return true ;
+ }
+ }
+ return false ;
+}
diff --git a/CDeCylTria.cpp b/CDeCylTria.cpp
new file mode 100644
index 0000000..5849c43
--- /dev/null
+++ b/CDeCylTria.cpp
@@ -0,0 +1,66 @@
+//----------------------------------------------------------------------------
+// EgalTech 2020-2020
+//----------------------------------------------------------------------------
+// File : CDeCylTria.cpp Data : 08.01.20 Versione : 2.2a2
+// Contenuto : Implementazione della verifica di collisione tra
+// Cylinder e Triangle3d.
+//
+//
+// Modifiche :08.01.20 DS Creazione modulo.
+//
+//
+//----------------------------------------------------------------------------
+
+//--------------------------- Include ----------------------------------------
+#include "stdafx.h"
+#include "DistPointLine.h"
+#include "/EgtDev/Include/EGkCDeCylTria.h"
+#include "/EgtDev/Include/EGkPolygon3d.h"
+
+using namespace std ;
+
+//----------------------------------------------------------------------------
+bool
+CDeCylTria( const Frame3d& frCyl, double dH, double dR, double dSafeDist, const Triangle3d& trTria)
+{
+ // Costruisco il poligono equivalente
+ Polygon3d plyTria ;
+ if ( ! plyTria.FromTriangle( trTria))
+ return false ;
+ // Lo porto nel riferimento del cilindro
+ plyTria.ToLoc( frCyl) ;
+ // Lo taglio come il cilindro (ingrossato della sicurezza)
+ Plane3d plTrimB ;
+ plTrimB.Set( dSafeDist, -Z_AX) ;
+ plyTria.Trim( plTrimB, true, false) ;
+ Plane3d plTrimT ;
+ plTrimT.Set( dH + dSafeDist, Z_AX) ;
+ plyTria.Trim( plTrimB, true, false) ;
+ // Se non è rimasto alcunchè, allora non c'è collisione
+ if ( plyTria.GetSideCount() == 0)
+ return false ;
+ // Proietto il poligono sul piano XY
+ plyTria.Scale( GLOB_FRM, 1, 1, 0) ;
+ // Verifico che sia orientato verso l'alto
+ if ( plyTria.GetVersN().z < - EPS_SMALL)
+ plyTria.Invert() ;
+ // Determino la distanza con segno dei lati del poligono dall'origine del piano
+ const PNTVECTOR& vVert = plyTria.GetVertices() ;
+ for ( int i = 0 ; i < int( vVert.size()) ; ++ i) {
+ int j = ( i + 1) % vVert.size() ;
+ DistPointLine dstPL( ORIG, vVert[i], vVert[j]) ;
+ double dDist ;
+ if ( dstPL.GetDist( dDist)) {
+ // se distanza minore del raggio, allora collide
+ if ( dDist < dR + dSafeDist)
+ return true ;
+ Point3d ptMinDist ;
+ dstPL.GetMinDistPoint( ptMinDist) ;
+ // se sta a destra del raggio, allora non collide
+ if ( CrossXY( ( ORIG - ptMinDist), ( vVert[j] - vVert[i])) > 0)
+ return false ;
+ }
+ }
+
+ return false ;
+}
diff --git a/CDeSpheClosedSurfTm.cpp b/CDeSpheClosedSurfTm.cpp
new file mode 100644
index 0000000..815d5e9
--- /dev/null
+++ b/CDeSpheClosedSurfTm.cpp
@@ -0,0 +1,47 @@
+//----------------------------------------------------------------------------
+// EgalTech 2020-2020
+//----------------------------------------------------------------------------
+// File : CDCylSurfTm.cpp Data : 09.01.20 Versione : 2.2a2
+// Contenuto : Implementazione della verifica di collisione tra
+// Sphere e Closed SurftriMesh.
+//
+//
+// Modifiche : 09.01.20 DS Creazione modulo.
+//
+//
+//----------------------------------------------------------------------------
+
+//--------------------------- Include ----------------------------------------
+#include "stdafx.h"
+#include "/EgtDev/Include/EGkCDeSpheTria.h"
+#include "/EgtDev/Include/EGkCDeSpheClosedSurfTm.h"
+
+using namespace std ;
+
+//----------------------------------------------------------------------------
+bool
+CDeSpheClosedSurfTm( const Point3d& ptCen, double dR, double dSafeDist, const ISurfTriMesh& Stm)
+{
+ // verifico che la trimesh sia effettivamente chiusa (un poliedro)
+ if ( ! Stm.IsClosed())
+ return false ;
+ // recupero BBox del poliedro
+ BBox3d b3Poly = Stm.GetAllTriaBox() ;
+ // calcolo il BBox della sfera
+ BBox3d b3Sphe( ptCen, dR) ;
+ b3Sphe.Expand( dSafeDist) ;
+ // confronto i due Box
+ if ( ! b3Sphe.Overlaps( b3Poly))
+ return false ;
+ // recupero i triangoli che interferiscono con il box della Sfera
+ INTVECTOR vT ;
+ Stm.GetAllTriaOverlapBox( b3Sphe, vT) ;
+ for ( int nT : vT) {
+ Triangle3d Tria ;
+ if ( Stm.GetTriangle( nT, Tria)) {
+ if ( CDeSpheTria( ptCen, dR, dSafeDist, Tria))
+ return true ;
+ }
+ }
+ return false ;
+}
diff --git a/CDeSpheTria.cpp b/CDeSpheTria.cpp
new file mode 100644
index 0000000..f7f2cde
--- /dev/null
+++ b/CDeSpheTria.cpp
@@ -0,0 +1,30 @@
+//----------------------------------------------------------------------------
+// EgalTech 2020-2020
+//----------------------------------------------------------------------------
+// File : CDeSpheTria.cpp Data : 09.01.20 Versione : 2.2a2
+// Contenuto : Implementazione della verifica di collisione tra
+// Sphere e Triangle3d.
+//
+//
+// Modifiche :09.01.20 DS Creazione modulo.
+//
+//
+//----------------------------------------------------------------------------
+
+//--------------------------- Include ----------------------------------------
+#include "stdafx.h"
+#include "/EgtDev/Include/EGkCDeSpheTria.h"
+#include "/EgtDev/Include/EGkDistPointTria.h"
+
+using namespace std ;
+
+//----------------------------------------------------------------------------
+bool
+CDeSpheTria( const Point3d& ptCen, double dR, double dSafeDist, const Triangle3d& trTria)
+{
+ // Determino la minima distanza tra centro della sfera e triangolo
+ double dDist ;
+ if ( ! DistPointTriangle( ptCen, trTria).GetDist( dDist))
+ return false ;
+ return ( dDist < dR + dSafeDist) ;
+}
diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj
index d5e8537..3e71516 100644
--- a/EgtGeomKernel.vcxproj
+++ b/EgtGeomKernel.vcxproj
@@ -270,8 +270,12 @@ copy $(TargetPath) \EgtProg\Dll64
-
+
+
+
+
+
@@ -392,13 +396,17 @@ copy $(TargetPath) \EgtProg\Dll64
-
+
-
+
+
+
+
+
@@ -416,6 +424,7 @@ copy $(TargetPath) \EgtProg\Dll64
+
diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters
index 2b8bb21..63c70d3 100644
--- a/EgtGeomKernel.vcxproj.filters
+++ b/EgtGeomKernel.vcxproj.filters
@@ -375,9 +375,6 @@
File di origine\GeoCollision
-
- File di origine\GeoCollision
-
File di origine\GeoCollision
@@ -399,6 +396,21 @@
File di origine\Geo
+
+ File di origine\GeoCollision
+
+
+ File di origine\GeoCollision
+
+
+ File di origine\GeoCollision
+
+
+ File di origine\GeoCollision
+
+
+ File di origine\GeoCollision
+
@@ -737,9 +749,6 @@
File di intestazione\Include
-
- File di intestazione\Include
-
File di intestazione\Include
@@ -872,9 +881,6 @@
File di intestazione\Include
-
- File di intestazione\Include
-
File di intestazione\Include
@@ -956,6 +962,27 @@
File di intestazione
+
+ File di intestazione\Include
+
+
+ File di intestazione\Include
+
+
+ File di intestazione\Include
+
+
+ File di intestazione\Include
+
+
+ File di intestazione\Include
+
+
+ File di intestazione\Include
+
+
+ File di intestazione\Include
+
diff --git a/Polygon3d.cpp b/Polygon3d.cpp
index 5cd9692..78b4188 100644
--- a/Polygon3d.cpp
+++ b/Polygon3d.cpp
@@ -53,6 +53,25 @@ Polygon3d::FromRectangle( double dDimX, double dDimY)
return true ;
}
+//----------------------------------------------------------------------------
+bool
+Polygon3d::FromTriangle( const Triangle3d& trTria)
+{
+ // annullo il piano del poligono
+ m_Plane.Reset() ;
+ // verifico che il triangolo sia valido
+ if ( ! trTria.IsValid())
+ return false ;
+ // assegno il piano
+ m_Plane.Set( trTria.GetP( 0), trTria.GetN()) ;
+ // assegno i punti
+ m_vVert.emplace_back( trTria.GetP( 0)) ;
+ m_vVert.emplace_back( trTria.GetP( 1)) ;
+ m_vVert.emplace_back( trTria.GetP( 2)) ;
+
+ return true ;
+}
+
//----------------------------------------------------------------------------
bool
Polygon3d::FromPolyLine( const PolyLine& PL)
@@ -152,7 +171,7 @@ Polygon3d::Trim( const Plane3d& plPlane, bool bInVsOut, bool bOnEq)
// determino se normali equiverse
bool bEquivNormal = ( m_Plane.GetVersN() * plPlane.GetVersN() > 0) ;
// se relazione tra normali opposta al desiderato, lo annullo
- if ( bOnEq != bEquivNormal)
+ if ( bOnEq != bEquivNormal)
m_vVert.clear() ;
return true ;
}