2010-07-21 3 views
0

Я представляю направления ветра с использованием целочисленных значений (Enum) в диапазоне от 0 для северных, до 15 для северо-северо-западных.Проверьте, соответствует ли направление ветра заданному диапазону

Мне нужно проверить, находится ли заданное направление ветра (целое значение от 0 до 15) в пределах определенного диапазона. Я указываю свое значение WindDirectionFrom, которое сначала перемещается по часовой стрелке до WindDirectionTo, чтобы указать диапазон допустимого направления ветра.

Очевидно, что если WindDirectionFrom=0 и WindDirectionTo=4 (между N и E направление) и направление ветра NE (2) вычисление является просто

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

Однако для другого случая, когда говорят WindDirectionFrom=15, WindDirectionTo=4 и направление ветра NE (2) опять же, расчет сразу ломает ...

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

Я уверен, что это не может быть слишком сложным, но у меня реальный ментальный блок с этим.

ответ

1

Я хотел бы сделать это следующим образом:.

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

Что вы хотите, это модульная арифметика. Сделайте свой арифметический мод 16 и проверьте, не отличается ли разница от (скажем) не менее 14 (модульный эквивалент -2) или не более 2.

Как сделать модульную арифметику в разных языках. С C или C++, вы бы найти х мод 16 следующим образом:

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

(Благодаря MSW для указания на то, что арифметика enum s часто не допускается, и по понятным причинам enum обычно представляет объекты или условия. которые являются дискретными и не связаны арифметически)

+0

Ааа хорошо, ну я использую C#, так что я предполагаю, что это будет в значительной степени тот же синтаксис, как вы» здесь. –

+0

Правильно, за исключением многих языков, не разрешает арифметику на перечислениях (по уважительной причине). OP должен будет перевести свои числа в численные значения. – msw

Смежные вопросы