EgtGeomKernel 1.9c2 :
- a BBox3d aggiunti metodi SqMaxDistFromPoint, SqMaxDistFromPointXY, MaxDistFromPoint e MaxDistFromPointXY - a IntersLineSurfTm e IntersParLine aggiunto parametro bFinite per indicare se linea finita o infinita.
This commit is contained in:
+23
@@ -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) ;
|
||||
}
|
||||
|
||||
Binary file not shown.
+10
-7
@@ -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) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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 ;
|
||||
|
||||
Reference in New Issue
Block a user