2013-03-28 12 views
14

Ich versuche, ein Array von 3D-Punkten und einer Ebene und teilen Sie die Punkte in 2 Arrays basierend auf welcher Seite der Ebene sind sie auf. Bevor ich mich intensiv dem Debugging widme, wollte ich posten, was ich vorhabe, um sicherzustellen, dass mein Verständnis davon funktioniert. GrundsätzlichÜberprüfen Sie, welche Seite einer Ebene Punkte sind auf

Ich habe das Flugzeug mit 3 Punkten und I verwenden (Pseudocode):

var v1 = new vector(plane.b.x-plane.a.x, plane.b.y-plane.a.y, plane.b.z-plane.a.z); 
var v2 = new vector(plane.c.x-plane.a.x, plane.c.y-plane.a.y, plane.c.z-plane.a.z); 

Ich nehme das Kreuzprodukt der beiden Vektoren, die den Normalvektor zu erhalten.

Dann Schleife ich durch meine Anordnung von Punkten und verwandeln Sie sie in Vektoren und berechnen Sie das Skalarprodukt gegen die Normale.

Dann verwende ich das Punktprodukt, um die Seite zu bestimmen, auf der sich der Punkt befindet.

Hört sich das so an, als würde es funktionieren?

+0

Es klingt, als würde es funktionieren. Ich möchte jedoch auch darauf hinweisen, dass Sie das "Vektorisieren" aus der inneren Schleife herausnehmen können, indem Sie den Punkt "plane.a" mit dem normalen Vektor multiplizieren, um einen konstanten Offset zu erhalten. Dies eliminiert 2 Subtraktionen und ist im Wesentlichen die gleiche wie @ Alis Lösung: sein 'd' ist' - dot (plane_normal, plane.a) ' – comingstorm

Antwort

17

Lassen Sie a*x+b*y+c*z+d=0 die Gleichung sein, die Ihr Flugzeug bestimmt.

Ersetzen Sie die [x,y,z] Koordinaten eines Punktes auf der linken Seite der Gleichung (ich meine die a*x+b*y+c*z+d) und schauen Sie sich das Vorzeichen des Ergebnisses an.

Die Punkte mit dem gleichen Vorzeichen befinden sich auf derselben Seite der Ebene.

Ehrlich gesagt, habe ich nicht die Details von dem, was Sie geschrieben haben, untersucht. Ich denke, Sie stimmen zu, dass das, was ich vorschlage, einfacher ist.

+1

Setzen Sie es in die Form' dot ((a, b, c, d), (x, y, z, 1))> 0 ', wenn das positive Skalarprodukt vor der Ebene liegt und das negative dahinter liegt, könnte nützlich/schneller sein. –

+2

@LucasW Es * ist * die Punktform: Wenn Sie 'dot ((a, b, c, d), (x, y, z, 1)) erweitern' 'erhalten Sie genau' a * x + b * y + c * z + d'. :) – Ali

+1

Können Sie diese Methode in der Sprache der linearen Algebra erklären. Was bedeutet es, wenn das Skalarprodukt positiv oder negativ ist? – Dagang

1

Ihr Ansatz klingt gut. Wenn Sie jedoch sagen "und sie zu Vektoren machen", ist es möglicherweise nicht gut (abhängig von der Bedeutung Ihres Satzes).

Sie sollten "Ihre Punkte in Vektor umwandeln", indem Sie den Koordinatenunterschied zwischen dem aktuellen Punkt und einem der Punkte in der Ebene berechnen (z. B. einer der 3 Punkte, die die Ebene definieren). Wie du es geschrieben hast, klingt es so, als hättest du das vielleicht missverstanden; aber abgesehen davon ist es in Ordnung!

Verwandte Themen