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