簡體   English   中英

在Pygame中繪制快速線

[英]Drawing fast lines in pygame

我正在嘗試使用不直接渲染到屏幕上的pygame繪制快速線條。 我有一個與所需分辨率一樣大的像素數量的Python列表,並存儲與該線算法命中該像素的次數相對應的整數值。 使用此方法,可以建立2D熱圖,因此,與其繪制平面像素值,不如根據一條線穿過它的次數來增加像素值,並且“熱”像素將獲得較亮的顏色。

這樣做的原因是我們事先不知道要繪制多少條線,以及不打任何給定像素的最大次數。 由於我們希望縮放輸出,以便每個渲染具有正確的最大和最小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的索引查找決定。 我在這里使用先前的問題來證明這些基本列表比numpy數組或Python中的數組要快,但是對於繪制這樣的線條,似乎仍有改進的空間。

在知道最終要縮放輸出以呈現到屏幕上時,有什么好方法可以在屏幕上繪制未知數量的線? 是否有擺脫索引開銷的好方法?

嘗試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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM