解决的问题:实现判定一个点是否在封闭的多边形内。
原理:这个算法是由W. Randolph Franklin提出的,根据Jordan curve theorem,多边形将平面分为内外两个区域,假设待测点在多边形内部,从待测点引出一条射线必然会与多边形有至少一个交点。该射线与多边形第一次相交时将“冲出”多边形,第二次相交将“进入”多边形,依此类推,若射线与多边形有奇数个交点,则该点在多边形内部,反之则在外部。
PNPoly算法正是从待测点引出一条水平向右的射线,并计算与多边形的交点个数。
python实现
// An highlighted block
import operator
import matplotlib.pyplot as plt
import pandas as pd
#nvert:多边形的顶点个数,vertx:多边形顶点的x值的列表,verty:多边形顶点的y值的列表,(testx,testy):检测点坐标
def pnpoly(nvert,vertx,verty,testx,testy):
c=0
for i in range(0,nvert):
if i==0:
j=nvert-1
else:
j=i-1
if operator.ne(operator.gt(verty[i],testy),operator.gt(verty[j],testy)) and operator.lt(testx,(vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]):
c=1-c #点在多变形内
return c