扇型の内外判定
2次元平面の扇型の中心座標,対象の座標,扇型の開始角,扇型の終了角,扇型の半径を与えます.
この時対象は扇型の内部にあるか外部にあるかを判定します.
なお扇型の角度は度数法です.
判定方法
第1に扇型の属する円の内部にあるか,外部にあるかを判定します.三平方の定理から判定できます.
第2に開始角に対して対象の座標が左側にあるかを判定します.開始角ベクトルと対象ベクトルの外積を取ります.右手系でZ成分が正であれば左側,負であれば右側です.
第3に終了角に対して対象の座標が右側にあるかを判定します.終了角ベクトルと対象ベクトルの外積を取ります.同様にZ成分が正であれば左側,負であれば右側です.
つまり開始角と終了角が180度未満であれば,開始角の左側かつ終了角の右側であればよく,180度以上であれば,開始角の左側または終了角の右側であれば良い.
プログラム
Python3
import math
def hit_sector(center_x, center_y, target_x, target_y, start_angle, end_angle, radius):
dx = target_x - center_x
dy = target_y - center_y
sx = math.cos(math.radians(start_angle))
sy = math.sin(math.radians(start_angle))
ex = math.cos(math.radians(end_angle))
ey = math.sin(math.radians(end_angle))
# 円の内外判定
if dx ** 2 + dy ** 2 > radius ** 2:
return False
# 扇型の角度が180を超えているか
if sx * ey - ex * sy > 0:
# 開始角に対して左にあるか
if sx * dy - dx * sy < 0:
return False
# 終了角に対して右にあるか
if ex * dy - dx * ey > 0:
return False
# 扇型の内部にあることがわかった
return True
else:
# 開始角に対して左にあるか
if sx * dy - dx * sy >= 0:
return True
# 終了角に対して右にあるか
if ex * dy - dx * ey <= 0:
return True
# 扇型の外部にあることがわかった
return False