diff --git a/BBox3d.cpp b/BBox3d.cpp index 12f2253..49eca78 100644 --- a/BBox3d.cpp +++ b/BBox3d.cpp @@ -509,3 +509,26 @@ BBox3d::SqDistFromPointXY( const Point3d& ptP) const dSqDist += ( ptP.y - m_ptMax.y) * ( ptP.y - m_ptMax.y) ; return dSqDist ; } + +//---------------------------------------------------------------------------- +double +BBox3d::SqMaxDistFromPoint( const Point3d& ptP) const +{ + if ( ! IsValid()) + return INFINITO ; + double dDmaxX = max( abs( ptP.x - m_ptMin.x), abs( ptP.x - m_ptMax.x)) ; + double dDmaxY = max( abs( ptP.y - m_ptMin.y), abs( ptP.y - m_ptMax.y)) ; + double dDmaxZ = max( abs( ptP.z - m_ptMin.z), abs( ptP.z - m_ptMax.z)) ; + return ( dDmaxX * dDmaxX + dDmaxY * dDmaxY + dDmaxZ * dDmaxZ) ; +} + +//---------------------------------------------------------------------------- +double +BBox3d::SqMaxDistFromPointXY( const Point3d& ptP) const +{ + if ( ! IsValid()) + return INFINITO ; + double dDmaxX = max( abs( ptP.x - m_ptMin.x), abs( ptP.x - m_ptMax.x)) ; + double dDmaxY = max( abs( ptP.y - m_ptMin.y), abs( ptP.y - m_ptMax.y)) ; + return ( dDmaxX * dDmaxX + dDmaxY * dDmaxY) ; +} diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 59e260b..ff6db73 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/IntersLineSurfTm.cpp b/IntersLineSurfTm.cpp index c6fd1ce..b2c23ef 100644 --- a/IntersLineSurfTm.cpp +++ b/IntersLineSurfTm.cpp @@ -23,10 +23,10 @@ using namespace std ; //---------------------------------------------------------------------------- void UpdateInfoIntersLineSurfTm( const Point3d& ptL, const Vector3d& vtDir, double dLen, - int nT, const Triangle3d& Tria, ILSIVECTOR& vInfo) + int nT, const Triangle3d& Tria, ILSIVECTOR& vInfo, bool bFinite) { Point3d ptInt, ptInt2 ; - int nRes = IntersLineTria( ptL, vtDir, dLen, Tria, ptInt, ptInt2) ; + int nRes = IntersLineTria( ptL, vtDir, dLen, Tria, ptInt, ptInt2, bFinite) ; if ( nRes == ILTT_IN || nRes == ILTT_EDGE || nRes == ILTT_VERT) { double dU = ( ptInt - ptL) * vtDir ; double dCosDN = vtDir * Tria.GetN() ; @@ -49,7 +49,10 @@ OrderInfoIntersLineSurfTm( ILSIVECTOR& vInfo) return ; // ordino il vettore delle intersezioni secondo il senso crescente del parametro di linea sort( vInfo.begin(), vInfo.end(), - []( const IntLinStmInfo& a, const IntLinStmInfo& b) { return ( a.dU < b.dU) ; }) ; + []( const IntLinStmInfo& a, const IntLinStmInfo& b) + { double dUa = ( ( a.nILTT == ILTT_SEGM || a.nILTT == ILTT_SEGM_ON_EDGE) ? ( a.dU + a.dU2) / 2 : a.dU) ; + double dUb = ( ( b.nILTT == ILTT_SEGM || b.nILTT == ILTT_SEGM_ON_EDGE) ? ( b.dU + b.dU2) / 2 : b.dU) ; + return ( dUa < dUb) ; }) ; } //---------------------------------------------------------------------------- @@ -57,7 +60,7 @@ OrderInfoIntersLineSurfTm( ILSIVECTOR& vInfo) //---------------------------------------------------------------------------- bool IntersLineSurfTm( const Point3d& ptL, const Vector3d& vtL, double dLen, const ISurfTriMesh& Stm, - ILSIVECTOR& vInfo) + ILSIVECTOR& vInfo, bool bFinite) { // verifico linea Vector3d vtDir = vtL ; @@ -76,7 +79,7 @@ IntersLineSurfTm( const Point3d& ptL, const Vector3d& vtL, double dLen, const IS int nT = Stm.GetFirstTriangle( Tria) ; while ( nT != SVT_NULL) { // aggiorno info con intersezione - UpdateInfoIntersLineSurfTm( ptL, vtDir, dLen, nT, Tria, vInfo) ; + UpdateInfoIntersLineSurfTm( ptL, vtDir, dLen, nT, Tria, vInfo, bFinite) ; // passo al prossimo triangolo nT = Stm.GetNextTriangle( nT, Tria) ; } @@ -123,7 +126,7 @@ IntersParLinesSurfTm::IntersParLinesSurfTm( const Frame3d& frLines, const ISurfT //---------------------------------------------------------------------------- bool -IntersParLinesSurfTm::GetInters( const Point3d& ptL, double dLen, ILSIVECTOR& vInfo) +IntersParLinesSurfTm::GetInters( const Point3d& ptL, double dLen, ILSIVECTOR& vInfo, bool bFinite) { // verifico validità if ( ! m_bOk) @@ -149,7 +152,7 @@ IntersParLinesSurfTm::GetInters( const Point3d& ptL, double dLen, ILSIVECTOR& vI Triangle3d Tria ; m_pSTm->GetTriangle( nT, Tria) ; // aggiorno info con intersezione - UpdateInfoIntersLineSurfTm( ptLL, m_frLines.VersZ(), dLen, nT, Tria, vInfo) ; + UpdateInfoIntersLineSurfTm( ptLL, m_frLines.VersZ(), dLen, nT, Tria, vInfo, bFinite) ; } } diff --git a/IntersLineSurfTm.h b/IntersLineSurfTm.h index fad6cea..76d228e 100644 --- a/IntersLineSurfTm.h +++ b/IntersLineSurfTm.h @@ -22,7 +22,7 @@ class IntersParLinesSurfTm { public : IntersParLinesSurfTm( const Frame3d& frLines, const ISurfTriMesh& Stm) ; - bool GetInters( const Point3d& ptL, double dLen, ILSIVECTOR& vInfo) ; + bool GetInters( const Point3d& ptL, double dLen, ILSIVECTOR& vInfo, bool bFinite = true) ; private : bool m_bOk ;