在pygame中绘制快速线条

时间:2010-12-20 16:55:58

标签: python pygame bresenham

我正在尝试使用未直接渲染到屏幕的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数组或数组更快,但是对于这样的绘制线,它似乎还有改进的余地。

在屏幕上绘制未知行数的好方法是什么,知道你最终会缩放输出以呈现到屏幕上?有没有一种摆脱索引开销的好方法?

1 个答案:

答案 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)