我正在尝试使用未直接渲染到屏幕的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数组或数组更快,但是对于这样的绘制线,它似乎还有改进的余地。
在屏幕上绘制未知行数的好方法是什么,知道你最终会缩放输出以呈现到屏幕上?有没有一种摆脱索引开销的好方法?
答案 0 :(得分:1)
尝试Cython或类似的东西。 (如果你这样做,我会对知道是否/多少有帮助感兴趣)
Cython是一种编程语言 简化编写C和C ++扩展 CPython Python的模块 运行。严格来说,Cython 语法是Python语法的超集 另外支持:直接 调用C函数或C ++ 函数/方法,来自Cython代码。 强类型的Cython变量, 类和类属性为C. 类型。 Cython编译为C或C ++ 代码而不是Python,而且 结果用作Python扩展 模块或作为独立的应用程序 嵌入CPython运行时。 (http://en.wikipedia.org/wiki/Cython)