“移动家具”:2d空间中的碰撞分辨率(非旋转可收缩2d矩形)

时间:2013-09-20 14:34:46

标签: c++ 2d collision rect

在2d空间中,我们有一组矩形。

这是一张图片:

enter image description here

右边的垂直线是不可移动的"墙"。 左侧的箭头表示移动方向。 我需要将最左边的矩形移到右边。

  1. 矩形无法旋转。
  2. 不允许矩形水平重叠。
  3. 矩形可以(水平)缩小到某个最小宽度(分别设置为每个矩形)
  4. 矩形只能水平移动(左/右)并水平收缩。
  5. 最左边的矩形(箭头所指)不能缩小。
  6. 宽度和坐标存储为整数。
  7. 我需要将最左边的矩形向右移动X个单位,将所有东西推向右边。

    有两个问题:

    1. 我需要确定我可以向左移动最左边的矩形到多远(可能无法移动X单位)。
    2. 按X单位移动矩形(或者如果无法移动X单位,移动最大可能数量,小于X),并获取系统中每个矩形的新坐标和大小。
    3. 其他并发症:

      您不能将Y坐标和矩形高度用于任何内容 每个矩形都有一个矩形列表(实现为指针),如果你继续向右移动它将会击中它,你只能检索x坐标,宽度和最小宽度。此数据模型无法更改。 (从技术上讲,在2d中将其表示为一组矩形是简化)

      重要提示:来自不同级别和分支的儿童在潜在的碰撞中可以拥有相同的矩形"名单。这是指针显示为红线的初始图片: enter image description here

      我该怎么做?

      我知道一种愚蠢的方式(能够解决这个问题):迭代地。即

      1. 记住系统的当前状态。如果系统状态已经记忆,请忘记以前记忆的状态。
      2. 将最左边的矩形按下1个单位。
      3. 递归解决冲突(如果有)。
      4. 如果无法解决碰撞,请返回系统的记忆状态。
      5. 如果可以解决冲突,并且我们已经按X单位移动,则返回系统的当前状态。
      6. 否则,请转到1.
      7. 这将解决问题,但如果X很大,这种迭代解决方案可能会很慢。有没有更好的方法来解决它?

1 个答案:

答案 0 :(得分:1)

想到一个可能的解决方案:

你说每个矩形都有指向它向右移动时会击中的所有物体的指针。我建议,从大矩形(箭头所指的那个)中取出指针列表,取出它所有的节点(它会碰撞的矩形),找到最小宽度,然后对所有子节点做同样的事情,添加递归地每个分支的宽度。像树深度问题一样对待问题。每个节点都有一个最小宽度值,因此您的问题的答案将是墙与大矩形右边缘的x值之间的距离减去矩形最小宽度的最大总和。创建一个向量,其中存储树的每个分支的深度(最小宽度的总和)并找到最大值。距离减去最大值是你的答案。

用4个盒子想象相同的图片。一个在左边,一个在右边,然后在墙上。我们将它们命名为方框1,方框2(中间顶部),方框3(中间底部)和最后一个方框4(右侧)。每个盒子的宽度都是4.除了左边的盒子外,所有盒子都可以收缩。方框2可以缩小2,方框3可以缩小1,方框4可以缩小2.计算2个分支给出          *分支1:2 + 2 = 4          *分支2:3 + 2 = 5          *仅关注分支2,因为分支1比分支2少,因此将适合与分支2平行的空间,并且可以缩小那么多。