0

我目前正在开发一个用户界面,在该界面中,可以通过单击屏幕来添加对象。我不想要任何重叠的对象。虽然很容易检测到两个对象之间是否发生碰撞,但我仍在努力解决这些冲突。

目前,我正在通过将侵​​入物体从碰撞中移开来解决本地冲突。然而,这可能会导致新的冲突,这些冲突以相同的方式解决。不幸的是,不能保证这个过程会永远停止。

是否有任何与此相关的标准问题或要使用的算法?或者任何不容易无限递归的有效解决方案?

4

3 回答 3

0

我能想到的解决问题的最简单方法是实现“网格捕捉”行为。

基本上,框架中只有预定义的区域,用户可以在其中添加 UI 元素——网格单元。当用户在你的框架上放置一个 UI 元素时,你应该检测它主要落在网格中的哪个位置(你可以选择你自己的行为,以防它在两个或多个网格单元格中均等地落下)。这样,您根本不需要检测两个 UI 元素之间的冲突。

编辑

好吧,我当然没有预料到您在评论中概述的情况。如果您的对象的大小会有很大差异,我承认“网格捕捉”可能不适用于您的情况——您最终可能会得到很多空白空间。当我撰写答案时,我正在考虑一些类似于 Visual Basic 的东西(据我所知,VB确实实现了某种网格捕捉行为)。

一个小问题:虽然通过让用户精确控制 UI 元素的位置,您可能将用户的最大利益放在心上,但请考虑您的用户将如何与您的程序交互。使用鼠标在屏幕上准确定位东西可能是一种惩罚,它可能只会适得其反。但是,如果您保证您的用户将始终使用触摸屏设备,则不能这样说。

于 2013-11-13T10:30:49.580 回答
0

“网格捕捉”是在避免问题,但不是解决问题的方法。

正如莎拉指出的那样,您可以通过将对象移动到一个方向随机距离来解决此问题,然后再次检查是否存在碰撞,然后移动碰撞对象。但是,这可能导致问题呈指数级增长。

相反,您可以尝试实现一个轻型物理引擎,让您的对象相互“反弹”,并在一段时间后使用摩擦停止。尝试谷歌连续避免碰撞。

于 2013-11-13T13:25:27.093 回答
0

现在我想得更多,我认为您只需移动所有位于您已经在移动的方向上的对象。这样做你基本上解决了可能无限递归的问题。

由于您应该知道要移动的对象的大小和智能移动的方向,这应该可以解决问题

于 2013-11-13T15:35:27.763 回答