2016-08-22 4 views
0

start angle, end angle, moving clockwise or anticlockwise, hitting angleという関数を探していて、そのような動きがhitting angleに当てはまるかどうかを調べます。方向が与えられた位置に円が当たるかどうかをテストする汎用関数

たとえば時計回りに270度から50度に移動すると、hitting angle = 0 or 360度の位置になりますが、反時計回りに移動するとヒットしません。

もう1つの例は、時計回りに80度から100度に移動すると、反時計回りの方向ではなくhitting angle = 90になります。

+0

角度を0 <= theta <= 360に制限していますか?それ以外の場合は、0から420になるかどうかを考える必要がありますすべてかどうか。また、あなたはあなたの角度を時計回りに増やすことを考えていると思います。数学タイプはその慣例を使用しません。正のx軸で0から始まり、posで90までccwを上げます。 y軸。だから、時計回りに80から100に行くと、私はあなたが90をヒットしないと言いたいと思うでしょう。しかし、基本的には、あなたの開始角度があなたのフィニッシュアングルよりも小さいかどうか、そしてヒットしたらccwかcwかどうかをテストします。 8例を扱う。後でリファクタリングしてください。 –

+0

サイドノート:C#のジェネリックは特別な意味を持っています。ジェネリックが本当に必要かどうかを明確にしてください。 –

答えて

1

まず、旅行の方向を明示的に渡す必要はありません。特定の角度の弧を指定する方法が必要です。だから、開始角度から終了角度に向かって角度が大きくなるという慣習を採用することができます。円弧の逆を指定するには、開始と終了を逆の順序で渡します。

それでは、角度が0から360度の順になっている場合に動作関数を定義してみましょう - 何のモジュロは必要ありません:

bool IsBetween(int low, int high, int target) 
{ 
    return (target >= low && target <= high); 
} 

lowhighより大きくない場合にのみ動作すること。それが(360度の線を横切って角度が掃引されているため)、弧を開始角度から360度、0度から終了角度までの2つのセクションに分割できます。

bool SweepHits(int start, int finish, int target) 
{ 
    // check for the simple case 
    if (start <= finish) return IsBetween(start, finish, target); 

    // straddling 360 degrees - break into two sections 
    return IsBetween(start, 360, target) || IsBetween(0, finish, target); 
} 
0

あなたの最初の例は間違っていると思いますか? 270度から始まり、時計回りに50度に進むと、0度にはならないでしょう(時計回りに80度から100度に動かすと同じですが、90度は打つことはありません)。

この回答は0度から始まり、反時計回りに360度まで行くの角度を持って、明確にするために更新

:。。これは今開始角度が少ない以上のエンド角よりもされているかどうかにかかわらず動作します

public static bool DidWeHitAngle(double hittingAngle, double startAngle, double endAngle, bool clockwise) 
    { 
     var minAngle = Math.Min(startAngle, endAngle); 
     var maxAngle = Math.Max(startAngle, endAngle); 
     var dir = minAngle == startAngle ? clockwise : !clockwise; 
     if (hittingAngle < minAngle || hittingAngle > maxAngle) 
     { 
      if (dir) 
       return true; 
     } 
     else 
     { 
      if (!dir) 
       return true; 
     } 
     return false; 
    } 
関連する問題