Kürzeste Entfernung zwischen zwei-Grad-Markierungen auf einem Kreis?
Ich bin auf der Suche nach eine Formel zu finden, die den kürzesten Abstand in Grad zwischen zwei-Grad-Markierungen auf einem Kreis: zum Beispiel die 30 Grad und 170 Grad (140°).
Dem zwei-Grad-Markierungen können praktisch beliebige reelle Zahl, und ist nicht notwendigerweise zwischen 0 und 360 (kann auch negativ sein, oder viel größer als 360, zum Beispiel -528.2 und 740 (das ist 171.8 Grad). Allerdings sollte der Abstand immer <= 180 ° und >= 0 Grad.
Es klingt einfach genug. Aber, ich habe versucht, eine gute Lösung zu finden für dies und ich habe versucht, eine Menge von unterschiedlichen code, aber nichts, was ich bisher gefunden habe, funktioniert in allen Fällen, die ich bisher ausprobiert habe. Ich arbeite in c++. Hat jemand irgendwelche Ideen?
abs(deg1 - deg2)
wird Ihnen die Differenz und dann einige einfache modulo Mathe zu machen, werden < 180 zu allen Zeiten tun sollten, die trick.- Es klingt wie Sie den absoluten Wert der zahlen und subtrahiere die kleinste von der größten, auf Ihre Beispiele.
- dass tatsächlich nicht funktioniert. Stellen Sie sich der Startpunkt -90. Abdeckung 4 Punkte Sie haben, -90 (aka 270), 0, 90 und 180. Wenn Sie einen Punkt auf -90 und anderen bei 135 dann wird der minimale Abstand zwischen Ihnen ist tatsächlich 135.
- Ja, ich erkannte Sie müssen ein E-Modul-Berechnung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schritt 1: Holen Sie sich die "raw" - Unterschied. Zum Beispiel, gegeben
-528.2
und740.0
ist dies1268.2
.raw_diff = first > second ? first - second : second - first
raw_diff = std::fabs(first - second)
Schritt 2: Subtrahieren Sie ein Vielfaches von
360.0
um einen Wert zwischen0.0
(inklusive) und360.0
(exklusive).mod_diff = std::fmod(raw_diff, 360.0)
Schritt 3: Wenn dieser Wert größer ist als
180.0
, subtrahieren Sie von360.0
.dist = mod_diff > 180.0 ? 360.0 - mod_diff : mod_diff
dist = 180.0 - std::fabs(mod_diff - 180.0)
Ist es wohl lesbar als eine Reihe von Anweisungen:
Aber, wenn gewünscht, es ist nicht schwer, es zu setzen, alles in einen einzigen Ausdruck:
Könnte man auch verwenden, Vektor-Mathematik und Trigonometrie; Winkel wäre im Bogenmaß hier.
fabs
+fmod
Ansatz läuft über 20-mal schneller und erzeugt Größenordnungen weniger Runden.Müssen Sie importieren Sie die math-Bibliothek natürlich für fmod und fabs.
a
ist0
undb
ist200
code geben20
eher160
.Können Sie die Formel anwenden, finden Sie hier ( http://en.wikipedia.org/wiki/Arc_(geometrie) ) auf beide Winkel und in beiden Richtungen.
So finden Sie die zwei sich ergänzenden Strecken (wenn Sie zusammenfassen, erhalten Sie den Umfang (oder kann man die Länge von einem Bogen, der durch subtrahieren der Länge des anderen Bogen vom Umfang).
Können Sie dann vergleichen Sie die beiden Längen, um die minimale Entfernung zwischen zwei Punkten in verschiedenen Winkeln.
In C++ haben Sie die Mathematik.h Bibliothek: http://www.cplusplus.com/reference/clibrary/cmath/
Ich hatte ein ähnliches problem bei der Suche nach
Ich erhielt die Lösung wie folgt aus:
wenn N = Anzahl der Punkte im Kreis
wo j ist zweiten Punkt und ich ist ersten Punkt
Hier ist wenig python-code für die Lösung.
Ich denke, dies kann verwendet werden, um die Lösung zu finden, indem Sie eine leichte Anpassung an Grad.
Ich war auf der Suche für eine mikrocontroller-Lösung wie diese für Getriebe suchen für eine animatronische Puppe, und ich hatte nicht den grunt zu berechnen trig richtig.
@ruakh die Antwort war eine gute basis, aber ich fand einen Fehler in @laggyluk die Unterzeichnung änderung (Hinzufügen von Zeichen zeigen die Richtung) in den Kommentaren (das ist da bereits gelöscht). Speziell das Schild wurde umgedreht in bestimmten Bedingungen.
Hier ist die Lösung, die für mich gearbeitet. Diese Lösung funktioniert für das Grad-Zeichen in einem Kreis, aber ändern
MAX_VALUE
erlaubt dies funktioniert für eine beliebige max-Bereich (nützlich bei der Messung der Getriebe-encoder-Impulse).Getestet, auf dem Ardunio. Formatiert für bessere Lesbarkeit.
Für Anfänger wie mich, die anderen Antworten - obwohl sehr wahrscheinlich, um Ihnen ein gutes Ergebnis - waren ein bisschen schwierig zu verstehen, was Los ist. Also, hier ist meine Methode, die überprüft, in welche Richtung (im Uhrzeigersinn oder gegen den Uhrzeigersinn) ist die kürzeste zwischen einem cp(current point) und ein tp(Zielpunkt). Er weist auch, dass die kürzeste Entfernung den Wert einer shortestDistance variable. Basierend auf was ich besonders angebracht ist diese Methode für, war es für mich wichtig, um einen booleschen Wert zurück, ob die kürzeste Strecke wurde im Uhrzeigersinn oder gegen den Uhrzeigersinn. Hier ist die Methode:
Beachten Sie, dass cp ist der Ausgangspunkt in ganzzahligen Grad und tp ist der Zielpunkt in integer-Grad; die Art kann geändert werden, um Doppel für mehr Präzision .
Es tut Konto für (Zähler)im Uhrzeigersinn über 0 Grad-Marke.
Die 3, wenn ' s überprüft:
Wieder, die anderen Beiträge mit kürzeren code kann gut funktionieren.
Edit: BTW, die shortestDistance variable ist eine Klassenvariable, initialisiert in der gleichen Klasse wie diese Methode; wenn Sie kopieren Sie diesen code, stellen Sie sicher, dass Ihre Klasse, in dem Sie platzieren es hat auch eine shortestDistance variable basiert auf den primitiven Typ wie die cp-und tp-Variablen (oder casten).
Können Sie versuchen, immer den absoluten Wert der Differenz von den Resten zwei Winkel, wenn geteilt durch 360.
Müssen wir davon ausgehen, dass ein Kreis hat nur 360 Grad, sonst wird es knifflig.
So, die erste Sache, die Sie tun müssen, ist jede mark zu, innerhalb von 0 bis 360. Um dies zu tun können Sie nehmen der E-Modul der beiden Marken durch 360. Wenn der Betrag kleiner als 0, dann fügen Sie 360.
Sagen wir mal, unsere Punkte sind 520 und -45.
mark1 wird 160. mark 2 werden 315.
Nun nehmt Ihr einfach nur der absolute Wert der Differenz: