我目前正在开发一个用户界面,在该界面中,可以通过单击屏幕来添加对象。我不想要任何重叠的对象。虽然很容易检测到两个对象之间是否发生碰撞,但我仍在努力解决这些冲突。
目前,我正在通过将侵入物体从碰撞中移开来解决本地冲突。然而,这可能会导致新的冲突,这些冲突以相同的方式解决。不幸的是,不能保证这个过程会永远停止。
是否有任何与此相关的标准问题或要使用的算法?或者任何不容易无限递归的有效解决方案?
我目前正在开发一个用户界面,在该界面中,可以通过单击屏幕来添加对象。我不想要任何重叠的对象。虽然很容易检测到两个对象之间是否发生碰撞,但我仍在努力解决这些冲突。
目前,我正在通过将侵入物体从碰撞中移开来解决本地冲突。然而,这可能会导致新的冲突,这些冲突以相同的方式解决。不幸的是,不能保证这个过程会永远停止。
是否有任何与此相关的标准问题或要使用的算法?或者任何不容易无限递归的有效解决方案?
我能想到的解决问题的最简单方法是实现“网格捕捉”行为。
基本上,框架中只有预定义的区域,用户可以在其中添加 UI 元素——网格单元。当用户在你的框架上放置一个 UI 元素时,你应该检测它主要落在网格中的哪个位置(你可以选择你自己的行为,以防它在两个或多个网格单元格中均等地落下)。这样,您根本不需要检测两个 UI 元素之间的冲突。
好吧,我当然没有预料到您在评论中概述的情况。如果您的对象的大小会有很大差异,我承认“网格捕捉”可能不适用于您的情况——您最终可能会得到很多空白空间。当我撰写答案时,我正在考虑一些类似于 Visual Basic 的东西(据我所知,VB确实实现了某种网格捕捉行为)。
一个小问题:虽然通过让用户精确控制 UI 元素的位置,您可能将用户的最大利益放在心上,但请考虑您的用户将如何与您的程序交互。使用鼠标在屏幕上准确定位东西可能是一种惩罚,它可能只会适得其反。但是,如果您保证您的用户将始终使用触摸屏设备,则不能这样说。
“网格捕捉”是在避免问题,但不是解决问题的方法。
正如莎拉指出的那样,您可以通过将对象移动到一个方向随机距离来解决此问题,然后再次检查是否存在碰撞,然后移动碰撞对象。但是,这可能导致问题呈指数级增长。
相反,您可以尝试实现一个轻型物理引擎,让您的对象相互“反弹”,并在一段时间后使用摩擦停止。尝试谷歌连续避免碰撞。
现在我想得更多,我认为您只需移动所有位于您已经在移动的方向上的对象。这样做你基本上解决了可能无限递归的问题。
由于您应该知道要移动的对象的大小和智能移动的方向,这应该可以解决问题