我目前正在研究“飞行标签云球”的纯html 5画布实现,你们中的许多人无疑在某些页面中被视为flash对象。
标签绘制得很好,性能也令人满意,但是canvas元素中有一件事就是打破了这个想法:你无法识别你在画布上绘制的对象,因为它只是一个简单的平面“图像”..
在这种情况下我需要做的是捕获click事件,并尝试“猜测”单击了哪个元素。所以我必须有一些矩阵,它存储画布上每个像素的标签对象的链接,并且我必须在每次重绘时更新这个矩阵。现在这听起来非常低效,在我开始尝试实现这个之前,我想问一下社区 - 在这种情况下是否有一些“众所周知”的算法可以帮助我?或者也许我只是错过了什么,答案就在幕后? :)
答案 0 :(得分:2)
这称为point location problem,它是计算几何中的基本主题之一。你可以使用很多方法比你想到的方法快得多,但细节取决于你想要完成什么。
例如,每个文本字符串都包含在边界框中。您是否只想测试用户是否点击了该框中的某个位置?然后只需存储每个渲染字符串的最小和最大坐标,并针对每个边界框测试该点,以查看它是否包含在该范围内。如果你有大量的要测试的点,你可以构建任意数量的数据结构来加快速度(例如R-trees),但是对于单点来说,构建这样一个结构的开销可能是不值得的。
如果你关心这个点是否真的落在了描边字符的不透明区域内,那么这个问题就比较棘手了。一种解决方案是使用边界框方法首先消除大部分可能性,然后将剩余的字符串一次渲染到屏幕外缓冲区,每次检查目标点是否被触摸。