//---------------------------------------------------------------------------- // 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 "CDeCylTria.h" #include "/EgtDev/Include/EGkCDeCylClosedSurfTm.h" #include "/EgtDev/Include/EGkDistPointSurfTm.h" using namespace std ; //---------------------------------------------------------------------------- bool CDeCylClosedSurfTm( const Frame3d& frCyl, double dR, double dH, double dSafeDist, const ISurfTriMesh& Stm) { // recupero BBox del poliedro BBox3d b3Poly = Stm.GetAllTriaBox() ; // sistemazioni cilindro Frame3d frC = frCyl ; if ( dH < 0) { frC.Translate( dH * frC.VersZ()) ; dH = - dH ; } // calcolo il BBox del cilindro BBox3d b3Cyl( -dR, -dR, 0, dR, dR, dH) ; if ( dSafeDist > EPS_SMALL) b3Cyl.Expand( dSafeDist) ; b3Cyl.ToGlob( frC) ; // Se i BBox non interferiscono, non c'è collisione 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( frC, dR, dH, dSafeDist, Tria)) return true ; } } // Se superficie aperta, non c'è collisione if ( ! Stm.IsClosed()) return false ; // Verifico se il cilindro è dentro la superficie tramite calcolo distanza minima. Point3d ptCylCen( 0, 0, dH / 2) ; ptCylCen.ToGlob( frC) ; DistPointSurfTm DistCylCenSurfCalc( ptCylCen, Stm) ; // Se il cilindro è interno c'è collisione return ( DistCylCenSurfCalc.IsPointInside()) ; }