Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで点がポリゴン内にあるかどうかを高速に判定する方法

Pythonで特定の座標(点)がポリゴンの内部に含まれるかどうかを判定したい場面は、地理情報処理やグラフィックスプログラミングなどでよくあります。最も手軽で高速な方法のひとつが、Matplotlibが提供する mplPath.Path クラスを使うアプローチです。

まず mplPath.Path メソッドでポリゴンを作成し、その後 poly_path.contains_point() メソッドを呼び出すことで、指定した点がポリゴン内にあるかどうかを簡単に確認できます。

実行手順

  • ポリゴンを構成する頂点のリストを作成します。

  • mplPath.Path() を使って、与えられた頂点から新しいパスオブジェクトを生成します。

  • contains_point() メソッドで、点 (200, 100) がポリゴン内に存在するかを確認します。このメソッドは、閉じたパスが指定された点を含むかどうかを返します。→ 結果は True

  • 同様に、点 (1200, 1000) についても contains_point() メソッドで確認します。→ 結果は False

コード例

import matplotlib.path as mplPath
import numpy as np

poly = [190, 50, 500, 310]
poly_path = mplPath.Path(np.array([[190, 50],
                                   [50, 500],
                                   [500, 310],
                                   [310, 190]]))
point = (200, 100)
print(point, " is in polygon: ", poly_path.contains_point(point))

point = (1200, 1000)
print(point, " is in polygon: ", poly_path.contains_point(point))

実行結果

(200, 100) is in polygon: True
(1200, 1000) is in polygon: False

補足:より多くの点を効率的に判定したい場合

単一の点だけでなく、大量の点をまとめて判定したい場合は、contains_points() メソッド(複数形)を使用すると便利です。NumPy配列として点の集合を渡すことで、ベクトル化された処理により高速に一括判定が可能です。

points = np.array([[200, 100], [1200, 1000], [300, 300]])
results = poly_path.contains_points(points)
print(results)  # [ True False  True]

また、境界線上の点の扱いについては、radius 引数で判定の許容範囲を微調整できるため、用途に応じて活用するとよいでしょう。

  1. Pythonで点がポリゴンの内側または境界上にあるかどうかを判定するプログラム

    問題の概要 直交座標系の点のリスト [(x1, y1), (x2, y2), ..., (xn, yn)] が1つのポリゴン(多角形)を表しているとします。ここに、判定対象となる点 (x, y) が与えられたとき、その点がこのポリゴンの内側、あるいは境界上に存在するかどうかを判定するのが本記事のテーマです。 例として、次のような入力を考えてみましょう。 points = [(0, 0), (1, 3), (4, 4), (6, 2), (4, 0)] pt = (3, 1) この場合、点 (3, 1) はポリゴンの内部にあるため、出力は True となります。 解決のアプローチ この問題は

  2. iPhoneを最速で充電する方法とは?急速充電のすべてがわかる完全ガイド

    スマートフォンを何時間も充電ケーブルにつなぎっぱなしにしたり、ワイヤレスチャージャーの上に置きっぱなしにしたりするのは避けたいものですよね。今や「急速充電」は当たり前の時代です。このガイドでは、iPhoneユーザー向けに利用できるさまざまな急速充電の方法とアクセサリを比較し、最速・最安全・最効率的な充電方法をご紹介します。 急速充電に対応しているiPhoneはどのモデル? 以下のiPhoneモデルは急速充電に対応しています。ただし、これらのモデルすべてに急速充電用のアクセサリが同梱されているわけではない点に注意してください。 iPhone 8シリーズ — iPhone 8 / 8 Pl