Когда я работал над проектом в 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 одинаков для обоих выражений.