Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 二维碰撞分辨率_User Interface_Geometry_Collision - Fatal编程技术网

User interface 二维碰撞分辨率

User interface 二维碰撞分辨率,user-interface,geometry,collision,User Interface,Geometry,Collision,我目前正在开发一个用户界面,通过点击屏幕可以添加对象。我不想要任何重叠的物体。虽然很容易检测到两个对象之间是否发生了碰撞,但我仍在努力解决这些冲突 目前,我正在通过将入侵对象从碰撞中移开来解决本地冲突。然而,这可能导致新的碰撞,并以相同的方式解决。不幸的是,无法保证这一进程将永远停止 是否存在与此相关的标准问题或使用的算法?或者任何不容易无限递归的有效解决方案?我能想到的解决问题的最简单方法是实现“网格捕捉”行为 基本上,框架中只有预定义的区域,用户可以在其中添加UI元素——网格单元。当用户在您

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

目前,我正在通过将入侵对象从碰撞中移开来解决本地冲突。然而,这可能导致新的碰撞,并以相同的方式解决。不幸的是,无法保证这一进程将永远停止


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

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

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

编辑 嗯,我当然没有预料到你在评论中概述的情况。如果对象的大小变化如此之大,我承认“网格捕捉”可能不适用于您的情况——您可能会得到大量的空白空间。当我编写我的答案时,我想到了一些与VisualBasic类似的东西(据我记忆所及,VB实现了某种网格捕捉行为)

不过还有一个小问题:让用户精确地控制UI元素的位置,可能会让用户的最大兴趣放在心上,但请考虑用户将如何与程序交互。用鼠标在屏幕上准确定位东西可能是一种惩罚,而且可能适得其反。但是,如果您保证用户将始终使用触摸屏设备,则无法做到这一点。

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

正如Sarah指出的,你可以通过将你的物体向一个方向随机移动一段距离来解决这个问题,然后再次检查是否有碰撞,然后移动碰撞的物体。然而,这可能导致问题的指数增长


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

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


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

这似乎是解决我问题的合理方法。稍后我会尝试实施它,并给你反馈。不幸的是,我不得不同意jenzzaflow。它似乎并没有真正解决这个问题,而且由于我的对象的大小可能会有所不同,我不确定如何计算网格大小,以保持用户的愉悦感。我不想让用户注意到网格,因为对象的精确布局非常重要,我会联想到想要将某个对象放置在某个精确位置并被网格阻止的不安感觉。我已经更新了关于您添加的细节的答案。干杯