矩形内部の点かどうかを決定します

矩形内部の点かどうかを決定します

タイトル

二次元の座標系では、すべての値がdouble型であり、矩形を4点、で表すことができる
最上点に最も左の点(X2、Y2)の(X1、Y1)、(X3、 Y3)右端点の最下点、(X4、Y4)です。
長方形の4点が固定点(x、y)を与える表現を考慮すると、(x、y)は長方形であるが判定されます。


アルゴリズムの考え方

私は最初の反応が変換されると思う複数の直線の範囲内である、それはポリゴンの分析に拡張することができます。
二つの直線を決定することができる表してもよい式リニア
に使用することができるクロス積を、線方位点側が決定されます。特に、参照ベクトル三角法における二点方式か否かを判定する

長方形のために、より簡潔なアイデア。

まず、座標軸に平行な長方形の側面は、容易に決定しました。回転軸ので、座標軸に矩形の辺と平行に略矩形すなわち、コースの座標点に応じて変更しました。

バツ = C インクルード S × バツ + S n個 × = - S n個 × バツ + C インクルード S × それの t X = COS \シータ\倍X +罪\シータ\回Y \\ Y = -sin \シータ\倍X + COS \シータ\回Y \\請求\シータ軸はコードで回転反時計回りに弧、ありますtは表し

注:
位置時計回りポイントによりた1,2,4,3

python3コード

# 判断特殊矩形:矩形的边平行于坐标轴
def isInParRect(x1, y1, x4, y4, x, y):
    if x <= x1:
        return False
    if x >= x4:
        return False
    if y >= y1:
        return False
    if y <= y4:
        return False
    return True

# 判断一个点是否在矩阵内
# 旋转坐标系,使一般矩形变成边平行于坐标轴的矩形
def isInRect(x1, y1, x2, y2, x3, y3, x4, y4, x, y):
    # 使一般矩形旋转,使之平行于坐标轴
    if x1 != x4:
        # 坐标系以(x3, y3)为中心,逆时针旋转t至(x4, y4)
        dx = x4 - x3
        dy = y4 - y3
        ds = (dx**2 + dy**2)**0.5
        cost = dx / ds
        sint = dy / ds
        # python特性:隐含临时变量存储值
        x, y = cost * x + sint * y, -sint * x + cost * y
        x1, y1 = cost * x1 + sint * y1, -sint * x1 + cost * y1
        x4, y4 = cost * x4 + sint * y4, -sint * x4 + cost * y4
    return isInParRect(x1, y1, x4, y4, x, y)

ご質問や提案が、コメント欄や正しい私にメッセージを残してください!

私たちは、あなたが費やす時間と労力に感謝します!

公開された57元の記事 ウォン称賛44 ビュー20000 +

おすすめ

転載: blog.csdn.net/the_harder_to_love/article/details/104180392