EgtGeomKernel :

- corretta verifica collisione di cilindro con triangolo.
This commit is contained in:
Dario Sassi
2021-01-19 18:25:56 +00:00
parent 7771cd8324
commit cbd2c582ab
2 changed files with 11 additions and 10 deletions
+10 -9
View File
@@ -43,7 +43,7 @@ CDeSimpleCylTria( const Frame3d& frCyl, double dR, double dH, const Triangle3d&
// Proietto il poligono sul piano XY
plyTria.Scale( GLOB_FRM, 1, 1, 0) ;
// Se la proiezione ha area nulla
if ( abs( plyTria.GetArea()) < EPS_SMALL * EPS_SMALL) {
if ( abs( plyTria.GetArea()) < SQ_EPS_SMALL) {
const PNTVECTOR& vVert = plyTria.GetVertices() ;
for ( int i = 0 ; i < int( vVert.size()) ; ++ i) {
int j = ( i + 1) % vVert.size() ;
@@ -58,27 +58,28 @@ CDeSimpleCylTria( const Frame3d& frCyl, double dR, double dH, const Triangle3d&
return false ;
}
// Verifico che sia orientato verso l'alto
if ( plyTria.GetVersN().z < - EPS_SMALL)
if ( plyTria.GetVersN().z < -EPS_SMALL)
plyTria.Invert() ;
// Determino la distanza con segno dei lati del poligono convesso dall'origine del piano
// Determino la distanza dell'origine del piano dai lati del poligono convesso
const PNTVECTOR& vVert = plyTria.GetVertices() ;
int nAtLeft = 0 ;
for ( int i = 0 ; i < int( vVert.size()) ; ++ i) {
int j = ( i + 1) % vVert.size() ;
DistPointLine dstPL( ORIG, vVert[i], vVert[j]) ;
double dSqDist ;
if ( dstPL.GetSqDist( dSqDist)) {
// se distanza minore del raggio, allora collide
if ( dSqDist < dR * dR)
if ( dSqDist <= dR * dR)
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 ;
// verifico se sta a sinistra
if ( CrossXY( ( ORIG - ptMinDist), ( vVert[j] - vVert[i])) < 0)
++ nAtLeft ;
}
}
// Non sta a destra di alcun lato, deve collidere
return true ;
// Se l'origine è a sinistra di tutti i lati, allora è interna e quindi c'è collisione
return ( nAtLeft == vVert.size()) ;
}
//----------------------------------------------------------------------------
+1 -1
View File
@@ -233,7 +233,7 @@ DistPointCurve::GetSideAtMinDistPoint( int nInd, const Vector3d& vtN, int& nSide
double dDeltaU = 1000 * EPS_PARAM ;
if ( ! m_pCurve->GetPointTang( m_Info[nInd].dPar - dDeltaU, ICurve::FROM_MINUS, ptQ, vtPreTg) ||
! m_pCurve->GetPointTang( m_Info[nInd].dPar + dDeltaU, ICurve::FROM_PLUS, ptQ, vtPostTg))
return false ;
return false ;
vtTg = 0.5 * ( vtPreTg + vtPostTg) ;
if ( ! vtTg.Normalize( EPS_ZERO))
return false ;