使用Python實現MATLAB中inpolygon函數。
1、參考鏈接
http://blog.sina.com.cn/s/blog_70012f010102xnel.html
2、代碼實現
# coding=utf8
import numpy as np
from matplotlib.path import Path
def inpolygon(xq, yq, xv, yv):
"""
reimplement inpolygon in matlab
:type xq: np.ndarray
:type yq: np.ndarray
:type xv: np.ndarray
:type yv: np.ndarray
"""
# 合併xv和yv爲頂點數組
vertices = np.vstack((xv, yv)).T
# 定義Path對象
path = Path(vertices)
# 把xq和yq合併爲test_points
test_points = np.hstack([xq.reshape(xq.size, -1), yq.reshape(yq.size, -1)])
# 得到一個test_points是否嚴格在path內的mask,是bool值數組
_in = path.contains_points(test_points)
# 得到一個test_points是否在path內部或者在路徑上的mask
_in_on = path.contains_points(test_points, radius=-1e-10)
# 得到一個test_points是否在path路徑上的mask
_on = _in ^ _in_on
return _in_on, _on
3、測試代碼
if __name__ == '__main__':
xv = np.array([-4, 0, 4, 0])
yv = np.array([0, 4, 0, -4])
X = np.array([0, 1, 3.5, 4, 5])
Y = np.array([0, 1, 0, 0, 0])
_in, _on = inpolygon(X, Y, xv, yv)
print _in, _on
X和Y中的值一一對應組成測試點,xv和yv中的值一一對應組成閉合路徑。