Я пытаюсь рисовать быстрые линии, используя 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, но для прорисовки линий, подобных этой, все равно кажется, что есть место для улучшения.
Какой хороший и быстрый метод для рисования неизвестного числа линий на экране, зная, что в конечном итоге вы будете масштабировать вывод для рендеринга на экран? Есть ли хороший способ избавиться от издержек индекса?