【发布时间】:2014-03-22 23:55:10
【问题描述】:
情况:
- 我有一组 X(例如 10,000)个捕获的屏幕坐标。
- 屏幕上显示的是虚拟键盘。这呈现为相邻矩形控件的行(在本例中为边框控件)。
- 我想将每个屏幕坐标转换为在执行标准点击测试时它会点击的键,即坐标所在的键。
- 这需要尽可能高效地完成。
可能的解决方案:
- 生成一组键位置,其中包含每个键的屏幕坐标(LeftX、RightX、TopY、BottomY),并在屏幕键盘移动/调整大小时更新。
- 遍历我捕获的屏幕坐标并查找它与哪个键相关。
问题:
忽略并行执行循环的潜在收益,我想了解用于获取屏幕坐标并根据存储的键位置集执行匹配键查找的最佳结构和查找技术。
知道键盘上的键水平和垂直相邻,我可以使用它来优化查找,例如创建键行的哈希表并使用屏幕坐标的 Y 组件返回 null(坐标不在键盘上)或另一个表示该行中键的哈希表。然后我可以使用屏幕坐标的 X 组件进行类似的查找。
请记住,键通常不会与列对齐,因此我必须先查找一行,然后再查找一行中的键,而不是将屏幕坐标的 X 组件与列匹配,然后查找键入该列。
我怀疑使用标准 WPF 命中测试会非常低效,因为它会针对坐标下所有可能的视觉效果进行测试,而我只关心单个图层。
感谢您给我的任何帮助。这可能是微不足道的,但我不熟悉基于一系列值的哈希方法
【问题讨论】:
-
我认为方法是错误的。将每个键盘键表示为一个矩形,执行
Rectangle.Contains(point)进行命中测试。该过程将迭代一个键的矩形数组并进行命中测试,直到通过命中测试或数组结束。您可以通过将大多数常用键矩形放入数组的开头来对其进行一些优化。 -
你想达到什么目的?我可能遗漏了一些东西,但我想不出这种验证的任何目的,也许你不需要它!或者我我遗漏了一些东西,在这种情况下,更多细节会有所帮助。
-
我有一个屏幕键盘和一组外部捕获的屏幕坐标。我想将坐标转换为它们相交的一组键,以便我可以使用该信息进行进一步处理。我只是在想最好的方法。
-
@Sinatr 是的,但创建地图的目的是我可以优化该查找,而不是通过键(包括 Contains() 方法添加的任何开销)为每个坐标执行线性搜索.我正在尝试删除该线性搜索,因为它效率低下,因为我知道应该允许我优化它的布局。没有?