2011-02-01 15 views
8

Tengo un punto 3d P y un segmento de línea definido por A y B (A es el punto de inicio del segmento de línea, B el final).Encontrar la distancia desde un punto 3d a un segmento de línea

Quiero calcular la distancia más corta entre P y la línea AB.

Cálculo de la distancia de un punto a una línea infinita fue fácil ya que era una solución en Wolfram Mathworld, y lo he implementado, pero tengo que hacer esto para una línea de longitud finita.

No he podido encontrar una solución confiable para esto en 3d después de mucho mirar alrededor.

He implementado algoritmos para calcular el producto punto, el producto cruzado, la magnitud, etc. en C++ con una estructura que contiene flotantes x, y y z.

Pseudo código, enlaces o código en casi cualquier idioma para esto sería genial.

+0

Aquí tienes una solución en Mathematica para 3D (o 2D) http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment/4165840#4165840 –

+0

Déjame darte la bienvenida a StackOverflow y recuerde tres cosas que solemos hacer aquí: 1) A medida que reciba ayuda, trate de darle también ** respondiendo preguntas ** en su área de experiencia 2) ['Lea las preguntas frecuentes'] (http://tinyurl.com/2vycnvr) 3) Cuando vea buenas preguntas y respuestas, vote por ellas ['usando los triángulos grises'] (http://i.imgur.com/kygEP.png), ya que la credibilidad del sistema se basa en la reputación que tiene los usuarios ganan compartiendo sus conocimientos. También recuerde aceptar la respuesta que mejor resuelva su problema, en caso de haberlo, ['presionando el signo de la marca de verificación '] (http://i.imgur.com/uqJeW.png) –

Respuesta

5

Esto es bastante directo. Primero, trate su segmento de línea como si fuera un infinito y encuentre el punto R en la línea donde un rayo perpendicular de la línea en R pasa a través de su punto P. Si R está entre A y B en la línea, entonces la distancia más corta es PR. De lo contrario, la distancia más cercana es el arrendador de PA y PB.

4

función de 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. 
} 

esencia del conjunto (autónomo) R3 3D paquete de álgebra: https://gist.github.com/reciprocum/4e3599a9563ec83ba2a63f5a6cdd39eb

parte de la biblioteca de código abierto https://sourceforge.net/projects/geokarambola/

Cuestiones relacionadas