Berechnung, wenn ein Winkel zwischen zwei Winkeln
Also ich mache ein kleines Spiel, wo ich bin, die überprüfen, ob ein Charakter kann "sehen" die anderen, wo die Charakter sehen kann Charakter B, wenn A in einer bestimmten Entfernung von B, und die Richtung in Grad von A ist +/- 45 Grad, der Winkel B ist die Verkleidung.
Derzeit mache ich eine kleine Rechnung, wo ich Kontrolle wenn
(facingAngle - 45) =< angleOfTarget =< (facingAngle + 45)
Dies funktioniert gut, außer wenn wir überqueren die 360-Grad-Linie.
Sagen wir mal facingAngle = 359, angleOfTarget = 5
. In dieser situation, das Ziel ist nur 6 Grad vom Zentrum entfernt ist, daher möchte ich meine Funktion true zurück. Leider 5 nicht zwischen 314 und 404.
- Mögliche Duplikate von Bestimmen Sie, wenn der Winkel liegt zwischen 2 andere Winkel
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur versuchen
Der Grund dafür ist, dass der Unterschied in den Winkeln ist
facingAngle - angleOfTarget
obwohl aufgrund der Verpackung-Effekte, werden Sie vielleicht von 360 Grad.Hinzufügen 180+360 dann modulo 360 subtrahieren Sie dann 180, effektiv wandelt alles um den Bereich -180 bis 180 Grad (durch addieren oder subtrahieren von 360 Grad).
Dann können Sie die Winkel-Unterschied einfach, ob es innerhalb von -45 bis 45 Grad.
mod
in Pascal funktioniert nicht mit negativen zahlen...Gibt es eine trigonometrische Lösung, die vermeidet, dass die Umhüllung problem.
Ich nehme an, Sie haben (x, y) - Koordinaten für beide Charaktere
P1
undP2
. Sie haben bereits angegeben, dass Sie wissen, der Abstand zwischen den beiden, die du vermutlich berechnet sich mit Pythagoras' theorem.Können Sie die dot product von zwei Vektoren berechnen der Winkel zwischen Ihnen:
Wenn Sie
A
alsfacingAngle
vector-es wird[cos(fA), sin(fA)]
, und haben Größe|A|
1.Wenn Sie
B
als der Vektor zwischen den beiden Zeichen, und Ihre Entfernung vor Sie bekommen:wo
|B|
ist die Strecke, die du bereits berechnet.Brauchen Sie nicht, um tatsächlich die inverse Cosinus zu finden
theta
, da für eine Reihe von -45 bis +45 brauchen Sie nur fürcos(theta) >= 0.70710678
(d.h.1 /sqrt(2)
).Das mag leicht kompliziert, aber die Chancen sind, dass Sie bereits alle erforderlichen Variablen hanging around in Ihrem Programm sowieso.
Hier ist eine einfache Funktion, die ich online gefunden, und geändert. Es funktioniert einwandfrei, für jeden Winkel (kann auch außerhalb von 0-360). (Diese Funktion ist in c, arbeitet in Xcode.)
Denken Sie daran, es wird überprüft, gegen den UHRZEIGERSINN, von Winkel A bis Winkel B. Es gibt JA (true), wenn der Winkel zwischen 🙂
Zunächst eine einfache Konvertierung Funktion, um alle Winkel 1-360
Überprüfen Sie, ob der Winkel ist zwischen 🙂
ZB. Um zu überprüfen, ob der Winkel 300 ist zwischen 180 Grad und 10 Grad:
//GIBT JA
else
zwischenreturn a <= N && N <= b;
undreturn a <= N || N <= b;
Lösung einfach zu handhaben wickeln am unteren Ende (in negative Werte), ist nur hinzuzufügen 360 alle Ihre Werte:
So, die Subtraktion von 45 kann niemals negativ, weil es nicht mehr passiert.
Griff Verpackung am oberen Ende müssen Sie noch einmal überprüfen, hinzufügen anderen 360 auf die
angleOfTarget
Wert:Andere Weise mit immer minimale positive Differenz und Vergleich mit Schwellwert:
Neuformulierung Alnitak Antwort in einer anderen Weise, eine Lösung, die vermeidet, dass der Winkel wrap bei 360 Grad ist noch einmal das problem in einem anderen Koordinatensystem, wo die Winkel werden immer kleiner. Hier ist der code:
Dies geschieht mithilfe der Vektor-Projektion. Angenommen, die Vektoren |Verkleidung> = [cos(in) sin(in)] und |target> = [cos(Ziel) sin(Ziel)], bei der Projektion das Ziel in der nach-Vektor, der Winkel reicht von null, wenn das Ziel genau auf der gegenüberliegenden Vektor-oder zunehmen, auf beiden Seiten. Auf diese Weise können wir einfach vergleichen Sie es mit pi/4 (45 Grad). Die Formel für den Winkel ist die folgende:
Das heißt, der Cosinus des Winkels ist das Skalarprodukt zwischen den Vektoren |Verkleidung> und |target> Module unterteilt, die 1 ist in diesem Fall, die wird:
Referenz:
https://en.wikipedia.org/wiki/Vector_projection