Рисование быстрых линий в Pygame - PullRequest
0 голосов
/ 20 декабря 2010

Я пытаюсь рисовать быстрые линии, используя pygame, которые не отображаются прямо на экране. У меня есть список Python, равный числу пикселей для желаемого разрешения, и я храню целочисленные значения, соответствующие количеству попаданий пикселя в алгоритм линии. Используя это, строится двухмерная тепловая карта, поэтому вместо рисования плоского значения пикселя значения пикселя увеличиваются в зависимости от того, сколько раз линия проходит через нее, а «горячие» пиксели получают более яркие цвета.

Причина, по которой мы поступаем таким образом, заключается в том, что мы заранее не знаем, сколько из этих линий будет нарисовано, и какое максимальное количество ударов по любому пикселю будет нанесено. Поскольку мы хотели бы масштабировать вывод так, чтобы каждый рендеринг имел правильные максимальные и минимальные значения RGB, мы не можем просто рисовать на экране.

Есть ли лучший способ нарисовать эти линии, чем относительно наивный алгоритм Брезенхэма? Вот критическая часть функции drawLine:

  # before the loop, to save repeated multiplications
  xm = []
  for i in range(resolution[0]):
    xm.append(i * resolution[0])

  # inside of drawLine, index into the f list, of size resolution[0] * resolution[1]
  for x in range(x0, x1 + 1):
    if steep:
      idx = y + xm[x]
      f[idx] += 1
    else:
      idx = x + xm[y]
      f[idx] += 1

Конечный результат масштабируется и выводится на экран на основе максимального значения внутри f. Например, если максимальное значение равно 1000, то можно предположить, что значение RGB каждого из пикселей равно (f [i] * 255) / 1000.

Информация профиля говорит, что во время выполнения преобладают поиски индекса в f. Я использовал предыдущие вопросы здесь, чтобы доказать, что эти базовые списки работают быстрее, чем пустые массивы или массивы в Python, но для прорисовки линий, подобных этой, все равно кажется, что есть место для улучшения.

Какой хороший и быстрый метод для рисования неизвестного числа линий на экране, зная, что в конечном итоге вы будете масштабировать вывод для рендеринга на экран? Есть ли хороший способ избавиться от издержек индекса?

1 Ответ

1 голос
/ 20 декабря 2010

Попробуйте Cython или что-то подобное. (Если вы это сделаете, мне было бы интересно узнать, если / насколько это помогло)

Cython является языком программирования для упростить написание расширения C и C ++ модули для CPython Python во время выполнения. Строго говоря, Cython синтаксис является расширенным набором синтаксиса Python дополнительно поддержка: Direct вызов функций C или C ++ функции / методы, из кода Cython. Строгая типизация переменных Cython, классы и атрибуты класса как C типы. Cython компилируется в C или C ++ код, а не Python, и результат используется как расширение Python Модуль или как отдельное приложение встраивание среды выполнения CPython. (http://en.wikipedia.org/wiki/Cython)

...