gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:41:41 25 4
gpt4 key购买 nike

因此,对于我的计算机图形学类(class),我的任务是制作多边形填充器,我的软件渲染器目前正在使用 Python 进行编码。现在,我想测试我在以下位置找到的 pointInPolygon 代码:How can I determine whether a 2D Point is within a Polygon?这样我以后就可以在此基础上制定自己的方法。

代码是:

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 并且它会崩溃。

提前致谢。

最佳答案

您错误地阅读了棘手的 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
...

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

<小时/>

更多Python代码将使用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

关于python - 如何在Python中的多边形代码中实现这个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54832364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com