//---------------------------------------------------------------------------- // 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 ; }