我使用整数值(一个枚举)来表示风向,范围从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 :(
我确信这不会太难,但我对这个有一个真正的心理障碍。
答案 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 );