//---------------------------------------------------------------------------- // EgalTech 2020-2024 //---------------------------------------------------------------------------- // File : CDCylSurfTm.cpp Data : 24.03.24 Versione : 2.6c2 // Contenuto : Implementazione della verifica di collisione tra // Sphere e Closed SurftriMesh. // // // Modifiche : 09.01.20 DS Creazione modulo. // 24.03.24 DS Aggiunta TestSpheSurfTm. // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "CDeSpheTria.h" #include "/EgtDev/Include/EGkCDeSpheClosedSurfTm.h" #include "/EgtDev/Include/EGkDistPointSurfTm.h" using namespace std ; //---------------------------------------------------------------------------- // La funzione restituisce : // - true in caso di collisione o inconsistenza dei parametri di input // - false in caso di assenza di collisione. //---------------------------------------------------------------------------- bool CDeSpheClosedSurfTm( const Point3d& ptCen, double dR, const ISurfTriMesh& Stm, double dSafeDist) { // Il raggio deve essere non nullo if ( dR < EPS_SMALL) return true ; // Se superficie non valida o aperta, non ha senso proseguire if ( ! Stm.IsValid() || ! Stm.IsClosed()) return true ; // Recupero BBox del poliedro BBox3d b3Poly = Stm.GetAllTriaBox() ; // Calcolo il BBox della sfera BBox3d b3Sphe( ptCen, dR) ; if ( dSafeDist > EPS_SMALL) b3Sphe.Expand( dSafeDist) ; // Se i BBox non interferiscono, non c'è collisione if ( ! b3Sphe.Overlaps( b3Poly)) return false ; // Verifico se la sfera interferisce con i triangoli del poliedro presenti nel suo BBox INTVECTOR vT ; Stm.GetAllTriaOverlapBox( b3Sphe, vT) ; for ( int nT : vT) { Triangle3d Tria ; if ( Stm.GetTriangle( nT, Tria)) { if ( CDeSpheTria( ptCen, dR, Tria, dSafeDist)) return true ; } } // Se il BBox della sfera non è interno a quello del poliedro e viceversa, non c'è collisione if ( ! b3Sphe.Encloses( b3Poly) && ! b3Poly.Encloses( b3Sphe)) return false ; // Verifico se la sfera è dentro la superficie tramite calcolo distanza minima del suo centro DistPointSurfTm DistCenSurfCalc( ptCen, Stm) ; // C'è collisione se la sfera è interna. return ( DistCenSurfCalc.IsPointInside()) ; } //---------------------------------------------------------------------------- // Verifica l'interferenza tra la sfera e la superficie : restituisce true in caso di interferenza //---------------------------------------------------------------------------- bool TestSpheSurfTm( const Point3d& ptCen, double dR, const ISurfTriMesh& Stm, double dSafeDist) { // Il raggio deve essere non nullo if ( dR < EPS_SMALL) return true ; // Se superficie non valida, non ha senso proseguire if ( ! Stm.IsValid()) return true ; // Recupero BBox del poliedro BBox3d b3Poly = Stm.GetAllTriaBox() ; // Calcolo il BBox della sfera BBox3d b3Sphe( ptCen, dR) ; if ( dSafeDist > EPS_SMALL) b3Sphe.Expand( dSafeDist) ; // Se i BBox non interferiscono, non c'è collisione if ( ! b3Sphe.Overlaps( b3Poly)) return false ; // Verifico se la sfera interferisce con i triangoli del poliedro presenti nel suo BBox INTVECTOR vT ; Stm.GetAllTriaOverlapBox( b3Sphe, vT) ; for ( int nT : vT) { Triangle3d Tria ; if ( Stm.GetTriangle( nT, Tria)) { if ( CDeSpheTria( ptCen, dR, Tria, dSafeDist)) return true ; } } // Non c'è interferenza return false ; }