0

北の場合は0、北北西の場合は15までの整数値(列挙型)を使用して風向を表しています。

与えられた風向(0から15の間の整数値)が特定の範囲内にあるかどうかを確認する必要があります。許容風向の範囲を指定するために、WindDirectionFrom最初に時計回りに移動する値を指定します。WindDirectionTo

明らかに、WindDirectionFrom=0and WindDirectionTo=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 :(

これはそれほど難しいことではないと確信していますが、私はこれで本当の精神的なブロックを持っています。

4

2 に答える 2

2

必要なのはモジュラー演算です。算術mod16を実行し、その差が(たとえば)少なくとも14(-2に相当するモジュラー)または最大で2であるかどうかを確認します。

モジュラー演算の方法は言語によって異なります。CまたはC++では、xmod16は次のようになります。

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

(sの算術はしばしば許可されないことを指摘してくれたmswに感謝しenumます。そして、正当な理由があります。enum通常、離散的で算術的に関連しないオブジェクトまたは条件を表します。)

于 2010-07-21T20:47:48.503 に答える
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 ); 
于 2010-07-21T20:58:45.597 に答える