设置
作为用 Javascript 编写的 Web 矢量编辑工具的一部分,我正在使用类似于Concrete.js的命中画布策略来实现命中测试。大多数情况下,它工作得很好:我画了两次我的形状(一次在显示画布上,一次在命中画布上)。
在查询画布时,我检查命中画布的悬停像素并提取交互信息(即其中存储了哪个对象 ID)。
问题
这在形状内部效果很好,但在抗锯齿使存储数据无效的边界处存在严重缺陷(它与之前存在的任何背景数据混合在一起)。有没有很好的策略来处理这个数据边界问题?
如果不禁用画布方法的抗锯齿,那么我们必然会有一些跨越重叠区域的边界区域,这些区域将存储来自多个区域的合并数据。
简单的场景
在二元场景(一些前景与背景)中,可以减轻这种情况,因为我们可以假设背景没有价值,任何价值都变成了一些前景。
真实场景
但是,在背景之上多个形状相互重叠的一般场景中,是否有任何合理的错误检测策略?(或纠错,但我认为这更难)
如果我可以判断数据是无效的(即它由抗锯齿引起的扰动数据组成),那么我可以对边界处的那几个像素使用不同的策略。但我觉得在我们可以有许多重叠形状的一般情况下,无法判断我提取的数据是否有效。
当然,一种解决方案是不使用命中画布。但我想知道人们是否找到了使用命中画布的解决方案,因为它们似乎非常适合处理复杂的几何图形。
抗锯齿
理想的解决方案是禁用 anti-aliasing,我认为这对于画布方法 [*] 是不可能的。
[*] 我知道我们可以在渲染图像(例如那个问题)时禁用过滤,例如 withimageSmoothingEnabled=false
或 rescaling with image-rendering: pixelated
,但是这些并不能解决绘制形状/路径时的抗锯齿问题。