//---------------------------------------------------------------------------- // EgalTech 2020-2020 //---------------------------------------------------------------------------- // File : CDeConvexTorusTria.cpp Data : 18.11.20 Versione : // Contenuto : Implementazione funzione verifica collisione tra // toro convesso e SurfTriMesh. // // Modifiche : 18.11.20 LM Creazione modulo. // // //---------------------------------------------------------------------------- #include "stdafx.h" #include "CDeConvexTorusTria.h" #include "/EgtDev/Include/EGkCDeConvexTorusClosedSurfTm.h" #include "/EgtDev/Include/EGkDistPointSurfTm.h" using namespace std ; //---------------------------------------------------------------------------- // Il toro convesso è il disco limitato dalla sola parte esterna del toro. // Raggio principale R1, raggio secondario R2. // Il toro è posto nel piano XY del suo riferimento, centrato sull'origine. // La funzione restituisce true in caso di collisione. bool CDeConvexTorusClosedSurfTm( const Frame3d& frTorusFrame, double dRad1, double dRad2, double dSafeDist, const ISurfTriMesh& Stm) { // I raggi devono essere non nulli e la superficie ben definita. if ( dRad1 < EPS_SMALL || dRad2 < EPS_SMALL || ! Stm.IsValid()) return false ; // Box del toro (sempre completo) BBox3d b3ConvTorusBox ; b3ConvTorusBox.Set( Point3d( - dRad1 - dRad2, - dRad1 - dRad2, - dRad2), Point3d( dRad1 + dRad2, dRad1 + dRad2, dRad2)) ; // Aggiungo eventuale distanza di sicurezza if ( dSafeDist > EPS_SMALL) b3ConvTorusBox.Expand( dSafeDist) ; // Porto il box del toro nel riferimento della superficie (inteso some globale) b3ConvTorusBox.ToGlob( frTorusFrame) ; // Box della superficie BBox3d b3SurfBox = Stm.GetAllTriaBox() ; // Se i BBox non interferiscono, non c'è collisione if ( ! b3ConvTorusBox.Overlaps( b3SurfBox)) return false ; // Recupero i triangoli che interferiscono con il box del toro INTVECTOR vT ; Stm.GetAllTriaOverlapBox( b3ConvTorusBox, vT) ; // Ciclo sui triangoli recuperati for ( int nT : vT) { Triangle3d trTria ; if ( Stm.GetTriangle( nT, trTria)) { if ( CDeConvexTorusTria( frTorusFrame, dRad1, dRad2, CT_TOT, dSafeDist, trTria)) return true ; } } // Se superficie aperta, non c'è collisione if ( ! Stm.IsClosed()) return false ; // Verifico se il toro è dentro la superficie tramite calcolo distanza minima. Point3d ptTorusOrig = frTorusFrame.Orig() ; DistPointSurfTm DistConeOrigSurfCalc( ptTorusOrig, Stm) ; // Se il toro è interno c'è collisione return ( DistConeOrigSurfCalc.IsPointInside()) ; }