Wie kann ich testen, ob ein Punkt zwischen zwei parallelen Linien liegt?

9

In dem Spiel, das ich entwerfe, gibt es eine Explosion, die von einem Ursprungspunkt in Richtung der Maus schießt. Die Breite dieser Explosion wird immer gleich sein.

Am unteren Rand des Bildschirms (was aktuell ist) bewegen sich Quadrate, die durch die vom Spieler kontrollierte Explosion beeinflusst werden sollen.

Derzeit versuche ich einen Weg zu finden, um herauszufinden, ob die Ecken dieser Quadrate innerhalb der beiden Begrenzungslinien der Explosion liegen. Ich dachte, der beste Weg, dies zu tun, wäre, die Ecken des Quadrats um einen Ursprungspunkt zu drehen, als ob die Explosion vollständig horizontal wäre, und zu prüfen, ob die Y-Werte der Ecken kleiner oder gleich der Breite der Explosion sind, die dies tun würde bedeuten, dass sie in der betroffenen Region liegen, aber ich kann nicht trainieren

Harold
quelle

Antworten:

11

Der Punkt liegt zwischen den beiden parallelen Linien, wenn es sich um eine Seite einer Linie und die andere Seite der anderen Linie handelt (vorausgesetzt, die Linien zeigen in dieselbe Richtung).

Sie können die oberste Antwort aus dieser Frage bei stackoverflow verwenden, um herauszufinden, auf welcher Seite einer Linie (definiert durch 2 Punkte darauf) ein Punkt liegt.


Eine alternative Methode wäre, den Abstand vom Punkt zu einer Mittellinie zu berechnen und diesen mit der halben Dicke Ihrer Explosion zu vergleichen.

George Duckett
quelle
2

So mache ich das (mit einer zusätzlichen Überprüfung, ob die bereitgestellten Ebenen tatsächlich parallel sind oder nicht. Die Ebenenobjekte enthalten die Ebenengleichung in der folgenden Form: Ax + By + Cz + D = 0, die Sie leicht aus 3 angegeben generieren können Punkte oder von einem Punkt und einem Normalen (siehe diese Seite, wenn Sie sich über die Mathematik nicht sicher sind: http://paulbourke.net/geometry/pointlineplane/ )

bool isPointBetweenParallelPlanes(const vec3 point, const Plane a, const Plane b){
// test if planes are parallel
vec3 cross = a.normal CROSS b.normal;
assert((a.normal CROSS b.normal) == vec3(0,0,0) && "These planes should be parallel.");
return ((a.normal DOT point) + a.D) * ((b.normal DOT point) + b.D) < 0.0;
}
Jeroen Baert
quelle