diff --git a/EGkTriangle3d.h b/EGkTriangle3d.h index 27aae9e..c4d6d47 100644 --- a/EGkTriangle3d.h +++ b/EGkTriangle3d.h @@ -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 ; -} \ No newline at end of file +} + +//---------------------------------------------------------------------------- +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 ; +}