Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 随机形状多边形中的点?_Python_Algorithm - Fatal编程技术网

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:看起来是这样的,因为每次它找到交叉点时,它似乎在内部否定
。我还没有测试过,所以我不能肯定。