EgtGeomKernel :
- aggiunte funzioni per verifica collisione tra Box, Cilindro e Sfera con Superfici triMesh chiuse - aggiunta costruzione di Polygon3d da triangolo.
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// 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 ;
|
||||
}
|
||||
Reference in New Issue
Block a user