Проверьте, находится ли направление ветра в пределах указанного диапазона - PullRequest
0 голосов
/ 22 июля 2010

Я представляю направление ветра, используя целочисленные значения (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 :(

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

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

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

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

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

(Спасибо msw за то, что указали, что арифметика на enum s часто недопустима, и по уважительным причинам. An enum обычно представляет объекты или условия, которые являются дискретными и не связаны арифметически.)

1 голос
/ 22 июля 2010

Я бы сделал это так:

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

int normed = normedDirection( currentWindDirection, WindDirectionFrom );
bool inRange = (0 <= normed && normed <= normedDirection( WindDirectionTo, WindDirectionFrom ); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...