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

如何在Python的多边形代码中实现这一点?,python,c,python-3.x,Python,C,Python 3.x,所以,在我的计算机图形学课上,我的任务是做一个多边形填充,我的软件渲染器目前正在用Python编写。现在,我想测试我在找到的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++

所以,在我的计算机图形学课上,我的任务是做一个多边形填充,我的软件渲染器目前正在用Python编写。现在,我想测试我在找到的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;
}
int-pnpoly(int-nvert,float*vertx,float*verty,float-testx,float-testy)
{
int i,j,c=0;
对于(i=0,j=nvert-1;itesty)!=(verty[j]>testy))&&
(testx<(vertx[j]-vertx[i])*(testy-verty[i])/(verty[j]-verty[i])+vertx[i]))
c=!c;
}
返回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
def pointInPolygon(self、nvert、vertx、verty、testx、testy):
c=0
j=nvert-1
对于范围内的i(nvert):
如果((verty[i]>testy)!=(verty[j]>testy))和(testx<(vertx[j]-vertx[i])*(testy-verty[i])/(verty[j]-verty[i]+vertx[i]):
c=不是c
j+=1
返回c
但这显然会在第二次迭代中返回一个超出范围的索引,因为j=nvert,它会崩溃


提前感谢。

您错误地阅读了复杂的C代码。
j=i++
的要点是将
i
增加1,并将旧的值分配给
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
    ...
i、 e.它落后一个,索引形成一个环(就像顶点一样)


更多的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
#制作一个迭代器,该迭代器在前面一个迭代器,在最后一个迭代器结束
下一个=itertools.cycle(顶点)
下一个(下一个)
对于zip中的((x1,y1),(x2,y2))(顶点,下一个顶点):
#未经检查。。。
如果((y1>testy)!=(y2>testy))
和(testx<(x2-x1)*(testy-y1)/(y2-y1+x1)):
c=不是c