Question

J'ai une question assez simple pour vous .. J'ai l'impression que j'aurais dû trouver la réponse il y a longtemps, mais je ne parviens pas à comprendre ce problème trivial.

Étant donné un vecteur v = (x, y), j'aimerais savoir qu'il s'agit d'une orientation "générale". C'est-à-dire 'Up', 'Down', 'Left' ou 'Right'

L'orientation générale d'un vecteur est "Up" si son orientation est comprise entre 45 et 135 degrés. «Gauche» se situe entre 135 et 225 degrés. "Down" est entre 225 et 315 degrés. La droite est comprise entre 315 et 45 degrés.

Je ne me soucie pas vraiment des cas où l'angle est exactement 45, 135, 225 ou 315 degrés.

Le problème, c’est que je ne veux pas utiliser la trigonométrie. Je suis presque sûr qu'il existe une solution simple.

Je pense qu'une solution pourrait diviser le cercle en huit. Voici ce que j'ai jusqu'à présent.

if(x > 0 && y > x)
    return Up
if(x > 0 && y > 0 && y < x )
    return Right

... etc ...

En gros, je sais que je pourrais trouver une solution. Je suis plus intéressé par votre propre approche de ce problème.

Merci!

MODIFIER : le vecteur utilisé n'est pas normalisé. Vous pouvez représenter n’importe quel vecteur à l’aide d’une paire de points. Supposons simplement que l’origine du vecteur est (0,0).

Était-ce utile?

La solution

Il y a un moyen, en effet. Tout ce que vous devez comprendre, c'est que si abs (y) > abs (x), la direction est verticale, sinon elle est horizontale. Si vertical, le signe sur y indiquera haut / bas, sinon, le signe sur x indiquera gauche / droite. Donc:

if (abs(y) > abs(x)) {
  if (y > 0) up else down
} else {
  if (x > 0) right else left
}

Les angles à 45 ° iront toujours à gauche ou à droite.

Autres conseils

Je sais que vous avez dit vouloir éviter trig, mais avez-vous déjà utilisé le atan2 fonctionne? C'est très facile à utiliser pour déterminer l'angle d'un vecteur:

double ldAngle = atan2(vector.y, vector.x) * 180 / PI;

En supposant un espace vectoriel normalisé ( Modifier: , votre vecteur est composé de unité des vecteurs ) comme vous semblez le faire, votre approche est la meilleure et celle la plus souvent utilisée pour les jeux et les animations 2D. Je vérifierais cependant votre table de vérité.

@ L’approche de Daniel est l’OMI la plus élégante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top