12
votes

Trouvez la distance entre un point 3D sur un segment de ligne

J'ai un point 3D Point P et un segment de ligne défini par A et B (A est le point de départ du segment de ligne, B à la fin).

Je veux calculer la distance la plus courte entre P et la ligne AB.

Calcul de la distance d'un point sur une ligne infinie était facile car leur solution était une solution sur Wolfram Mathworld , et j'ai mis en œuvre cela, mais je dois le faire pour une ligne de longueur finie.

Je n'ai pas réussi à trouver une solution fiable pour cela en 3D après beaucoup de regards.

J'ai mis en œuvre des algorithmes pour calculer le produit DOT, croiser le produit, la magnitude et ainsi de suite en C ++ avec une structure contenant des flotteurs X, Y et Z.

pseudo code, liens ou code dans la langue à peu près toute langue pour cela serait génial.


3 commentaires

Softsurfer a un bon tutoriel montrant comment Compute la distance d'un point à une ligne, rayons ou segment dans 2D et 3D .


Ici, vous avez une solution à Mathematica pour 3D (ou 2D) Stackoverflow.com/questions/849211/...


Permettez-moi de vous souhaiter la bienvenue à Stackoverflow et de rappeler trois choses que nous faisons ici ici: 1) Comme vous recevez de l'aide, essayez de le donner aussi Répondre à répondre aux questions dans votre domaine d'expertise 2) Lisez les FAQ 3) Lorsque vous voyez de bons Q & A, Véritez-les à l'aide des triangles gris , car la crédibilité du système est basée sur la réputation que les utilisateurs gagnent en partageant leur connaissance. N'oubliez pas non plus d'accepter la réponse qui mieux résout votre problème, le cas échéant, en appuyant sur le signe de coche < / code>


3 Réponses :


6
votes

Ceci est assez simple en avant. Tout d'abord, traitez votre segment de ligne comme s'il s'agissait d'un infini et de trouver le point R sur la ligne où un rayon perpendiculaire éteint la ligne à R passe à travers votre point P. si r est compris entre A et B sur la ligne, puis la distance la plus courte est pr. Sinon, la distance plus courte est le bailleur de pa et pb.


0 commentaires

10
votes

Fonction Java

/**
 * Calculates the euclidean distance from a point to a line segment.
 *
 * @param v     the point
 * @param a     start of line segment
 * @param b     end of line segment 
 * @return      distance from v to line segment [a,b]
 *
 * @author      Afonso Santos
 */
 public static
 double
 distanceToSegment( final R3 v, final R3 a, final R3 b )
 {
   final R3 ab  = b.sub( a ) ;
   final R3 av  = v.sub( a ) ;

   if (av.dot(ab) <= 0.0)           // Point is lagging behind start of the segment, so perpendicular distance is not viable.
     return av.modulus( ) ;         // Use distance to start of segment instead.

   final R3 bv  = v.sub( b ) ;

   if (bv.dot(ab) >= 0.0)           // Point is advanced past the end of the segment, so perpendicular distance is not viable.
     return bv.modulus( ) ;         // Use distance to end of the segment instead.

   return (ab.cross( av )).modulus() / ab.modulus() ;       // Perpendicular distance of point to segment.
}


0 commentaires

1
votes

Je sais que cette question est petite, mais pour aider les autres:

Ici, vous avez un lien vers le pseudo code (regardez sous distance d'un point sur un rayon ou un segment ):

implémentation pseudo-code et C ++

Liens vers plusieurs implémentations linguistiques (regardez sous implémentations contribuées ):

C, VBA, Java et autres implémentations


0 commentaires