Ich suche nach einer Formel, um den kürzesten Abstand in Grad zwischen zwei Grad Markierungen auf einem Kreis zu finden: zum Beispiel 30 Grad und 170 Grad (140 Grad).
Die Zwei-Grad-Markierungen können praktisch jede reelle Zahl sein und liegen nicht notwendigerweise zwischen 0 und 360 (kann negativ oder viel größer als 360 sein, beispielsweise -528,2 und 740 (was 171,8 Grad ist)). Der Abstand sollte jedoch immer & lt; = 180 Grad und & gt; = 0 Grad sein.
Es klingt einfach genug. Aber ich habe versucht, eine gute Lösung dafür zu finden, und ich habe viel Code ausprobiert, aber nichts, was ich bis jetzt gefunden habe, funktioniert in allen Fällen, die ich ausprobiert habe. Ich arbeite in C ++. Hat jemand irgendwelche Ideen?
Schritt 1: Erhalten Sie den "rohen" Unterschied. Bei -528.2
und 740.0
ist dies beispielsweise 1268.2
.
raw_diff = first > second ? first - second : second - first
raw_diff = std::fabs(first - second)
Schritt 2: Subtrahiere ein Vielfaches von 360.0
, um einen Wert zwischen 0.0
(inklusive) und 360.0
(exklusiv) zu erhalten.
mod_diff = std::fmod(raw_diff, 360.0)
Schritt 3: Wenn dieser Wert größer als 180.0
ist, subtrahiere ihn von 360.0
.
dist = mod_diff > 180.0 ? 360.0 - mod_diff : mod_diff
dist = 180.0 - std::fabs(mod_diff - 180.0)
Es ist wahrscheinlich am besten lesbar als eine Reihe von Aussagen:
%Vor%Aber wenn es gewünscht wird, ist es nicht schwer, alles in einen einzigen Ausdruck zu bringen:
%Vor%Sie müssen natürlich die Math-Bibliothek für fmod und fabs importieren.
%Vor%Sie können die Formel, die Sie hier finden ( Ссылка ), auf beide Winkel und in beide Richtungen anwenden. So finden Sie die zwei komplementären Abstände (wenn Sie sie summieren, erhalten Sie den Umfang (oder Sie können die Länge eines Bogens erhalten, indem Sie die Länge des anderen Bogens vom Umfang subtrahieren).
Sie können dann die beiden Längen vergleichen, um den Mindestabstand zwischen den beiden Punkten in verschiedenen Winkeln zu erhalten.
In C ++ haben Sie die math.h-Bibliothek: Ссылка
Ich hatte ein ähnliches Problem beim Finden von
wenn N = Anzahl der Punkte im Kreis
%Vor%Dabei ist j zweiter Punkt und i ist erster Punkt
Hier ist ein kleiner Python-Code für die Lösung.
%Vor%Ich denke, dass dies verwendet werden kann, um die Lösung zu finden, indem man eine leichte Anpassung an Grad vornimmt.
Sie können versuchen, den absoluten Wert der Differenz der Reste zwei Winkel zu erhalten, wenn Sie durch 360 geteilt werden.
%Vor%Wir müssen davon ausgehen, dass ein Kreis nur 360 Grad hat, sonst wird es schwierig.
Also, das erste, was Sie tun müssen, ist, dass jede Marke zwischen 0 und 360 liegt. Um dies zu tun, können Sie den Modul beider Marken um 360 nehmen. Wenn die Menge kleiner als 0 ist, fügen Sie 360 hinzu. p>
Sagen wir, unsere Punkte sind 520 und -45.
%Vor%mark1 wird 160. mark 2 wird 315 sein.
Jetzt nehmen Sie einfach den absoluten Wert der Differenz:
%Vor%Tags und Links c++ circle trigonometry