Python 随机形状多边形中的点?
使用著名的光线投射算法,可以轻松确定点是否位于凸多边形中Python 随机形状多边形中的点?,python,algorithm,Python,Algorithm,使用著名的光线投射算法,可以轻松确定点是否位于凸多边形中 def point_inside_polygon(x, y, poly): """ Deciding if a point is inside (True, False otherwise) a polygon, where poly is a list of pairs (x,y) containing the polygon's vertices. The algorithm is called the 'Ra
def point_inside_polygon(x, y, poly):
""" Deciding if a point is inside (True, False otherwise) a polygon,
where poly is a list of pairs (x,y) containing the polygon's vertices.
The algorithm is called the 'Ray Casting Method' """
n = len(poly)
inside = False
p1x, p1y = poly[0]
for i in range(n):
p2x, p2y = poly[i % n]
if y > min(p1y, p2y):
if y <= max(p1y, p2y):
if x <= max(p1x, p2x):
if p1y != p2y:
xinters = (y-p1y) * (p2x-p1x) / (p2y-p1y) + p1x
if p1x == p2x or x <= xinters:
inside = not inside
p1x, p1y = p2x, p2y
return inside
def point_in_polygon(x,y,poly):
“”“确定一个点是否在多边形内(否则为真、假),
其中poly是包含多边形顶点的成对(x,y)的列表。
该算法称为“光线投射方法”
n=len(poly)
内=假
p1x,p1y=poly[0]
对于范围(n)中的i:
p2x,p2y=poly[i%n]
如果y>min(p1y,p2y):
如果y投射一条光线,并计算光线穿过多边形的次数。(如果一条边正好位于光线上,这可能会很烦人,并且容易出现错误。)如果是奇数,则该点位于多边形中。否则就不行了。如果使用
非零绕组编号规则代替普通的奇偶规则
这是Adobe Postscript语言参考中的解释方式(其中“路径”一词表示定义多边形的多边形顶点列表)
非零绕组编号规则确定给定点是否为零
在路径内部,从该点到
在任何方向上无穷大,然后检查
路径的一段与光线相交。从计数0开始
每次路径段从左到右穿过光线时,规则将添加1
右键,并在段从右向左交叉时减去1。
对所有交叉点进行计数后,如果结果为0,则该点为
在道路之外;否则它就在里面
光线投射算法是否也适用于非凸情况?维基链接:这是你刚刚画的一个非常漂亮的多边形样本,就像毕加索一样。这里有一个关于算法的帮助:边界点?不是边缘?我们应该从一个有噪声的图像中插值多边形吗?你所给的图片不是一个多边形。它甚至不是闭合的或连续的。@user2357112抱歉,您可以关闭打开的部分,以便将其视为多边形。这在我的问题中并不重要。所以我的问题中给出的光线投射方法仍然适用于这种复杂多边形?@perfectionm1ng:看起来是这样的,因为每次它找到交叉点时,它似乎在内部否定。我还没有测试过,所以我不能肯定。