EgtGeomKernel :
- corretta verifica collisione di cilindro con triangolo.
This commit is contained in:
+10
-9
@@ -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
@@ -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 ;
|
||||
|
||||
Reference in New Issue
Block a user