通过开放空间检查两个物体的连通性

时间:2014-06-11 02:25:24

标签: c++ algorithm box2d sfml path-finding

标题有点模糊,但我会在这里解释一下。

设置

我正在尝试编写一个小水位模拟器,就像游戏中的水位LIMBO一样。当打开一个开口,允许水在两个水体之间流动时,水平相等。我现在的设置是两个容器,里面有蓝色块代表水位。我的鼠标移除了大块的地形,因此,当在物体之间形成一个开口时,它们应该调整,它们的Y值应该移动以匹配。

图片示例:

半满罐: Tanks

均衡坦克: Equalized

现在,我知道可以做一些数学计算来调整不同大小的坦克之间的水平和比例。我认为这部分非常简单。但我无法找到一种确定两个水体是否以及何时相连的好方法。

非常感谢任何算法,伪代码或引用!

如果您需要更多说明,请不要犹豫。我期待所有反馈,并将编辑我的帖子以获得具体说明。

谢谢!

natebot13

BTW:我正在使用C ++,SFML和Box2D(Box2D用于我需要的其他一些物理相关的东西,这个例子不一定需要)。

2 个答案:

答案 0 :(得分:2)

如果是,则需要检查容器1的边缘是否在任何时间点连接到容器2,然后调整水位。我猜您正在处理图像,因此您可以使用connected components算法检查container1的任何边缘像素是否连接到container2的任何边缘像素,并获得它们的位置。

算法: -

  
      
  1. 将container1的边缘放在一个连接到虚拟parent1的集合中。
  2.   
  3. 将container2的边缘放在另一个连接到另一个虚拟parent2的集合中。
  4.   
  5. 说每隔一秒后使用连接的组件将新添加的像素添加到集合
  6.   
  7. 检查每个联合的末尾是否连接了虚拟parent1和parent2。
  8.   
  9. 您可以使用DFS通过从一个边缘set1开始到达另一个边缘来检查连接的确切点。最后一个像素和   边缘set1中的前一个第一个像素是连接端点。
  10.   

注意: -

在c ++ boost lib中有一个disjoint set的实现,它可能对连接组件的实现很有用。

答案 1 :(得分:0)

我认为你可以从左到右开始,例如: 左侧油箱位置的右侧是已知的。 在其右侧的列中搜索蓝色方块。 一旦找到,搜索其周围的方块 - 向上,向下和向右。 继续搜索,直到你到达右侧坦克的已知左侧。