2012-07-05 1 views
1

J'essaye d'écrire une fonction qui me dira si un angle se trouve dans 2 autres angles. Quand disons 'si un angle se trouve dans 2 autres angles' Je veux dire par exemple, si j'ai les 2 angles 0 et 90 alors 45 se situeraient entre ces angles mais -20 (ou 99) ne le feraient pas.Angle Hit Comparaison: Ne parvient pas à détecter le hit

Mon problème: Ma fonction ne semble pas détecter lorsque 2 angles se trouvent dans les 2 angles. Je ne suis pas sûr si ma fonction fonctionne aussi pour des angles négatifs?

Que dois-je changer pour que ma fonction fonctionne correctement?

bool is_angle_between(int target, int angle1, int angle2) 
{ 
    // Post: Return true if target lies between the 2 angles 

    int iTarget = (360 + (target % 360)) % 360; 
    int iAngle1 = (3600000 + angle1) % 360; 
    int iAngle2 = (3600000 + angle2) % 360; 

    if (iAngle1 < iAngle2) 
    if (iAngle1 <= iTarget && iTarget <= iAngle2) 
     return true; 
    else if (iAngle1 <= iTarget || iTarget <= iAngle2) 
    return true; 

    return false; 
} 
+1

Y a-t-il un problème avec 'target> angle1 && target Marlon

+0

@StackUnderflow cela fonctionnera-t-il si angle1 est le plus grand angle? Les variables angle1 et angle2 ne sont pas triées par leur taille, elles peuvent avoir n'importe quelle valeur. Vous ne savez pas si cela fonctionnera pour is_angle_between (45, 90, 0) ;? –

Répondre

-1

On dirait que cela devrait fonctionner:

if (iAngle1 < iAngle2) { 
    if (iAngle1 <= iTarget && iTarget <= iAngle2) { 
     return true; 
    } 
} 
else { 
    if (iAngle2 <= iTarget && iTarget <= iAngle1) { 
     return true; 
    } 
} 

return false; 

Notez que les accolades ici faire en sorte que les matches sinon le si vous avez l'intention à. Votre code d'origine est indenté comme vous le souhaitez, mais ce n'est pas la façon dont il est analysé.

1

Cette question n'a à voir que si un entier se situe entre deux autres entiers. Étant donné que nous ne savons pas si angle1 ou angle2 est la plus grande valeur, je ferais quelque chose comme ceci:

bool is_angle_between(int target, int angle1, int angle2) 
{ 
    return (target > angle1 && target < angle2) || 
      (target > angle2 && target < angle1); 
} 
+0

Downvoter soin d'expliquer? – Marlon

+0

La réponse est fausse, l'ordre est important car les angles sont circulaires. – starblue

1

Une bonne façon de le faire est de faire tourner l'intervalle de sorte que tous les chiffres que vous comparez sont positifs:

int rTarget = ((target - angle1) % 360 + 360) % 360; 
int rAngle2 = ((angle2 - angle1) % 360 + 360) % 360; 
return 0 <= rAngle1 && rAngle1 <= rAngle2; 

Sinon, vous aurez des problèmes près de 0 = 360 degrés.

BTW, vous devriez éviter les instructions inutiles if, que la ramification peut être coûteuse.