La distance la plus courte entre deux degrés, les marques sur un cercle?
Je suis à la recherche d'une formule pour trouver la distance la plus courte en degrés entre les deux degrés, les marques sur un cercle: par exemple, 30 degrés et 170 degrés (140 degrés).
Les deux degrés, les marques peuvent être pratiquement n'importe quel nombre réel, et n'est pas nécessairement compris entre 0 et 360 (peut être négatif, ou beaucoup plus que la 360, par exemple -528.2 et 740 (qui est 171.8 degrés)). Toutefois, cette distance doit toujours être <= 180 degrés et >= 0 degrés.
Il semble assez simple. Mais, j'ai essayé de trouver une bonne solution et j'ai essayé beaucoup de code, mais rien de ce que j'ai trouvé pour l'instant fonctionne dans tous les cas, j'ai essayé. Je travaille en c++. Quelqu'un a une idée?
abs(deg1 - deg2)
vous donnera la différence, et puis une simple modulo mathématiques à la faire < 180 à tout moment devrait faire l'affaire.Il semble que vous prendre la valeur absolue de ces deux numéros, et soustraire le plus petit du plus grand, basée sur des exemples.
qui ne fonctionne pas. Imaginez le point de départ étant à 90. Couvrant les 4 points que vous avez -90 (aka 270), 0, 90 et 180. Si vous avez un point à -90 et l'autre à 135 alors que la distance minimale entre eux est en fait 135.
Oui, j'ai réalisé que vous avez besoin d'un module de calcul.
OriginalL'auteur Joe Lyga | 2012-02-29
Vous devez vous connecter pour publier un commentaire.
Étape 1: Obtenir le "raw" de différence. Par exemple, étant donné
-528.2
et740.0
, c'est1268.2
.raw_diff = first > second ? first - second : second - first
raw_diff = std::fabs(first - second)
Étape 2: Soustraire un multiple de
360.0
pour obtenir une valeur comprise entre0.0
(inclus) et360.0
(exclusif).mod_diff = std::fmod(raw_diff, 360.0)
Étape 3: Si cette valeur est supérieure à
180.0
, de la soustraire360.0
.dist = mod_diff > 180.0 ? 360.0 - mod_diff : mod_diff
dist = 180.0 - std::fabs(mod_diff - 180.0)
C'est probablement la plus lisible comme une série de déclarations:
Mais si vous le souhaitez, il n'est pas difficile de mettre tout cela en une seule expression:
Qui peut être fait, mais il est plus grand que celui qui entre dans un commentaire.
OriginalL'auteur ruakh
Vous pourriez aussi utiliser un vecteur de maths et trigonométrie; angles en radians ici.
fabs
+fmod
approche de pistes environ 20 fois plus rapide et génère des ordres de grandeur de moins arrondi.En outre, vous pouvez utiliser une identité trigonométrique: (sin(a)sin(b)+cos(a)cos(b) = sin(a-b) pour dériver la solution: acos(sin(angle1 - angle2)).
sin(a)sin(b)+cos(a)cos(b) cos(a-b), pas sin(a-b). Voir ici.
OriginalL'auteur tmpearce
Vous devez importer la bibliothèque de mathématiques bien sûr, pour fmod et fab.
a
est0
etb
est200
, votre code vous donnera20
plutôt160
.Oh oui, hmm, laissez-moi voir ici ...
Merci pour la réponse, mais j'ai trouvé un contre-exemple. Dire que a = 10 et b = 270. a est inférieur à b, donc la réponse serait (270 - 10) mod 180. Mais 260 mod 180 80, mais la distance réelle est de 100.
Là, nous allons, je l'ai fait (honte sur moi) testé ce code et maintenant il me donne 171.8 pour le résultat.
Et fonctionne également pour a=10, b=270, résultat=100. Et se comporte correctement avec un & b commuté.
OriginalL'auteur Prashant Kumar
Vous pouvez appliquer la formule que vous trouverez ici ( http://en.wikipedia.org/wiki/Arc_(géométrie) ) sur les angles et sur les deux directions.
Si vous trouvez la complémentarité de deux distances (si vous les résumer, vous obtiendrez la circonférence (ou vous pouvez obtenir la longueur d'un arc en soustrayant la longueur de l'autre de l'arc de la circonférence).
Vous pouvez ensuite comparer les deux longueurs pour obtenir la distance minimale entre deux points différents angles.
En C++, vous avez les mathématiques.h bibliothèque: http://www.cplusplus.com/reference/clibrary/cmath/
de l'essayer. je vous suggère de le faire sur papier d'abord, puis l'implémenter en C++.
OriginalL'auteur
J'ai eu un problème similaire pour trouver
J'ai obtenu la solution comme suit:
si N = nombre de points dans le cercle
où j est deuxième point et je est premier point
Ici peu de code python pour la solution.
Je pense que cela peut être utilisé pour trouver la solution en faisant un léger ajustement de degré.
OriginalL'auteur Gopi Shankar
J'avais été à la recherche d'une solution à base de microcontrôleur de ce genre pour boîte de vitesses à la recherche d'un animatronique marionnette et je n'ai pas eu le grognement de calculer trig correctement.
@ruakh réponse était une bonne base, mais j'ai trouvé une condition d'erreur dans @laggyluk de la signature de la modification (Ajout d'un signe pour indiquer la direction) dans les commentaires (c'est l'été supprimée depuis). Plus précisément, le signe a été renversé dans certaines conditions.
Voici la solution qui a fonctionné pour moi. Cette solution fonctionne pour le degré de repères dans un cercle, mais en changeant
MAX_VALUE
permet de travailler pour un arbitraire portée max (utile lors de la mesure des engins de codeur d'impulsions).Testé sur Ardunio. Formaté pour des raisons de lisibilité.
OriginalL'auteur Luke Mcneice
Vous pouvez essayer d'obtenir la valeur absolue de la différence des restes de deux angles lorsqu'il est divisé par 360.
OriginalL'auteur enderskill
Nous devons présumer qu'un seul cercle a 360 degrés, sinon il va devenir difficile.
Donc, la première chose que vous avez à faire est d'obtenir chaque note de 0 à 360. Pour ce faire, vous pouvez prendre le module de marque à la fois par 360. Si le montant est inférieur à 0, puis ajouter 360.
Disons que nos points de 520 et -45.
mark1 sera de 160. marque 2 315.
Maintenant, il vous suffit de prendre la valeur absolue de la différence:
OriginalL'auteur NotMe