Files
EgtGeomKernel/CDeCylTria.cpp
T
Dario Sassi fba63ea82e EgtGeomKernel :
- aggiunte funzioni per verifica collisione tra Box, Cilindro e Sfera con Superfici triMesh chiuse
- aggiunta costruzione di Polygon3d da triangolo.
2020-01-10 09:32:59 +00:00

67 lines
2.4 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2020-2020
//----------------------------------------------------------------------------
// File : CDeCylTria.cpp Data : 08.01.20 Versione : 2.2a2
// Contenuto : Implementazione della verifica di collisione tra
// Cylinder e Triangle3d.
//
//
// Modifiche :08.01.20 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "DistPointLine.h"
#include "/EgtDev/Include/EGkCDeCylTria.h"
#include "/EgtDev/Include/EGkPolygon3d.h"
using namespace std ;
//----------------------------------------------------------------------------
bool
CDeCylTria( const Frame3d& frCyl, double dH, double dR, double dSafeDist, const Triangle3d& trTria)
{
// Costruisco il poligono equivalente
Polygon3d plyTria ;
if ( ! plyTria.FromTriangle( trTria))
return false ;
// Lo porto nel riferimento del cilindro
plyTria.ToLoc( frCyl) ;
// Lo taglio come il cilindro (ingrossato della sicurezza)
Plane3d plTrimB ;
plTrimB.Set( dSafeDist, -Z_AX) ;
plyTria.Trim( plTrimB, true, false) ;
Plane3d plTrimT ;
plTrimT.Set( dH + dSafeDist, Z_AX) ;
plyTria.Trim( plTrimB, true, false) ;
// Se non è rimasto alcunchè, allora non c'è collisione
if ( plyTria.GetSideCount() == 0)
return false ;
// Proietto il poligono sul piano XY
plyTria.Scale( GLOB_FRM, 1, 1, 0) ;
// Verifico che sia orientato verso l'alto
if ( plyTria.GetVersN().z < - EPS_SMALL)
plyTria.Invert() ;
// Determino la distanza con segno dei lati del poligono dall'origine del piano
const PNTVECTOR& vVert = plyTria.GetVertices() ;
for ( int i = 0 ; i < int( vVert.size()) ; ++ i) {
int j = ( i + 1) % vVert.size() ;
DistPointLine dstPL( ORIG, vVert[i], vVert[j]) ;
double dDist ;
if ( dstPL.GetDist( dDist)) {
// se distanza minore del raggio, allora collide
if ( dDist < dR + dSafeDist)
return true ;
Point3d ptMinDist ;
dstPL.GetMinDistPoint( ptMinDist) ;
// se sta a destra del raggio, allora non collide
if ( CrossXY( ( ORIG - ptMinDist), ( vVert[j] - vVert[i])) > 0)
return false ;
}
}
return false ;
}