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