我正在设计一个管理矩形集合的类。 每个矩形代表一个按钮,因此包含以下属性:
概念本身相当简单,通过命令行界面进行管理。特别是。
如果我输入“100,125”,它会查找是否有包含此点(或多个)的矩形并执行其回调函数。
我的建议是遍历此集合中的所有矩形并执行包含此点的每个矩形的回调,或者停止匹配的第一个矩形(模拟z顺序)。
然而,我担心这个解决方案是草率的,因为这个迭代变得越来越长,我拥有的矩形越多。 这对于控制台应用程序来说很好,因为它可以轻松地超过10,000个矩形并找到哪些矩形匹配,计算费用昂贵,但是时间问题并不是特别重要。问题在于,如果我要在GUI应用程序中实现此算法,每次移动鼠标时需要执行此检查(以模拟鼠标悬停效果),将鼠标移动到具有10,000个对象的面板上10个像素将要求检查100,000个物体,即使是1000像素或者超过1000个像素的物体往往会将鼠标移动到。
这个问题是否有更优雅的解决方案,或者这些程序是否总是需要如此昂贵?
注意:我知道大多数GUI不必同时处理10,000个活动对象,但这不是我的目标。 我选择用按钮解释这个问题的原因是因为它们更简单。理想情况下,我想要一个能够在GUI中工作的解决方案,以及与鼠标和其他要求苛刻的系统交互的粒子系统。
在GUI中,我可以轻松地使用间接来大幅减少检查量,但这并不能缓解 需要在每次移动鼠标时执行检查,即使有25个按钮也可能非常苛刻,因为移动超过400像素的25个对象(在理想条件下)将与移动1个像素的10,000个对象一样糟糕。 / p>
简而言之,这个问题有两个方面:
感谢任何帮助!
答案 0 :(得分:4)
您可以应用任意数量的2D交叉加速结构。例如,您可以使用四叉树(http://en.wikipedia.org/wiki/Quadtree)递归地将视口划分为象限。细分不完全落在每个矩形内或完全位于每个矩形之外的每个象限,并在每个叶子上放置指向顶部或矩形列表的指针(如果没有矩形落在那里,则为NULL
)。结构并不简单,但在概念上它相当简单。
答案 1 :(得分:2)
是否有更优雅的解决方案可以解决这个问题,或者是这样的程序 总是需要这么贵?
不是对所有对象进行线性搜索,而是使用像四叉树这样的数据结构,可以有效地找到最近的对象。
或者,您可以根据算法的预期用途提出更实际的要求。一次可见10,000个按钮的GUI是一个很糟糕的设计,原因很多,主要原因是穷人用户很难找到合适的按钮。从性能的角度来看,通过UI的更典型的多个矩形进行线性搜索,比如介于2和100之间,这将是没有问题的。