HTML キャンバス上に任意の形状のオブジェクトを描画する JavaScript アプリケーションを作成しています。ユーザーは、オブジェクトをクリックして選択できる必要があります。
これを O(1) 操作にするために、シャドウ キャンバスを使用しています。つまり、まったく同じサイズの非表示キャンバスです。通常のキャンバスに描画される各オブジェクトもそこに描画されますが、それを表す色を使用しID
ます。
したがって、単純なghostContex.getImageData()
マウス クリック座標と一緒にすると、そのピクセルの色、つまりID
クリックされたオブジェクトの色がわかります。
オブジェクトの正確な境界線をクリックした場合を除いて、すべて正常に機能しています。
ゴーストキャンバスでアンチエイリアスを使用して描画すると、間違った色になります(その色は、以前に描画されたその下のオブジェクトの正しい色と の混合物です...)ID
。ID
この間違った色は間違っているID
ことを表しているので、まったく別のオブジェクトを選択しています:(
どうすればその問題を解決できますか?
注 #1: ほとんどのアンチエイリアシングを防ぐために、translate(0.5, 0.5) トリックを既に使用してい
ます。衝突検出にはオブジェクトが多すぎます。それが、今 O(1) アプローチが必要な主な理由です...ああ、この方法で、通常のキャンバスに描かれる線よりもはるかに大きな線をゴーストキャンバスに簡単に描くことができ、ピッキングがはるかに簡単になります。
注 3: 関連するブラウザは、Firefox、Chrome、Android 2.3 以降のネイティブおよび iOS ネイティブです。