1. ホーム
  2. algorithm

[解決済み] ある点が矩形の内側にあるかどうかを調べる

2023-04-14 17:35:35

質問

ある点が矩形の内側にあるかどうかを調べたい。矩形はどのような向きでもよく、軸合わせされている必要はない。

私が思いついた1つの方法は、矩形と点の座標を回転させて矩形の軸を揃え、点の座標が矩形の座標の中にあるかどうかを単純にテストすることでした。

上記の方法は回転を必要とし、そのため浮動小数点演算が必要です。他に効率的な方法はないでしょうか?

どのように解決するのですか?

長方形はどのように表現されるのでしょうか?3点?4点?点、辺、角度?点2つと辺1つ?他の何か?それがわからなければ、あなたの質問に答えようとする試みは、純粋に学問的な価値しかないでしょう。

いずれにせよ、どんな 凸の 多角形 (矩形を含む) の場合、テストは非常に簡単です。多角形の各辺をチェックし、各辺が反時計回り方向に向いていると仮定し、点が が左 にあるかどうかを調べる。すべての辺がテストに合格したら、その点は内側にある。少なくとも1つが不合格の場合、その点は外側となります。

が内側にあるかどうかをテストするために、点 (xp, yp) がエッジの左側にあるかどうかを調べるために (x1, y1) - (x2, y2) を計算すればよい。

D = (x2 - x1) * (yp - y1) - (xp - x1) * (y2 - y1)

もし D > 0 の場合、ポイントは左辺にある。もし D < 0 の場合、ポイントは右側にある。もし D = 0 の場合、点は直線上にある。


この解答の前のバージョンでは、一見異なるバージョンの左辺のテスト(下記参照)を説明しました。しかし、それが同じ値を計算することは簡単に示すことができます。

... が点であるかどうかをテストするために (xp, yp) が辺の左側にあるかどうかを調べるために (x1, y1) - (x2, y2) にあるとき、その辺を含む直線の線型方程式を作る必要がある。その方程式は次のようになる。

A * x + B * y + C = 0

ここで

A = -(y2 - y1)
B = x2 - x1
C = -(A * x1 + B * y1)

あとは計算するだけです。

D = A * xp + B * yp + C

もし D > 0 の場合、ポイントは左辺にある。もし D < 0 の場合、ポイントは右側にある。もし D = 0 の場合、点は直線上にある。

しかし、このテストはまた、任意の凸多角形に対して動作します。つまり、矩形には一般的すぎるかもしれません。矩形では、より単純なテストが可能かもしれません...。たとえば、長方形 (または他の任意の平行四辺形) で AB は同じ大きさですが、対向する(つまり平行な)辺の符号が異なるので、これを利用してテストを簡略化することができます。