Include :

- aggiunte funzioni GetTriaVertexNearestToLine e GetTriaMidEdgeNearestToLine.
This commit is contained in:
Dario Sassi
2019-06-19 06:32:10 +00:00
parent 085b36788d
commit 3472f15bf6
+56 -1
View File
@@ -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 ;
}