0

我正在尝试使用不直接呈现到屏幕的 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 数组或数组更快,但是对于像这样绘制线条,似乎仍有改进的空间。

什么是在屏幕上绘制未知数量的线的好且快速的方法,知道您最终将缩放输出以渲染到屏幕上?有没有摆脱索引开销的好方法?

4

1 回答 1

1

尝试 Cython 或类似的东西。(如果你这样做,我很想知道这是否/有多大帮助)

Cython 是一种编程语言,用于简化为 CPython Python 运行时编写 C 和 C++ 扩展模块。严格来说,Cython 语法是 Python 语法的超集,另外还支持:从 Cython 代码直接调用 C 函数或 C++ 函数/方法。Cython 变量、类和类属性的强类型化为 C 类型。Cython 编译为 C 或 C++ 代码而不是 Python,其结果用作 Python 扩展模块或嵌入 CPython 运行时的独立应用程序。(http://en.wikipedia.org/wiki/Cython)

于 2010-12-20T17:02:14.347 回答