Winkel auf "Gleichheit" prüfen
Micha
- programmiertechnik
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
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
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
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