有没有办法优化对齐对象算法?

时间:2014-02-13 13:10:04

标签: algorithm optimization

所以我有n个物体可以在舞台上拖动,我希望它们在你将它们足够靠近时相互扣合(锁定,磁铁......)。这意味着在每次鼠标移动事件中计算从拖动对象到舞台上每个其他对象的距离。这可以优化吗?比如仅将距离与关闭对象进行比较,但如何在不先计算所有距离的情况下知道哪些是关闭?

由于

3 个答案:

答案 0 :(得分:4)

您可以使用k-d tree。 K-d树具有有效的“找到最近邻居”功能。只需确保已经“到位”的每个对象都在您的树中,当您移动元素时 - 找到它最近的邻居,并检查它是否足够接近。


替代方案(主要用于网格)使用observer pattern。每当你放置一个物体时 - 画出它的'影响'开始的线。使用观察者将此行上的每个“单元格”附加到该行上,当您将对象移动到单元格时,如果它附有任何观察者,则调用它们。

答案 1 :(得分:2)

两个想法:

  1. 您可以将舞台划分为某个尺寸的“平铺”(例如,64x64像素?)。如果您知道哪个图块会重叠(部分或完全)给定图块,您可以将点击检测限制为那些。

  2. 您可以维护一个(已排序的!)地图,该地图将给定的“y”坐​​标映射到该“y”位置上的所有对象。 y坐标处的每个对象列表也会被排序,从而按照X顺序对对象进行排序。通过使用下限/上限(可以有效地计算排序序列),您可以快速获取某个边界矩形内所有对象的句柄。

答案 2 :(得分:1)

对这类问题的经典解决方案是将空间递归地划分为区域。您只搜索近距离的邻居。对此的经典数据结构是QuadTree,其中正方形被切割成四个正方形。