Files
EgtGeomKernel/CDeCylClosedSurfTm.cpp
T
Dario Sassi 81cc27f36b EgtGeomKernel 2.2g3 :
- correzioni a Collision Detection tra cilindro e superficie trimesh e tra cilindro e singolo triangolo.
2020-07-23 15:02:42 +00:00

55 lines
1.8 KiB
C++

//----------------------------------------------------------------------------
// 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() ;
// 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) ;
b3Cyl.Expand( dSafeDist) ;
b3Cyl.ToGlob( frC) ;
// 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( frC, dH, dR, dSafeDist, Tria))
return true ;
}
}
return false ;
}