关于对象管理器

问题描述:

我正在设计一个管理矩形集合的类。 每个矩形代表一个键,使包含以下属性:关于对象管理器

  • x位置
  • y位置
  • 宽度
  • 高度
  • 为被按压时,它会发生什么的回调函数。

这个概念本身非常简单,通过命令行界面进行管理。尤其是。

如果我输入“100,125”,它会查找是否有一个包含这个点(或多个)的矩形并执行它们的回调函数。

我的建议是遍历此集合中的所有矩形,并执行包含此点的每个单独矩形的回调,或停止匹配的第一个矩形(模拟z次序)。

但是我担心这个解决方案是sl,的,因为这个迭代变得越长,我的矩形就越长。 这对于控制台应用程序来说很好,因为它可以轻松地超过10,000个矩形,并找到哪些匹配,昂贵的计算,但时间明智,这不是特别的问题。

问题是,如果我要在每次移动鼠标(模拟鼠标移动效果)时都需要执行此检查的GUI应用程序中实现此算法,请将移动鼠标10个像素移动到面板上的10,000个对象将需要检查100,000个物体,甚至不超过1000个像素,否则人们会倾向于将鼠标移动到。

这个问题有没有更优雅的解决方案,还是这样的程序总是需要如此昂贵?

注意:我知道大多数GUI不必一次处理10,000个活动对象,但这不是我的目标。 我选择用按钮来解释这个问题的原因是因为它们更简单。理想情况下,我希望能够在GUI中工作的解决方案以及与鼠标交互的粒子系统以及其他要求严格的系统。

在GUI中,我可以很容易地使用间接方式来大幅减少检查的数量,但这并不能减轻每次移动鼠标时都需要执行检查的问题,即使存在25个按钮,当移动超过400个像素时,有25个对象(在理想条件下)会与移动1个像素10000个对象一样糟糕。

概括地说,这个问题是双重的:

  1. 我能做些什么来减少检查的10000量(授予有10,000个对象)。
  2. 是否有可能减少这种GUI应用程序所需的检查量,从每一次鼠标移动到更合理的事情。

任何帮助表示赞赏!

+1

显然,您可以对对象矩形进行排序,因此您可以快速搜索哪些属于“范围内”(如果每个矩形都是全屏幕,则不会有太大的帮助 - 但是,如果您确实有z顺序为好吧,最重要的应该是“主动”的,但我认为大多数GUI系统不能很好地处理屏幕上同时处于“活动”状态的数千个对象。 –

您可以应用任意数量的2D交叉加速结构。例如,您可以使用四叉树(http://en.wikipedia.org/wiki/Quadtree)以递归方式将视口分为象限。细分未完全落入每个矩形内或完全落在每个矩形外的每个象限,并将指针放置在每个叶子的顶部或矩形列表(如果没有矩形落在那里,则为NULL)。结构不是微不足道的,但在概念上相当简单。

有没有更优雅的解决方案来解决这个问题,还是这样的程序总是需要如此昂贵?

而不是通过所有对象做一个线性搜索,你可以使用一个数据结构就像一个四叉树,可以让你有效地找到最近的对象。或者,您可以根据算法的预期用途想出一组更为现实的需求。一次可见10,000个按钮的GUI是一个糟糕的设计,原因很多,主要原因是穷人用户很难找到正确的按钮。从性能的角度来看,通过大量用户界面的典型矩形进行线性搜索,比如介于2到100之间。