743c47d0e0
- correzioni varie a CDe e a Avoid di VolZMap - ricompilazione per nuova versione 2.3.
66 lines
2.7 KiB
C++
66 lines
2.7 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2020-2020
|
|
//----------------------------------------------------------------------------
|
|
// File : CDeConvexTorusTria.cpp Data : 18.11.20 Versione :
|
|
// Contenuto : Implementazione funzione verifica collisione tra
|
|
// toro convesso e SurfTriMesh.
|
|
//
|
|
// Modifiche : 18.11.20 LM Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
#include "CDeConvexTorusTria.h"
|
|
#include "EgtDev/Include/EGkCDeConvexTorusClosedSurfTm.h"
|
|
#include "EgtDev/Include/EGkDistPointSurfTm.h"
|
|
|
|
using namespace std ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Il toro convesso è il disco limitato dalla sola parte esterna del toro.
|
|
// Raggio principale R1, raggio secondario R2.
|
|
// Il toro è posto nel piano XY del suo riferimento, centrato sull'origine.
|
|
// La funzione restituisce true in caso di collisione.
|
|
bool
|
|
CDeConvexTorusClosedSurfTm( const Frame3d& frTorusFrame, double dRad1, double dRad2,
|
|
double dSafeDist, const ISurfTriMesh& Stm)
|
|
{
|
|
// I raggi devono essere non nulli e la superficie ben definita.
|
|
if ( dRad1 < EPS_SMALL || dRad2 < EPS_SMALL || ! Stm.IsValid())
|
|
return false ;
|
|
// Box del toro (sempre completo)
|
|
BBox3d b3ConvTorusBox ;
|
|
b3ConvTorusBox.Set( Point3d( - dRad1 - dRad2, - dRad1 - dRad2, - dRad2),
|
|
Point3d( dRad1 + dRad2, dRad1 + dRad2, dRad2)) ;
|
|
// Aggiungo eventuale distanza di sicurezza
|
|
if ( dSafeDist > EPS_SMALL)
|
|
b3ConvTorusBox.Expand( dSafeDist) ;
|
|
// Porto il box del toro nel riferimento della superficie (inteso some globale)
|
|
b3ConvTorusBox.ToGlob( frTorusFrame) ;
|
|
// Box della superficie
|
|
BBox3d b3SurfBox = Stm.GetAllTriaBox() ;
|
|
// Se i BBox non interferiscono, non c'è collisione
|
|
if ( ! b3ConvTorusBox.Overlaps( b3SurfBox))
|
|
return false ;
|
|
// Recupero i triangoli che interferiscono con il box del toro
|
|
INTVECTOR vT ;
|
|
Stm.GetAllTriaOverlapBox( b3ConvTorusBox, vT) ;
|
|
// Ciclo sui triangoli recuperati
|
|
for ( int nT : vT) {
|
|
Triangle3d trTria ;
|
|
if ( Stm.GetTriangle( nT, trTria)) {
|
|
if ( CDeConvexTorusTria( frTorusFrame, dRad1, dRad2, CT_TOT, dSafeDist, trTria))
|
|
return true ;
|
|
}
|
|
}
|
|
// Se superficie aperta, non c'è collisione
|
|
if ( ! Stm.IsClosed())
|
|
return false ;
|
|
// Verifico se il toro è dentro la superficie tramite calcolo distanza minima.
|
|
Point3d ptTorusOrig = frTorusFrame.Orig() ;
|
|
DistPointSurfTm DistConeOrigSurfCalc( ptTorusOrig, Stm) ;
|
|
// Se il toro è interno c'è collisione
|
|
return ( DistConeOrigSurfCalc.IsPointInside()) ;
|
|
}
|