私は現在heatmap.js<canvas>
の修正に取り組んでおり、の 2D レンダリング コンテキストで次の効果を達成できるかどうかを誰かが知っているかどうか疑問に思っていました。
- 黒 (アルファ 0.5) から透明な 40 ピクセルの半径までの放射状グラデーションがあります。放射状グラデーションの中心は x=50、y=50 です
- 黒 (アルファ 0.5) から透明な半径 40 ピクセルまでの別の放射状グラデーションがあります。放射状グラデーションの中心は x=80、y=50 です。
2 つのグラデーションが重なっています。私の問題は次のとおりです。重なり合う領域が合計され、放射状グラデーションの中心よりも高いアルファ値が得られ、誤ったデータが表示されます(たとえば、グラデーション間の追加により、ヒートマップのよりホットな領域が表示されます)。
次の要点を見てください。コンソールで実行すると、問題を確認できます。
予想される動作は次のとおりです。最も暗い領域はグラデーションの中心であり、2 つのグラデーションの重なり合う領域はマージされますが、加算されません。
globalCompositeOperations のいずれも期待どおりの動作にならなかったことを確認した後、これらの操作の組み合わせを試しました。私がそれが可能かもしれないと思った方法は次のとおりでした:
- 最初のグラデーションを描く
- 複合操作の「宛先アウト」を使用してください
- 2 番目のグラデーションを描画 -> 最初のグラデーションから重複領域を減算します
- compositeOperation 'source-over' を使用する
- 2 番目のグラデーションを再度描画する
残念ながら、うまくいく組み合わせは見つかりませんでした。フィードバックをお待ちしております。よろしくお願いします。
PS: ピクセルを手動で操作することでこれを実行できることはわかっていますが、そのためのより簡単でエレガントで高速なソリューションがあるかどうか疑問に思っていました。