8
votes

Trouver si un angle est à l'intérieur de X degrés d'un autre

J'ai besoin d'un algorithme pour déterminer si un angle est dans une certaine quantité de degrés d'un autre angle.

Ma première pensée était (Ax B) , mais il échoue quand il doit fonctionner avec des angles qui enveloppent de -179 à 180.

Dans le diagramme ci-dessus, la région (verte) que l'angle doit être entre les enveloppements entre les côtés négatifs et positive. Comment puis-je déterminer si l'angle (la ligne rouge) tombe à l'intérieur de cette région?


1 commentaires

Essayez la version mise à jour.


5 Réponses :


3
votes

Comme Marcel souligne à juste titre, Modulo sur des nombres négatifs est potentiellement problématique. En outre, quelle est la différence entre 355 et 5 degrés? Il pourrait être élaboré pour être de 350 degrés mais 10 degrés est probablement ce que les gens attendent. Nous faisons les hypothèses suivantes:

  1. Nous voulons que le plus petit angle positif entre deux autres angles, donc 0 <= diff <= 180 ; ;
  2. Nous travaillons en degrés. Si les radians, remplacez 360 pour 2 * pi ;
  3. Les angles peuvent être positifs ou négatifs peuvent être en dehors de la plage -360 où x est un angle d'entrée et
  4. L'ordre des angles d'entrée ou la direction de la différence est hors de propos.

    entrées: angles A et b. Donc, l'algorithme est simplement:

    1. normaliser a et b à 0 <= x <360 ;
    2. calculer l'angle le plus court entre les deux angles normaux.

      Pour la première étape, pour convertir l'angle en la plage souhaitée, il existe deux possibilités:

      • x> = 0 : normal = x% 360
      • x <0 : normal = (-x / 360 + 1) * 360 + x

        La seconde est conçue pour éliminer toute ambiguïté sur la différence d'interprétation des opérations de modulus négatives. Donc, donner un exemple travaillé pour x = -400: xxx

        puis xxx

        donc pour les entrées 10 et -400 Les angles normaux sont 10 et 320.

        Maintenant, nous calculons l'angle le plus court entre eux. En vérification de la santé mentale, la somme de ces deux angles doit être de 360. Dans ce cas, les possibilités sont 50 et 310 (tirez-la et vous le verrez). Pour les travailler: xxx

        donc pour notre exemple: xxx

        vous remarquerez normal1 + normal2 = 360 (et vous pouvez même prouver que cela sera le cas si vous le souhaitez).

        enfin: xxx

        ou 50 dans notre cas.


3 commentaires

Avez-vous une faute typographique entre angle1 et angle2?


Modulo sur un nombre potentiellement négatif (DIFF) pourrait être dangereux dans certaines langues.


Est-ce que cela s'appuie sur l'angle étant 0 - 360, ou puis-je l'utiliser avec des angles d'être compris entre -180 et 180?



7
votes

Essayez cette formule: xxx

ou, dans PHP : xxx


0 commentaires

2
votes

Vous pouvez également utiliser un produit DOT:

cos(a)*cos(b) + sin(a)*sin(b) >= cos(x)


1 commentaires

C'est très élégant et supprime les ambiguïtés tout à la fois.



1
votes

Pour un rayon de 1, la distance entre les points d'extrémité de ligne est de 2sin ((AB / 2). Donc, alors que vous ne vous intéressez que par une comparaison et comparez le péché (x / 2) avec le péché (( AB) / 2). Les fonctions de Trig s'occupent de tout l'emballage.


0 commentaires

0
votes

C ++ Mise en œuvre:

float diff = fabsf(angle1 - angle2);
bool isInRange = fmodf(diff, 360.0f) <= ANGLE_RANGE ||
                 360.0f - fmodf(diff, 360.0f) <= ANGLE_RANGE;


0 commentaires