检查风向是否在指定范围内

时间:2010-07-21 20:40:38

标签: language-agnostic enums discrete-mathematics

我使用整数值(一个枚举)来表示风向,范围从0到北,从15到北 - 西北。

我需要检查给定的风向(0到15之间的整数值)是否在一定范围内。我指定我的WindDirectionFrom值首先顺时针移动到WindDirectionTo以指定允许的风向范围。

显然,如果WindDirectionFrom=0WindDirectionTo=4(在N和E方向之间)和风向是NE(2),那么计算就是

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

然而,对于另一种情况,例如WindDirectionFrom=15WindDirectionTo=4和风向再次为NE(2),计算会立即中断......

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

我确信这不会太难,但我对这个有一个真正的心理障碍。

2 个答案:

答案 0 :(得分:2)

你想要的是模数运算。做你的算术模型16,并检查差异是否来自(例如)至少14(模块当量为-2)或最多2。

如何进行模数运算会因语言而异。使用C或C ++,您会发现x mod 16如下:

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

(感谢msw指出经常不允许对enum进行算术,并且有充分的理由。enum通常表示离散且与算术无关的对象或条件。)< / p>

答案 1 :(得分: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 );