【问题标题】:splitting and merging of kinetic convex hulls in c++c++中动力学凸包的拆分和合并
【发布时间】:2013-07-28 23:02:53
【问题描述】:

注意:我不确定这个问题是否属于这里,如果合适,请移至适当的 stackexchange 站点。

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

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

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

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

在图中我有 4 个集群。 第 2 和第 3 幅图显示了随着用户移动新集群将如何形成。

随着用户四处移动,集群会分裂或合并以保持上述属性。

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

注意:我现在正在阅读有关动力学凸包的信息,但我还没有完成,但我认为它涉及围绕一组固定点形成一个凸包。我需要这个,但我还需要将船体分成两个或更多,当船体内的用户信封与同一船体内的其他信封不相交时。例如上面第三张图片中的 A。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    (注意:包络的外壳会与 B 和 F 的包络相切。它更难计算,但很容易近似。)

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

    【讨论】:

      【解决方案2】:

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

      编辑:澄清

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

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

      【讨论】:

        猜你喜欢
        • 2013-05-06
        • 2012-11-09
        • 2011-05-23
        • 2016-06-06
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        相关资源
        最近更新 更多