0

画面に直接レンダリングされない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の配列よりも高速であることを証明しましたが、このような線を描画する場合は、まだ改善の余地があるようです。

画面にレンダリングするために最終的に出力をスケーリングすることを知って、画面に未知の数の線を描画するための優れた高速な方法は何ですか?インデックスのオーバーヘッドを取り除く良い方法はありますか?

4

1 に答える 1

1

Cythonまたは同様のものを試してください。(もしそうなら、それが役に立ったかどうか/どれだけ役に立ったかを知りたいと思います)

Cythonは、CPythonPythonランタイム用のCおよびC++拡張モジュールの記述を簡素化するためのプログラミング言語です。厳密に言えば、Cython構文はPython構文のスーパーセットであり、CythonコードからのC関数またはC++関数/メソッドの直接呼び出しを追加でサポートします。Cython変数、クラス、およびクラス属性のC型としての強い型付け。CythonはPythonではなくCまたはC++コードにコンパイルされ、その結果はPython拡張モジュールまたはCPythonランタイムを組み込んだスタンドアロンアプリケーションとして使用されます。(http://en.wikipedia.org/wiki/Cython)

于 2010-12-20T17:02:14.347 に答える