画面に直接レンダリングされない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の配列よりも高速であることを証明しましたが、このような線を描画する場合は、まだ改善の余地があるようです。
画面にレンダリングするために最終的に出力をスケーリングすることを知って、画面に未知の数の線を描画するための優れた高速な方法は何ですか?インデックスのオーバーヘッドを取り除く良い方法はありますか?