我正在尝试使用不直接呈现到屏幕的 pygame 绘制快速线条。我有一个与所需分辨率的像素数一样大的 Python 列表,并存储与线算法命中该像素的次数相对应的整数值。使用它,建立了一个 2D 热图,因此不是绘制一个平面像素值,而是根据一条线穿过它的次数增加像素值,并且“热”像素获得更亮的颜色。
这样做的原因是我们事先不知道要绘制多少条线,以及任何给定像素将被击中的最大次数。由于我们希望缩放输出,以便每次渲染都具有正确的最大和最小 RGB 值,因此我们不能只绘制到屏幕上。
有没有比相对幼稚的 Bresenham 算法更好的方法来绘制这些线?这是 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 中的 numpy 数组或数组更快,但是对于像这样绘制线条,似乎仍有改进的空间。
什么是在屏幕上绘制未知数量的线的好且快速的方法,知道您最终将缩放输出以渲染到屏幕上?有没有摆脱索引开销的好方法?