問題
- 角度範囲A,B,C,Dがある
- それぞれ角度の最小と最大の値は [0,360)が入る
A,B,C,Dの角度領域が重なっていないかを確認する
方法(案)
以下、間違っているかもしれない。
外積
角度範囲A内のベクトルAvecと角度範囲B内のベクトルBvecの外積は
Avec \times Bvec = (a_x b_y - a_y b_x)
重なりチェックのパターン
以下の6通りのチェックを行う
- A, Bの重なり
- A, Cの重なり
- A, Dの重なり
- B, Cの重なり
- B, Dの重なり
- C, Dの重なり
重なりのチェック
例として角度範囲A, Bの重なりのチェックをする場合
以下のxは外積
- Amin x Bmin と Amin x Bmaxの符号が同じ
- Amax x Bmin と Amax x Bmaxの符号が同じ
これを上記の6通りでチェックすれば重なりがあるか確認できるはず。
確認
(2016/06/12追記)
ベクトルV に対して、角度範囲A [0,90]を検討してみる。
Aminのベクトル bx = 0, by = 1
Amaxのベクトル bx = 1, by = 0
ベクトルVが vx = 1, vy = 1の時
VとAminの外積: vx by - vy bx = 1*1 - 1*0 = 1
VとAmaxの外積: vx by - vy bx = 1*0 - 1*1 = -1
上記2つの外積の符号が異なるのでVはAmin,Amaxの範囲に含まれる。
これは意図通り
ベクトルVが vx = -1, vy = -1の時
VとAminの外積: vx by - vy bx = -1*1 - (-1)*0 = -1
VとAmaxの外積: vx by - vy bx = -1*0 - (-1)*1 = +1
上記2つの外積の符号が異なる、Amin,Amaxの範囲に含まれるように思えるが、実際にはVはAmin,Amaxの範囲の外側にある。
破綻した。
別の方法
外積でなくclockwiseの角度の大小比較に方針を変える
重なりのチェック
(2016/06/12追記)