9
3

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.

平面上の多角形中に点があるかどうか判定する

Posted at

下記の図のように、(5,5), (10,5), (10,10), (5,10)の青い点で囲まれた矩形があったとする。

f1.png

ここに、以下のように(7,8)のオレンジの点と(12,10)の緑の点があったときに、矩形中にあるかどうかを判定する方法を紹介する。

f2.png

Shapelyというライブラリを利用する。
これは、GEOSをベースとしたpythonライブラリで、平面上の幾何学図形の分析と操作のために使われる。

参考: https://pypi.org/project/Shapely/

$ pip install shapely

矩形の中に点があるかどうか

以下のコードで確認できる。

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

point = Point(7,8)
polygon = Polygon([(5,5), (10,5), (10,10), (5,10)])
print(polygon.contains(point)) # True

point = Point(12,10)
polygon = Polygon([(5,5), (10,5), (10,10), (5,10)])
print(polygon.contains(point)) # False

境界上の点は、矩形内の点ではないと判定される。

point = Point(5, 5)
polygon = Polygon([(5,5), (10,5), (10,10),(5,10)])
print(polygon.contains(point)) # False

5点以上の場合

以下の図のように、5点ある場合はどうするのか?( (7.5, 12.5)を追加した。)

fig3.png

point = Point(7.5, 7.5)
polygon = Polygon([(5,5), (10,5), (10,10),(5,10), (7.5,12.5)]) # ここに追加するだけ。
print(polygon.contains(point)) # True

対象の図形を凸包として判定したい場合は、以下で確認可能だ。

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
from shapely.geometry import MultiPoint


point = Point(7.5, 7.5)
polygon = MultiPoint([(5,5), (10,5), (10,10),(5,10), (7.5,12.5)]).convex_hull
print(polygon.contains(point)) # True

この場合も、境界上の点はFalseと判定される。

9
3
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
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?