PySequence\u GetItem()和TwoIntsFromObj()是如何工作的?

2024-09-30 14:33:50 发布

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

当我在pygame中处理一个项目时,我注意到pygame.draw.line()pygame.draw.lines()的工作方式有点不同。我想要的结果是由pygame.draw.lines()生成的,它不像pygame.draw.line()那样生成奇怪的行。但是我需要在pygame模块PIL中重复这个过程,在那里它没有一个同时绘制多行的函数。你知道吗

为了模拟这个过程,我仔细研究了上面提到的两个函数的内部编码。我得到的是大量的C代码和指针,对我来说太多了。见here。你知道吗

我确实发现了一个可疑的代码块,我不完全理解。但如果我这样做了,我想我也许可以把它编码成python。所以我需要帮助。。。你知道吗

for(loop = 1; loop < length; ++loop)
{
    item = PySequence_GetItem(points, loop);  
    result = TwoIntsFromObj(item, &x, &y);  
    Py_DECREF(item);
    if(!result) continue; /*note, we silently skip over bad points :[ */

我可以推断PySequence GetItem()返回一个PyObject对应于循环(即索引)。但是TwoIntsFromObj()对我来说太多了。见here。你知道吗

编辑:
所以为了把事情弄清楚一点,我会解释一下我想做什么。我想把一幅图表示成一系列Z阶曲线。台阶比“暗”部分大,比“光”部分小。我做了一个算法,一个用于“替换”较低密度区域的递归函数。但是pygame.draw.linefor循环不像pygame.draw.lines那样画得很好。图片在下面的链接中…
abnormal Z-order curve
normal Z-order curve
有趣的是,它甚至不是一条连续的线:(
它是否与我的for循环有关?你知道吗

#  draw.aaline
for i in range(len(oldGridCopy)-1): 
    if SEE: 
        pygame.draw.aaline(windowSurface, BLACK, (oldGridCopy[i][0]*oldGridCopy[i][4] +left, oldGridCopy[i][1]*oldGridCopy[i][5] +top), (oldGridCopy[i+1][0]*oldGridCopy[i][4] +left, oldGridCopy[i+1][1]*oldGridCopy[i][5] +top),10)           
        pygame.display.flip()
        fpsClock.tick(2)#FPS*FPS*FPS) 
    pointList.append([oldGridCopy[i+1][0]*oldGridCopy[i+1][4] +left,oldGridCopy[i+1][1]*oldGridCopy[i+1][5] +top])

return pointList,oldGridCopy

#  draw.aalines

if MIRO:
    pygame.draw.aalines(windowSurface, BLUE, False, miro) # miro is pointList

复杂性的原因有点难以解释。代码只处理点的(x,y)位置(浮点类型)。两个表达式的点列表相同。你知道吗


Tags: 代码loopforif过程toplineitem