Include :
- aggiunte funzioni GetTriaVertexNearestToLine e GetTriaMidEdgeNearestToLine.
This commit is contained in:
+56
-1
@@ -479,4 +479,59 @@ IsPointInsideTriangle( const Point3d& ptP, const Triangle3d& trTria, int nTriTyp
|
||||
return false ;
|
||||
// Punto a sinistra di tutti i lati, quindi interno
|
||||
return true ;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
inline bool
|
||||
GetTriaVertexNearestToLine( const Triangle3d& trTria, const Point3d& ptL, const Vector3d& vtL,
|
||||
int& nVert, double& dSqDist)
|
||||
{
|
||||
// Imposto valori di default
|
||||
nVert = - 1 ;
|
||||
dSqDist = INFINITO * INFINITO ;
|
||||
// Verifico validità triangolo
|
||||
if ( ! trTria.IsValid())
|
||||
return false ;
|
||||
// Verifico validità linea
|
||||
Vector3d vtDir = vtL ;
|
||||
if ( ! vtDir.Normalize())
|
||||
return false ;
|
||||
// Cerco il vertice più vicino
|
||||
for ( int i = 0 ; i < 3 ; ++ i) {
|
||||
Point3d ptP = trTria.GetP( i) ;
|
||||
double dCurrSqDist = (( ptP - ptL) - vtL * ( vtL * ( ptP - ptL))).SqLen() ;
|
||||
if ( dCurrSqDist < dSqDist) {
|
||||
dSqDist = dCurrSqDist ;
|
||||
nVert = i ;
|
||||
}
|
||||
}
|
||||
return ( nVert != -1) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
inline bool
|
||||
GetTriaMidEdgeNearestToLine( const Triangle3d& trTria, const Point3d& ptL, const Vector3d& vtL,
|
||||
Point3d& ptMid, double& dSqDist)
|
||||
{
|
||||
// Imposto valori di default
|
||||
dSqDist = INFINITO * INFINITO ;
|
||||
// Verifico validità triangolo
|
||||
if ( ! trTria.IsValid())
|
||||
return false ;
|
||||
// Verifico validità linea
|
||||
Vector3d vtDir = vtL ;
|
||||
if ( ! vtDir.Normalize())
|
||||
return false ;
|
||||
// Cerco il punto medio dei lati del triangolo più vicino
|
||||
bool bFound = false ;
|
||||
for ( int i = 0 ; i < 3 ; ++ i) {
|
||||
Point3d ptP = Media( trTria.GetP( i), trTria.GetP( (i + 1) % 3)) ;
|
||||
double dCurrSqDist = (( ptP - ptL) - vtL * ( vtL * ( ptP - ptL))).SqLen() ;
|
||||
if ( dCurrSqDist < dSqDist) {
|
||||
dSqDist = dCurrSqDist ;
|
||||
ptMid = ptP ;
|
||||
bFound = true ;
|
||||
}
|
||||
}
|
||||
return bFound ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user