一般的な問題
任意の半径の円形グラデーションを作成し、それを現在のマウス位置にマップする必要があります。このプロジェクトは主にOpenGLとPySDL2を使用していますが、従来の理由からaggdrawも使用しています( Pillowラッピング PIL を使用)。大まかに言って、SDL2 は OpenGL やほとんどの UI との対話を実行しますが、aggdraw は予想通り、描画を実行します。
私は非常に初歩的な関数を書きました。マウスの動きとグラデーションの描画の間のレイテンシーがグラデーションの半径とともに劇的に増加することを除いて機能します (私のコードを参照してください。理由は明らかです)。
以下のコードは aggdraw を使用しています。aggdraw オブジェクトは、他の場所でnumpyを使用してバイト配列に変換され、OpenGL に渡されます。
私は SDL2 描画ライブラリを使用するソリューションにはオープンですが、それを使用したことは一度もありません。そのようなソリューションのナブのように扱われていただければ幸いです。;)
特定のコンテキストに関する注意事項
私が提供したコードは非常にまばらなので、礼儀として、これは私が約1年間書いてきた大きなモジュール(KLIBS)とのインターフェースであることを言及する必要があります。上記のモジュールは主に、ここでは関係のない多くのことを行いますが、以下の関数は多くの社内コードにプラグインされます。残念ながら、このモジュールは (現在) ローカル コンテキスト用であるため、このモジュールのドキュメントをまだ作成していません。
ただし、この関数は、文字通り、私のコードです。ライブラリの残りの部分は十分にテストされています。オーバーヘッドは、他の処理から 10 ミリ秒未満です。
画面のリフレッシュ レートよりも速くこれを実行できるに違いないと思います。最大30 ミリ秒の遅延許容値があり ます (プロジェクトのコンテキストは、視覚の認知科学における大学院の研究です)。これもハードウェアに依存することはわかっています。一般的に、私たちは 3 年以内の iMac について話している。
これはもっとうまくできると確信していますが、私は深みがありません。私は通常、Web 言語 (javascript/PHP/html/css) を使用します。
def mouse_gradient(radius):
mp = mouse_pos() # custom function, just wraps fetching mouse coords from sdl2
mouse_grad = None
mouse_grad = aggdraw.Draw('RGBA', (radius, radius), (0, 0, 0, 0))
for n in range(radius):
n = float(n)
r = float(radius - n)
opacity = int(( 0.25 * n / radius) * 100)
brush = aggdraw.Brush((255, 0, 0), int(opacity))
tl = (radius - r) // 2 # ie. top-left
br = (radius - r) // 2 + r # ie. bottom-right
mouse_grad.ellipse((tl, tl, br, br), brush)
return mouse_grad # where it is subsequently blit to the screen