Kürzeste Entfernung zwischen zwei Grad-Markierungen auf einem Kreis?

8

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?

    
Joe Lyga 29.02.2012, 20:09
quelle

7 Antworten

18
  • Schritt 1: Erhalten Sie den "rohen" Unterschied. Bei -528.2 und 740.0 ist dies beispielsweise 1268.2 .

    • eine Möglichkeit: raw_diff = first > second ? first - second : second - first
    • ein anderer Weg: 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 .

    • eine Möglichkeit: dist = mod_diff > 180.0 ? 360.0 - mod_diff : mod_diff
    • ein anderer Weg: 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%     
ruakh 29.02.2012, 20:20
quelle
2

Sie können auch Vektormathematik und Trigonometrie verwenden; Winkel wären hier im Bogenmaß.

%Vor%     
tmpearce 29.02.2012 20:22
quelle
0

Sie müssen natürlich die Math-Bibliothek für fmod und fabs importieren.

%Vor%     
Prashant Kumar 29.02.2012 20:16
quelle
0

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: Ссылка

    
user1054204 29.02.2012 20:15
quelle
0

Ich hatte ein ähnliches Problem beim Finden von

  • Kürzeste Entfernung von einem beliebigen Punkt zu einem beliebigen Punkt in einem Kreis. Ich habe die Lösung wie folgt erhalten:

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.

    
Gopi Shankar 04.02.2018 03:50
quelle
-1

Sie können versuchen, den absoluten Wert der Differenz der Reste zwei Winkel zu erhalten, wenn Sie durch 360 geteilt werden.

%Vor%     
enderskill 29.02.2012 20:26
quelle
-1

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%     
NotMe 29.02.2012 20:34
quelle

Tags und Links