如何在Python的多边形代码中实现这一点?

2024-05-16 02:21:40 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,在我的计算机图形学课上,我的任务是做一个多边形填充,我的软件渲染器目前是用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,它会崩溃。你知道吗

提前谢谢。你知道吗


Tags: 代码forreturnif计算机float多边形int
1条回答
网友
1楼 · 发布于 2024-05-16 02:21:40

你读错了复杂的C代码。j = i++的要点是将i增加一个,并旧的值赋给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并迭代坐标本身。您将拥有一个名为顶点对(元组)列表,以及两个迭代器,其中一个顶点在另一个顶点之前,并且由于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

相关问题 更多 >