Micha: Winkel auf "Gleichheit" prüfen

Hallo,

ich suche nach einer eleganten Lösung zu prüfen, ob Winkel gleich sind. Zunächst definiere ich alle Winkel als positiv. Ein Negativer Winkel wird also so lange um 2*PI erweitert, bis er positiv ist - andersrum nutz ich Modular, um ihn auf den Vollkreis zu reduzieren.

Probleme bereiten mir nun Winkel nahe Null. Ist ein sehr kleiner Winkel negativ, wird er um 2*Pi erweitert. Vergleich ich diesen nun mit einem kleinen pos. Winkel, so erhalte ich "große" Differenzen obwohl die Winkel (in einer bestimmten Toleranz) als gleich anzusehen sind.

Meine derzeitige Lösung (in JAVA) sieht wie folgt aus:

  
// reduziere auf Vollkreis  
double tmp_o = o%(2.0*Math.PI);  
// solange o neg. erweitere (also max einmal *g);  
// tu dies nicht, wenn o "sehr" klein ist  
while (tmp_o<0 && (tmp_o+2.0*Math.PI)<6)  
  tmp_o += 2.0*Math.PI;  

an dieser Methode stört mich die 6 in der While-Schleifen-Bedingung, die ich einfach als Grenzwert festgelegt habe. Kann ich diese Reduktion auch anders gestalten? Für den Fall, das es wichtig ist; ich vergleich gemessene Richtungen mit Richtungen, die aus Koordinaten (atan2()) berechnet werden. Gemessen werden _immer_ pos. Winkel.

Mit freundlichem Gruß
Micha

  1. Hello out there!

    Für den Fall, das es wichtig ist;

    Hm, kann sein.

    ich vergleich gemessene Richtungen mit Richtungen, die aus Koordinaten (atan2()) berechnet werden. Gemessen werden _immer_ pos. Winkel.

    Warum vergleichst du nicht die Tangens der Winkel? (Also nicht den einen mittels Arcustangens ausrechnen, sondern vom gemessenen den Tangens bilden.) Dann hast du das Problem der Periode nicht. Allerdings hast du an anderer Stelle den unendlichen Sprung ...

    See ya up the road,
    Gunnar

    --
    „Und [dieses Forum] soll […] auch ein Fachforum bleiben und kein Psychologieforum werden.“ (Kirsten Evers)
    1. Hallo Gunnar Bittersmann,

      Warum vergleichst du nicht die Tangens der Winkel?

      Weil ich mehrfach messe und zB ein Mittelwert bilden möchte. In meinem Beispiel wäre also ein Winkel nahe Null und der andere bei 360° - das ist auch okay so; im Mittel jedoch sind diese 180° und das ist dann eindeutig falsch. Ich werde mal Christians Lösungsvorschlag probieren. Hab trotzdem vielen Dank!

      Mit freundlichem Gruß
      Micha

  2. Hallo Micha,

    ich suche nach einer eleganten Lösung zu prüfen, ob Winkel gleich sind. Zunächst definiere ich alle Winkel als positiv. Ein Negativer Winkel wird also so lange um 2*PI erweitert, bis er positiv ist - andersrum nutz ich Modular, um ihn auf den Vollkreis zu reduzieren.

    Statt Modulo + Schleife ist es übrigens sinnvoller, mit Math.floor() zu arbeiten. Folgende Funktion überprüft, ob zwei periodische Variablen nah genug zueinander sind:

      public static boolean near (double v1, double v2, double period, double epsilon) {  
        v1 -= Math.floor (v1 / period) * period;  
        v2 -= Math.floor (v2 / period) * period;  
        return Math.abs (v1 - v2) < epsilon ||  
               period - Math.abs (v1 - v2) < epsilon;  
      }
    

    Erläuterung:

    v1: Erster Wert
      v2: Zweiter Wert
      period: Die Periode, z.B. 2 * Math.PI
      epsilon: Die maximale Differenz der beiden Werte

    v1 -= Math.floor (v1 / period) * period;

    Dies sorgt dafür, dass die Werte im rechtshalboffenen Intervall
        [0, period) liegen. Dies funktioniert immer - egal ob die Werte
        vorher negativ waren oder positiv oder ob sie viel zu groß waren
        oder nicht (Spiel das einfach mit verschiedenen Zahlen durch und
        Du wirst sehen, dass diese Berechnung das korrekte Ergebnis liefert).

    Math.abs (v1 - v2) < epsilon

    Dies überprüft, ob die Werte dicht zusammen liegen - sollte
        sofort klar sein.

    period - Math.abs (v1 - v2) < epsilon

    Dies überprüft, ob die Werte so weit auseinander liegen, dass der
        Abstand zur Periodendauer klein genug ist.

    Viele Grüße,
    Christian