Как работает PySequence_GetItem () и TwoIntsFromObj ()? - PullRequest
0 голосов
/ 03 июня 2018

Когда я работал над проектом в Pygame, я заметил, что pygame.draw.line() и pygame.draw.lines() работают по-разному.Результат, который я хотел, был получен pygame.draw.lines(), который не делал странных строк, как pygame.draw.line().Но мне нужно было повторить этот процесс в модуле Pygame PIL, где у него не было функции рисования нескольких линий одновременно.

Поэтому, чтобы имитировать процесс, я заглянул во внутренние кодировки упомянутых двух функцийвыше.То, что я получил, было тонной C-кодировок и указателей, которые были слишком для меня.См. здесь .

Я нашел подозрительно выглядящий кусок кода, который я не до конца понимаю.Но если я это сделаю, я думаю, что смогу закодировать это в 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() это слишком много для меня.См. здесь .

РЕДАКТИРОВАТЬ:
Итак, чтобы прояснить ситуацию немного, я объясню, что я пытаюсь сделать.Я хочу выразить картину в серии кривых Z-порядка.Ступени больше по «темным» частям и меньше по «светлым».Я сделал алгоритм, рекурсивную функцию для «замены» менее плотных областей.Но for цикл pygame.draw.line не очень хорошо рисует, как pygame.draw.lines.Картинки ниже в виде ссылки ...
ненормальная кривая Z-порядка
нормальная кривая Z-порядка
Самое смешное, что это даже не внепрерывная линия: (
Будет ли это как-то связано с моим 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) точек (тип с плавающей точкой). PointList одинаков для обоих выражений.

...