2010-07-21 8 views
0

Je représente les directions du vent en utilisant des valeurs entières (un Enum) allant de 0 pour le Nord à 15 pour le Nord-Nord-Ouest.Vérifier si la direction du vent se trouve dans une plage spécifiée

J'ai besoin de vérifier si une direction de vent donnée (valeur entière entre 0 et 15) est dans une certaine plage. Je spécifie ma valeur WindDirectionFrom en commençant par me déplacer dans le sens des aiguilles d'une montre vers WindDirectionTo pour spécifier la plage de direction du vent admissible.

Evidemment, si WindDirectionFrom=0 et WindDirectionTo=4 (entre N et la direction E) et la direction du vent est NE (2) le calcul est simplement

int currentWindDirection = 2; 
bool inRange = (WindDirectionFrom <= currentWindDirection && currentWindDirection <= WindDirectionTo); 
       //(0 <= 2 && 2 <= 4) simple enough... 

Toutefois, pour un cas différent où dire WindDirectionFrom=15, WindDirectionTo=4 et direction du vent est nE (2) à nouveau, le calcul se brise immédiatement ...

bool inRange = (WindDirectionFrom <= currentWindDirection && currentWindDirection <= WindDirectionTo); 
       //(15 <= 2 && 2 <= 4) oops :(

Je suis sûr que cela ne peut pas être trop difficile, mais je vais avoir un vrai blocage mental avec celui-ci.

Répondre

1

je le ferais comme ceci:.

int normedDirection(int direction, int norm) 
{ 
    return (NumberOfDirections + currentDirection - norm) % NumberOfDirections; 
} 

int normed = normedDirection(currentWindDirection, WindDirectionFrom); 
bool inRange = (0 <= normed && normed <= normedDirection(WindDirectionTo, WindDirectionFrom); 
2

Ce que vous voulez est l'arithmétique modulaire. Faites votre arithmétique mod 16, et vérifiez si la différence est de (disons) au moins 14 (l'équivalent modulaire de -2) ou au plus 2.

Comment faire l'arithmétique modulaire variera entre les langues. Avec C ou C++, vous trouveriez x mod 16 comme suit:

int xm = x % 16; 
if (xm < 0) xm += 16; 

(Merci à MSW de remarquer que l'arithmétique sur enum s est souvent pas permis, et pour de bonnes raisons Un enum représente normalement des objets ou des conditions. qui sont discrètes et non liées arithmétiquement)

+0

droit Aah, eh bien je suis en utilisant C# donc je suppose que ça va être à peu près la même syntaxe que vous » Je suis arrivé ici. –

+0

Correct, sauf que de nombreuses langues ne permettent pas l'arithmétique sur enums (pour une bonne raison). L'OP devra obtenir ses enums en nombres. – msw

Questions connexes