【问题标题】:How can I implement this point in polygon code in Python?如何在 Python 的多边形代码中实现这一点?
【发布时间】:2019-02-22 17:35:31
【问题描述】:

因此,对于我的计算机图形课程,我的任务是制作多边形填充,我的软件渲染器目前正在 Python 中编码。现在,我想测试我在How can I determine whether a 2D Point is within a Polygon? 找到的这个 pointInPolygon 代码,这样我以后就可以根据自己的方法制定自己的方法。

代码是:

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{
  int i, j, c = 0;
  for (i = 0, j = nvert-1; i < nvert; j = i++) {
    if ( ((verty[i]>testy) != (verty[j]>testy)) &&
     (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )
       c = !c;
  }
  return c;
}

我在 Python 中重新创建它的尝试如下:

def pointInPolygon(self, nvert, vertx, verty, testx, testy):
    c = 0
    j = nvert-1
    for i in range(nvert):
        if(((verty[i]>testy) != (verty[j]>testy)) and (testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i] + vertx[i]))):
           c = not c

        j += 1

    return c

但这显然会在第二次迭代中返回一个超出范围的索引,因为 j = nvert 并且它会崩溃。

提前致谢。

【问题讨论】:

    标签: python c python-3.x


    【解决方案1】:

    您正在错误地阅读棘手的 C 代码。 j = i++ 的意义在于将i 加一和将old 值分配给j。类似的python代码会在循环结束时执行j = i:

    j = nvert - 1
    for i in range(nvert):
        ...
        j = i
    

    这个想法是,对于nvert == 3,值会消失

     j | i
    ---+---
     2 | 0
     0 | 1
     1 | 2
    

    实现此目的的另一种方法是 j 等于 (i - 1) % nvert,

    for i in range(nvert):
        j = (i - 1) % nvert
        ...
    

    即它落后一个,索引形成一个环(就像顶点一样)


    更多 pythonic 代码将使用itertools 并自行迭代坐标。您将有一个名为 vertices 的 pairs (tuples) 列表和两个迭代器,其中一个是一个顶点在另一个之前,并且由于itertools.cycle,类似:

    # make one iterator that goes one ahead and wraps around at the end
    next_ones = itertools.cycle(vertices)
    next(next_ones)
    for ((x1, y1), (x2, y2)) in zip(vertices, next_ones):
        # unchecked...
        if (((y1 > testy) != (y2 > testy)) 
                and (testx < (x2 - x1) * (testy - y1) / (y2-y1 + x1))):
           c = not c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      相关资源
      最近更新 更多