【问题标题】:Point in random-shape polygon?点在随机形状的多边形中?
【发布时间】:2013-11-22 06:59:52
【问题描述】:

使用著名的光线投射算法可以轻松确定一个点是否在多边形中。

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

但是如果多边形不是完全凸的呢?

在给定边界点的情况下,我如何确定一个点是否在随机形状多边形中?

假设我有一个边界点的多边形,像这样

我该怎么做?

最好使用 Python,但也欢迎任何通用解决方案。

【问题讨论】:

  • 光线投射算法在非凸情况下也不起作用吗?维基链接:en.wikipedia.org/wiki/Point_in_polygon
  • 那是你刚刚画的一个非常漂亮的多边形样本,就像毕加索一样。这是算法的帮助:alienryderflex.com/polygon
  • 边界?不是边缘?我们是否应该从嘈杂的图像中插入多边形?你给出的图片无论如何都不是一个多边形。它甚至不是封闭的或连续的。
  • @user2357112 很抱歉造成混乱,您可以关闭打开的部分以将其视为多边形。在我的问题中没那么重要。

标签: python algorithm


【解决方案1】:

投射光线,并计算光线穿过多边形的次数。 (如果边缘正好位于射线上,这会变得烦人且容易出错。)如果它是奇数,则该点位于多边形中。否则,它不是。

【讨论】:

  • 所以我的问题中给出的光线投射方法仍然适用于这种复杂的多边形?
  • @perfectm1ng:看起来像,因为它似乎在每次找到交叉点时都在否定inside。我没有测试过,所以不能肯定。
【解决方案2】:

实际上,如果您使用光线投射方法,则可以使用 非零绕组数规则,而不是常见的奇偶规则

这是 Adob​​e 的 Postscript Language Reference 中解释的方式(其中“路径”一词表示定义多边形的多边形顶点列表)。

非零绕组数规则确定给定点是否为 通过在概念上从该点绘制一条射线到路径内 在任何方向无穷大,然后检查一个地方 路径的一部分穿过射线。从计数 0 开始, 每次路径段从左到右穿过射线时,规则加 1 每次一个线段从右到左交叉时减 1。 计算所有的交叉点后,如果结果为 0,则该点为 路径外;否则它在里面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多