17
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Python3]2次元平面の扇型の内外判定

Last updated at Posted at 2018-02-22

扇型の内外判定

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

参考

扇形と点の当たり判定

17
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?