2011-02-08 19 views
5

Tengo dos puntos en el espacio, L1 y L2 que definen dos puntos en una línea.Intersección de línea/avión basada en los puntos

Tengo tres puntos en el espacio, P1, P2 y P3 que 3 puntos en un avión.

Por lo tanto, dadas estas entradas, ¿en qué punto la línea se cruza con el plano?

Fx. la ecuación en el plano A * x + B * y C * + z + D = 0 es:

A = p1.Y * (p2.Z - p3.Z) + p2.Y * (p3.Z - p1.Z) + p3.Y * (p1.Z - p2.Z) 
B = p1.Z * (p2.X - p3.X) + p2.Z * (p3.X - p1.X) + p3.Z * (p1.X - p2.X) 
C = p1.X * (p2.Y - p3.Y) + p2.X * (p3.Y - p1.Y) + p3.X * (p1.Y - p2.Y) 
D = -(p1.X * (p2.Y * p3.Z - p3.Y * p2.Z) + p2.X * (p3.Y * p1.Z - p1.Y * p3.Z) + p3.X * (p1.Y * p2.Z - p2.Y * p1.Z)) 

Pero lo que pasa con el resto?

Respuesta

8

La manera más simple (y muy generalizable) para resolver esto es para decir que

L1 + x*(L2 - L1) = (P1 + y*(P2 - P1)) + (P1 + z*(P3 - P1)) 

que le da 3 ecuaciones con 3 variables. Resuelve para x, y y z, y luego sustituye de nuevo en cualquiera de las ecuaciones originales para obtener tu respuesta. Esto se puede generalizar para hacer cosas complejas como encontrar el punto que es la intersección de dos planos en 4 dimensiones.

Para un enfoque alternativo, el producto cruzado N de (P2-P1) y (P3-P1) es un vector que está en ángulo recto con respecto al plano. Esto significa que el plano se puede definir como el conjunto de puntos P de modo que el producto escalar de P y N es el producto escalar de P1 y N. Resolviendo para x tal que (L1 + x*(L2 - L1)) dot N es esta constante le da una ecuación en una variable que es fácil de resolver. Si vas a estar cruzando muchas líneas con este avión, este enfoque definitivamente vale la pena.

Escrito explícitamente esto da:

N = cross(P2-P1, P3 - P1) 
Answer = L1 + (dot(N, P1 - L1)/dot(N, L2 - L1)) * (L2 - L1) 

donde

cross([x, y, z], [u, v, w]) = x*u + y*w + z*u - x*w - y*u - z*v 
dot([x, y, z], [u, v, w]) = x*u + y*v + z*w 

Tenga en cuenta que ese truco cruzada de productos sólo obras en 3 dimensiones, y sólo para su problema específico de un avión y una línea.

+0

La web ya está llena de ecuaciones para esto, pero no la verdadera ecuación "final" que necesita para encontrar x, y, z. Lo que necesitaba era el conjunto final real de fórmulas simples para obtener x, y, z del resultado. Esta respuesta todavía requiere que uno "resuelva" las ecuaciones, por lo que es solo una parte muy pequeña de la respuesta. Estoy pidiendo una respuesta como: x = [fórmula basada en P1.X, P1.Y, P1.Z, P2.X ... etc] y similares para y y z. –

+0

@Morten Nielsen: La razón de esto es que la "ecuación final" es monstruosa, imposible de entender y se garantiza que ingrese a su programa incorrectamente. Particularmente porque no sé cómo estás representando tus puntos. Pero editaré mi nodo para que la fórmula del producto cruzado sea más explícita para ti. – btilly

1

Así es como terminé haciéndolo en código de entrada. Afortunadamente, una biblioteca de código (XNA) tenía la mitad de lo que necesitaba, y el resto fue fácil.

var lv = L2-L1; 
var ray = new Microsoft.Xna.Framework.Ray(L1,lv); 
var plane = new Microsoft.Xna.Framework.Plane(P1, P2, P3); 

var t = ray.Intersects(plane); //Distance along line from L1 
///Result: 
var x = L1.X + t * lv.X; 
var y = L1.Y + t * lv.Y; 
var z = L1.Z + t * lv.Z; 

Por supuesto yo preferiría tener sólo las ecuaciones simples que se realice en las portadas de XNA.

+1

Esta no es una pregunta acerca de XNA. – ideasman42

Cuestiones relacionadas