math - resueltos - Distancia desde el origen al plano(el más corto)
encuentre la distancia del punto dado al plano (3)
Puedes resolver esto con los multiplicadores de Lagrange:
Usted sabe que el punto más cercano en el avión debe ser de la forma:
c = p + v
Donde c
es el punto más cercano v
es un vector a lo largo del plano (que es ortogonal a n
, lo normal). Está tratando de encontrar el c
con la norma más pequeña (o norma al cuadrado). Entonces, estás tratando de minimizar el dot(c,c)
sujeto a que v
sea ortogonal a n
(por lo tanto, dot(v,n) = 0
).
Por lo tanto, configure Lagrangian:
L = dot(c,c) + lambda * ( dot(v,n) )
L = dot(p+v,p+v) + lambda * ( dot(v,n) )
L = dot(p,p) + 2*dot(p,v) + dot(v,v) * lambda * ( dot(v,n) )
Y tome la derivada con respecto a v
(y establézcala en 0) para obtener:
2 * p + 2 * v + lambda * n = 0
Puedes resolver por lambda en la ecuación anterior mediante el desarrollo de puntos en ambos lados por n
para obtener
2 * dot(p,n) + 2 * dot(v,n) + lambda * dot(n,n) = 0
2 * dot(p,n) + lambda = 0
lambda = - 2 * dot(p,n)
Observe nuevamente que dot(n,n) = 1
y dot(v,n) = 0
(ya que v
está en el plano n
es ortogonal a él). Luego, reemplace a lambda
para obtener:
2 * p + 2 * v - 2 * dot(p,n) * n = 0
y resuelve v
para obtener:
v = dot(p,n) * n - p
Luego vuelva a conectar esto en c = p + v
para obtener:
c = dot(p,n) * n
La longitud de este vector es |dot(p,n)|
y el signo te dice si el punto está en la dirección del vector normal desde el origen, o la dirección inversa desde el origen.
Así que estaba leyendo algo en esta página ( http://gamedeveloperjourney.blogspot.com/2009/04/point-plane-collision-detection.html )
El autor mencionó
d = - D3DXVec3Dot(&vP1, &vNormal);
donde vP1 es un punto en el plano y vNormal es la normal al plano. Tengo curiosidad sobre cómo esto te lleva a la distancia del origen mundial, ya que el resultado siempre será 0. Además, para ser claro (ya que todavía soy un poco confuso en la parte d de la ecuación de un avión), ¿Es d en una ecuación plana la distancia desde una línea a través del origen mundial hasta el origen del avión?
En el caso genérico, la distancia entre un punto p
y un plano se puede calcular mediante
<p - p0, normal>
donde <a, b>
es la operación del producto escalar
<a, b> = ax*bx + ay*by + az*bz
y donde p0
es un punto en el avión.
Cuando n
es de longitud unitaria, el producto escalar entre un vector y la longitud (firmada) de la proyección del vector en la normalidad
La fórmula que está informando es solo el caso especial cuando el punto p
es el origen. En este caso
distance = <origin - p0, normal> = - <p0, normal>
Esta igualdad es formalmente incorrecta porque el producto escalar trata sobre vectores, no puntos ... pero aún se mantiene numéricamente. Al escribir la fórmula explícita obtienes eso
(0 - p0.x)*n.x + (0 - p0.y)*n.y + (0 - p0.z)*n.z
es lo mismo que
- (p0.x*n.x + p0.y*n.y + p0.z*n.z)
De hecho, una buena manera de almacenar un avión es guardar la n
normal y el valor de k = <p0, n>
donde p0
es cualquier punto en el plano (el valor de k
es independiente del punto que elija del avión).
El resultado no siempre es cero. El resultado solo será cero si el avión pasa por el origen. (Aquí supongamos que el avión no pasa por el origen).
Básicamente, se te da una línea desde el origen hasta algún punto en el avión. (Es decir, tiene un vector desde el origen a vP1). El problema con este vector es que lo más probable es que esté inclinado e ir a un lugar lejano en el avión en lugar de ir al punto más cercano del avión. Entonces, si simplemente tomó la longitud de vP1 obtendrá una distancia que es demasiado grande.
Lo que necesita hacer es obtener la proyección de vP1 en algún vector que sepa que es perpendicular al plano. Eso por supuesto es vNormal. Entonces tome el producto de puntos de vP1 y vNormal, y divida por la longitud de vNormal y usted tiene la respuesta. (Si son lo suficientemente amables como para darle un vNormal que ya es de magnitud uno, entonces no es necesario dividirlo).