Diskussion Winkelproblem

BAGZZlash

Mitglied
Ich habe gerade ein vermeintlich triviales trigonometrisches Problem. Ich habe zwei Punkte, die zusammen mit dem Ursprung ein "offenes" Dreieck bilden. Eigentlich nicht wirklich ein Dreieck, sondern eher so eine Art "offener Sektor". Die Koordinaten der Punkte sind im Beispiel P1 = (-0,9886; 0,1505) und P2 = (-0,9431; 0,3325). Sieht so aus:



Nun kommt ein weiterer Punkt dazu. Beispiel: P3 = (-0,9664; -0,2569). Sieht so aus:

Winkel 2.png


Die Frage lautet: Liegt der neue Punkt im Sektor? Mit Hingucken leicht zu beantworten, die Antwort lautet: "Nein". Wie kann ich das programmatisch lösen? Die "Arme" des Sektors können auch kürzer oder länger sein, das Ganze kann sich in allen vier Quadranten abspielen und auch über Quadrantengrenzen hinweg. Falls das wichtig ist: Die Koordinaten der Punkte sind das Ergebnis aus der Umrechnung von Polarkoordinaten in euklidische Koordinaten, der Sektor ergibt sich eigentlich aus Richtungsangaben (Richtung 1: 278°, Richtung 2: 289°, Richtung des dritten "Punktes": 255°). Hat da jemand ne allgemeingültige Idee? Stehe aufm Schlauch, wüsste nichtmal, wonach ich google-n sollte.
 

Anhänge

  • Winkel 1.png
    Winkel 1.png
    6,8 KB · Aufrufe: 187

german

Aktives Mitglied
devCommunity-Experte
Sorry für die Bauernmalerei ...
Nimm irgendwas als Winkel 0 an. Bspw. die Abszisse (grün). Nun rechnest du die beiden Winkel blau1 und blau2 und den Winkel rot. Dann bestimmst du ob Winkel rot ≤ max(blau1, blau2) und ≥ min(blau1, blau2) ist. Wäre zumindest meine Idee ...
1585242175876.png
 

BAGZZlash

Mitglied
Hey, ja, vielen Dank. Das hatte ich eigentlich umgehen wollen, daher die Umrechnung in euklidische Koordinaten. Gibt halt Nerverei wenn beispielsweise der eine Arm des Sektors 350°, der andere Arm 10° und der Testwinkel 3° oder 356° oder so ist. Geht alles, aber man braucht nervige Fallunterscheidungen. Ich hab's jetzt so gemacht, auch wenn ich immer noch meine, dass das bestimmt eleganter geht.
 

lord_haffi

Mitglied
Also du meintest doch, dass du die Punkte in Polarkoordinaten vorliegen hast, oder? Zu überprüfen, ob der Winkel nun dazwischen liegt, ist doch deutlich einfacher und performanter, als die Punkte in karthesische Koordinaten umzurechnen, oder nicht?

Grundsätzlich brauchst du für die Definition eines Sektors ja aber nicht nur die beiden Winkel. Zwischen den beiden Armen gibt es ja immer den Außen- und den Innenwinkel, du müsstest schon vorher in deinem Programm definieren, welcher der beiden jetzt dein Sektor sein soll.
Definieren könntest du das z.B. über winkel1 und winkel2, wobei dein Sektor im Winkelbereich(winkel1, winkel2) (gegen den Uhrzeigersinn) liegen soll. Dann könntest du das ganze auch in eine if-Abfrage packen:
Code:
winkel1, winkel2, testwinkel
if ( winkel1 < winkel2 && testwinkel >= winkel1 && testwinkel <= winkel2 ||
    winkel1 > winkel2 && (testwinkel >= winkel1 || testwinkel <= winkel2) ) {
    // Testwinkel liegt im Sektor
}
 

Xpyder

Neues Mitglied
Ich würde das gar nicht über Winkel lösen, wenn ich mich schon in einem Koordinatensystem befinden würde.
Um zu wissen, wo sich ein Punkt in Bezug auf eine "Linie" befindet, stelle man sich diese Linie einfach als Graph einer linearen Funktion vor. Wenn der Punkt die Koordinaten x;y hat, setzt man in die Funktion x ein, erhält das y der "Linie" und kann damit herausfinden, wo sich der Punkt in Bezug dazu befindet. Sollte die Linie senkrecht sein (oder "zu senkrecht") dreht man das Koordinatensystem im Kopf einfach um 90°, mit anderen Worten: vertauscht x und y.

Und wenn es mit EINER Linie geht, geht es auch mit zwei.
Ach ja: Das "Koordinatensystem um 90° drehen" hilft auch, wenn die Linien einen Anstieg >45° haben. Dann kann man das Ganze nämlich ausreichend genau und sogar mit Festkomma-Arithmetik lösen, braucht also kein Fließkomma.

Anm.: Ich habe mal vor Jahren einen Text zur binären Raumaufteilung (BSP = Binary Space Partitioning) geschrieben, in dem ich das Ganze anhand vom Beispiel des "Wände sortieren in einem 2,5D-Spiel (wie z.B. Doom)" erkläre. Der Text ist im "Coding" Bereich meiner Website zu finden.
 

BAGZZlash

Mitglied
Cool, das würde ich gern mal lesen. Wo finde ich denn Deine Website?

/edit: Okay, hab sie gefunden. Hm, die Seite hatte ich sogar schonmal durchstöbert. Den BSP-Artikel hab' ich mir heruntergeladen! :)
 
Oben Unten