diff --git a/CDeCylTria.cpp b/CDeCylTria.cpp index 7ca70dc..ff9baf5 100644 --- a/CDeCylTria.cpp +++ b/CDeCylTria.cpp @@ -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()) ; } //---------------------------------------------------------------------------- diff --git a/DistPointCurve.cpp b/DistPointCurve.cpp index 11e1c41..5485307 100644 --- a/DistPointCurve.cpp +++ b/DistPointCurve.cpp @@ -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 ;