2011-02-08 2 views
5

J'ai deux points dans l'espace, L1 et L2 qui définit deux points sur une ligne.ligne/intersection plan basée sur les points

j'ai trois points dans l'espace, P1, P2 et P3 que 3 points sur un plan.

Donc, étant donné ces entrées, à quel moment la ligne coupent le plan?

Fx. l'équation du plan A * x + B * y + C * z + D = 0 est:

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)) 

Mais que le reste?

Répondre

8

Le plus simple (et très généralisables) façon de résoudre c'est-à-dire que

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

qui vous donne 3 équations à 3 variables. Résolvez pour x, y et z, puis substituez-vous à l'une ou l'autre des équations d'origine pour obtenir votre réponse. Cela peut être généralisé pour faire des choses complexes comme trouver le point qui est l'intersection de deux plans en 4 dimensions.

Pour une autre approche, le produit croisé de N(P2-P1) et (P3-P1) est un vecteur qui est à angle droit par rapport au plan. Cela signifie que le plan peut être définie comme l'ensemble des points P de telle sorte que le produit scalaire de P et N est le produit scalaire de P1 et N. Résoudre pour x tel que (L1 + x*(L2 - L1)) dot N est cette constante vous donne une équation dans une variable qui est facile à résoudre. Si vous allez croiser beaucoup de lignes avec cet avion, cette approche en vaut vraiment la peine.

écrit explicitement cela donne:

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

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 

Notez que cette astuce de produit croisé seulement œuvres en 3 dimensions, et seulement pour votre problème spécifique d'un avion et un ligne.

+0

Le web est déjà jonché d'équations pour cela, mais pas l'équation "finale" réelle dont vous avez besoin pour trouver x, y, z. Ce dont j'avais besoin était l'ensemble final des formules simples pour obtenir x, y, z du résultat. Cette réponse nécessite encore de "résoudre" les équations, donc c'est seulement une très petite partie de la réponse. Je demande une réponse comme: x = [formule basée sur P1.X, P1.Y, P1.Z, P2.X ... etc] et similaire pour y et z. –

+0

@Morten Nielsen: La raison en est que "l'équation finale" est monstrueuse, impossible à comprendre, et est garantie d'être entrée dans votre programme de manière incorrecte. Surtout que je ne sais pas comment vous représentez vos points. Mais je vais éditer mon noeud pour rendre la formule de produit croisée plus explicite pour vous. – btilly

1

Voilà comment je fini par le faire dans le code venir. Heureusement, une bibliothèque de code (XNA) avait la moitié de ce dont j'avais besoin, et le reste était facile.

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; 

Bien sûr, je préférerais avoir seulement les simples équations qui se déroule sous les couvertures de XNA.

+1

Ce n'est pas une question à propos de XNA. – ideasman42

Questions connexes