c ++中动力学凸包的分裂与合并

时间:2013-07-29 08:26:45

标签: c++ data-structures game-engine convex-hull

注意:我不确定这些问题是否属于此处,如果合适,请转到相应的stackexchange网站。

我正在开发一款多人游戏。

我想在代码中维护的内容:2d群集。

什么是集群:它们是用户的聚合(用户周围的凸包)。

什么是用户:用户有x,y位置和他可以影响的信封。信封可以是理想的圆形,其半径是他能看到的距离。 群集中的每个用户信封都应与同一群集中的至少一个其他信封相交。

在图中,我有4个集群。 第二和第三个图显示了当用户移动时如何形成新的集群。 enter image description here enter image description here enter image description here

当用户移动时,群集将分裂或合并以维持上述属性。

我想知道“动态凸包”是否是我应该寻找在我的c ++游戏代码中实现此类集群维护的解决方案的正确区域。

注意:我现在正在阅读动能凸壳,我还没有完成它,但我认为它涉及在一组固定点周围形成一个凸包。我需要这个,但是当船体内的用户信封与同一船体内的其他信封相交时,我还需要将船体拆分为两个或更多。例如上面第3张照片中的例子A.

2 个答案:

答案 0 :(得分:0)

根据你的描述,我不明白为什么你需要凸壳。

在你的第3张照片中,B和F之间的空白区域将位于凸包内。船体本身将从B到F.

http://i.stack.imgur.com/8CG97.png

(注意:信封的外壳与B和F的包络线相切。计算起来比较困难,但很容易近似。)

如果此类信息对您的游戏有用,那么凸包适合您!如果动力学凸包不支持分裂/合并,则只需重新计算凸包。但由于分数很少,无论如何这不应该是一项昂贵的操作。至少它不适用于非动力学船体。

答案 1 :(得分:0)

不是专家,但看起来您需要检查每个用户移动的交叉点(仅检查移动用户)。如果用户的信封已停止与来自同一船体的用户相交,则您需要重建船体。您还需要检查用户的信封是否已经开始与另一个用户的信封相交。如果是 - 你需要重建旧船体和新船体(可能合并它们)。

编辑:澄清

在每次用户移动时,您都必须检查移动用户的状态:

  • 如果此用户的信封已停止与其他用户的信封相交 - 将用户从船体中排除
  • 如果此用户的信封已开始与其他用户的信封相交
    1. 如果此用户不属于任何其他船体,则将其添加到其他用户的船体
    2. 如果此用户是另一个船体的一部分 - 合并船体