2011-02-08 18 views
5

Ho due punti nello spazio, L1 e L2 che definiscono due punti su una linea.Intersezione linea/piano in base ai punti

Ho tre punti nello spazio, P1, P2 e P3 che 3 punti su un piano.

Quindi dati questi ingressi, a che punto la linea interseca il piano?

Fx. l'equazione del piano A * x + B * y + C * z + D = 0 è:

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

Ma per quanto riguarda il resto?

risposta

8

Il modo più semplice (e molto generalizzabile) per risolvere questo vuol dire che

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

che ti dà 3 equazioni in 3 variabili. Risolvi x, yez, quindi sostituisci l'equazione originale per ottenere la risposta. Questo può essere generalizzato per fare cose complesse come trovare il punto che è l'intersezione di due piani in 4 dimensioni.

Per un approccio alternativo, il prodotto incrociato N di (P2-P1) e (P3-P1) è un vettore che è perpendicolare al piano. Ciò significa che il piano può essere definito come l'insieme di punti P in modo tale che il prodotto punto di P e N sia il prodotto punto di P1 e N. Risolvendo per: 30: 292 è questa costante ti dà un'equazione in una variabile che è facile da risolvere. Se intendi intersecare molte linee con questo piano, questo approccio è sicuramente utile.

Scritto esplicitamente questo dà:

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

dove

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 

Nota che quel trucco prodotto vettoriale solo opere in 3 dimensioni, e solo per il problema specifico di un aereo e di un linea.

+0

Il web è già pieno di equazioni per questo, ma non l'effettiva equazione "finale" necessaria per trovare x, y, z. Quello di cui avevo bisogno era il set finale effettivo di semplici formule per ottenere x, y, z del risultato. Questa risposta richiede ancora uno per "risolvere" le equazioni, quindi è solo una parte molto piccola della risposta. Sto chiedendo una risposta del tipo: x = [formula basata su P1.X, P1.Y, P1.Z, P2.X ... ecc.] e simili per yez. –

+0

@Morten Nielsen: La ragione è che "l'equazione finale" è mostruosa, impossibile da capire ed è garantito che venga inserita nel tuo programma in modo errato. Soprattutto perché non so come rappresenti i tuoi punti. Ma modifico il mio nodo per rendere la formula del cross-form più esplicita per te. – btilly

1

Questo è il modo in cui ho finito per farlo nel codice venuto. Fortunatamente una libreria di codice (XNA) aveva metà di quello di cui avevo bisogno, e il resto era 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; 

Ovviamente preferirei avere solo le semplici equazioni che si svolgono sotto le copertine di XNA.

+1

Questa non è una domanda su XNA. – ideasman42