我正在编写一个 JavaScript 应用程序,它在 HTML 画布上绘制任意形状的对象。用户应该能够通过单击它们来选择任何对象。
为了使它成为 O(1) 操作,我使用了一个阴影画布,即一个未显示的画布,它具有完全相同的大小,在普通画布上绘制的每个对象也被绘制在那里 - 但颜色代表它是ID
.
所以一个简单的ghostContex.getImageData()
连同鼠标点击坐标给了我那个像素的颜色,从而给我ID
点击的对象的颜色。
所有这些都工作正常 - 除非我单击对象的确切边框。
由于它是在幽灵画布上使用抗锯齿绘制的,所以我得到了错误的颜色(因为该颜色是正确的颜色ID
和ID
之前绘制的对象的颜色之间的混合......)。这种错误的颜色代表错误ID
,因此我选择了一个完全不同的对象:(
我该如何解决这个问题?
注意 #1:我已经在使用 translate(0.5, 0.5) 技巧来防止大多数抗锯齿
注意 #2:我之前尝试使用 SVG 编写此应用程序,但尤其是这个对象选择非常慢,因为我猜它是碰撞检测的对象太多。这就是我现在想要 O(1) 方法的主要原因......哦,这样我可以很容易地在幽灵画布上画一条比在普通画布上画的线大得多的线,从而使拾取更容易。
注意#3:相关浏览器是 Firefox、Chrome、Android 2.3+ 本机和 iOS 本机