743c47d0e0
- correzioni varie a CDe e a Avoid di VolZMap - ricompilazione per nuova versione 2.3.
61 lines
2.1 KiB
C++
61 lines
2.1 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 "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) ;
|
|
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, 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 ptCylOrig( 0., 0., - dSafeDist) ;
|
|
ptCylOrig.ToGlob( frC) ;
|
|
DistPointSurfTm DistCylOrigSurfCalc( ptCylOrig, Stm) ;
|
|
// Se il cilindro è interno c'è collisione
|
|
return ( DistCylOrigSurfCalc.IsPointInside()) ;
|
|
}
|