Hola
¿Cómo podemos calcular la distancia mínima entre un punto y un vector? Pues de una forma relativamente sencilla utilizando el producto escalar definido para los vectores.
¿Qué es el producto escalar? Una operación que nos da como resultado un número, este número nos indica, una vez proyectado un vector encima del otro, cuantos vectores mide esa proyección.
Por ejemplo, imaginemos que el resultado es 1.5, entonces eso quiere decir que la proyección del vector mide 1.5 veces el vector al cual se ha proyectado el anterior vector.
Como una imagen vale más que mil palabras, vamos a observarla y a explicarlo un poco.
Tenemos inicialmente un vector (x1 -> x2), y el punto x0 con los cuales queremos obtener la distancia MINIMA entre ese vector y ese punto.
La estrategia es usar el producto escalar para proyectar un vector encima de otro, por lo tanto, tenemos el vector original (x1 -> x2) y ahora creamos un nuevo que será el que proyectaremos.
Con lo cual, tenemos los vectores (x1 -> x2) y (x1 -> x0). Si hacemos el producto escalar entre ellos, obtendremos el número de veces que mide la sección entre x1 y el punto ‘p’. Es decir, la proyección de la línea azul (vector x1 -> x0) encima del vector original.
Una vez tenemos ese factor de multiplicación, solo tenemos que multiplicar el vector original por ese factor y sabiendo la primera componente que es x1, sabremos automáticamente cual es el punto (x,y,z) que hay en ‘p’.
Una vez sabido ‘p’, solo nos queda hacer la distancia entre ‘p’ y x0. Para eso creamos el vector (p -> x0) y calculamos su distancia.
El codigo siguiente calcula el punto ‘p’ y luego en otra funcion calcula la distancia.
vector3 ClosestPointOnSegment(vector3 p, vector3 p1, vector3 p2)
{
vector3 diff = p-p1;
vector3 dir = p2-p1;
float t = dot(diff,dir)/dot(dir,dir);
if (t <= 0.0f)
{
return p1;
}
else if (t >= 1.0f)
{
return p2;
}
else
{
return p1 + t * dir;
}
}
//The distance from the point to the segment is then:
float distance = length(p - ClosestPointOnSegment(p,p1,p2));
NOTA: Existen dos variantes, la que calcula esta distancia del punto x0 a la línea definida por el vector (x1 -> x2) y la que calcula la distancia del punto x0 al vector LIMITADO (x1 -> x2). Si queréis la primera, necesitáis eliminar las dos primeras condiciones del anterior código, sino, dejad el código tal cual.
Un saludo
