注意:我不确定这些问题是否属于此处,如果合适,请转到相应的stackexchange网站。
我正在开发一款多人游戏。
我想在代码中维护的内容:2d群集。
什么是集群:它们是用户的聚合(用户周围的凸包)。
什么是用户:用户有x,y位置和他可以影响的信封。信封可以是理想的圆形,其半径是他能看到的距离。 群集中的每个用户信封都应与同一群集中的至少一个其他信封相交。
在图中,我有4个集群。 第二和第三个图显示了当用户移动时如何形成新的集群。
当用户移动时,群集将分裂或合并以维持上述属性。
我想知道“动态凸包”是否是我应该寻找在我的c ++游戏代码中实现此类集群维护的解决方案的正确区域。
注意:我现在正在阅读动能凸壳,我还没有完成它,但我认为它涉及在一组固定点周围形成一个凸包。我需要这个,但是当船体内的用户信封与同一船体内的其他信封相交时,我还需要将船体拆分为两个或更多。例如上面第3张照片中的例子A.
答案 0 :(得分:0)
根据你的描述,我不明白为什么你需要凸壳。
在你的第3张照片中,B和F之间的空白区域将位于凸包内。船体本身将从B到F.
http://i.stack.imgur.com/8CG97.png
(注意:信封的外壳与B和F的包络线相切。计算起来比较困难,但很容易近似。)
如果此类信息对您的游戏有用,那么凸包适合您!如果动力学凸包不支持分裂/合并,则只需重新计算凸包。但由于分数很少,无论如何这不应该是一项昂贵的操作。至少它不适用于非动力学船体。
答案 1 :(得分:0)
不是专家,但看起来您需要检查每个用户移动的交叉点(仅检查移动用户)。如果用户的信封已停止与来自同一船体的用户相交,则您需要重建船体。您还需要检查用户的信封是否已经开始与另一个用户的信封相交。如果是 - 你需要重建旧船体和新船体(可能合并它们)。
编辑:澄清
在每次用户移动时,您都必须检查移动用户的状态: