まず、旅行の方向を明示的に渡す必要はありません。特定の角度の弧を指定する方法が必要です。だから、開始角度から終了角度に向かって角度が大きくなるという慣習を採用することができます。円弧の逆を指定するには、開始と終了を逆の順序で渡します。
それでは、角度が0から360度の順になっている場合に動作関数を定義してみましょう - 何のモジュロは必要ありません:
bool IsBetween(int low, int high, int target)
{
return (target >= low && target <= high);
}
low
がhigh
より大きくない場合にのみ動作すること。それが(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 <= theta <= 360に制限していますか?それ以外の場合は、0から420になるかどうかを考える必要がありますすべてかどうか。また、あなたはあなたの角度を時計回りに増やすことを考えていると思います。数学タイプはその慣例を使用しません。正のx軸で0から始まり、posで90までccwを上げます。 y軸。だから、時計回りに80から100に行くと、私はあなたが90をヒットしないと言いたいと思うでしょう。しかし、基本的には、あなたの開始角度があなたのフィニッシュアングルよりも小さいかどうか、そしてヒットしたらccwかcwかどうかをテストします。 8例を扱う。後でリファクタリングしてください。 –
サイドノート:C#のジェネリックは特別な意味を持っています。ジェネリックが本当に必要かどうかを明確にしてください。 –