【问题标题】:How to randomly place 2D asteroids so they don't overlap with each other? [closed]如何随机放置 2D 小行星,使它们不会相互重叠? [关闭]
【发布时间】:2012-03-30 19:30:59
【问题描述】:

生成不相互重叠的 2D 小行星(自上而下)的好方法是什么?如果您能提供类似 C# 或 JAVA 的任何语言的代码,我将不胜感激。

【问题讨论】:

  • 你有没有尝试过?尝试使用谷歌搜索 2d 游戏 API
  • 我目前正在研究 Poisson Disk Sampling。
  • 我猜你问的是随机放置的小行星。否则,最简单的解决方案就是将它们彼此相邻排列。
  • 啊,是的,看来我的措辞不是最好的。我会解决的。

标签: c# java vector 2d


【解决方案1】:

我相信您正在寻找的是2D Collision Detection。这是一个good article 与工作示例代码有关的内容。

编辑:根据您的描述,如果您将每颗小行星表示为Rectangle,那么您可以简单地检查交叉点:

  1. 生成一个以矩形表示的小行星。
  2. 检查现有小行星列表,看看它是否Intersects
  3. 如果相交,则转到 1,否则将其添加到列表中。

显然这并不完美,因为可能存在应该允许重叠的角,但这将是一种相当快速的生成您想要的方法(取决于您想要放置多少小行星)。

编辑 2:如果您只想要检查矩形重叠的代码,可以找到 here

【讨论】:

  • 我不需要碰撞检测。我只是想在伪随机 xy 位置生成它们。他们甚至都没有动。
  • 其实你还是会做碰撞检测。您可以生成小行星的位置,然后检查它是否与任何其他现有小行星发生碰撞(重叠)。
  • 我明白你的意思。有没有办法在不进行后期处理的情况下生成小行星的 xy 位置?
  • 我已经更新了我的答案,以引用一个 XNA 矩形,它有一个内置的方法来检查交叉点。
【解决方案2】:

取决于您需要和想要制定解决方案的复杂程度。如果你想放置大量对象,那么如果没有空间(请原谅双关语)留给另一个小行星,那么每次迭代和命中测试都会让你陷入无限循环。

另一种方法是存储小行星可以容纳的所有可能位置的数据结构。这就像一个位置列表,从完整列表开始。例如,如果您有一个简单的 3 x 3 网格,则起始列表将有 9 个位置。然后,您从列表中选择一个随机项目并使用它,然后删除它以及现在已被该新小行星失效的任何其他位置。这样你就可以知道你什么时候没有空间了。

也许有点矫枉过正,但我​​认为这是一个有趣的问题——祝你好运!

【讨论】:

    【解决方案3】:

    简单的解决方案:

    for i = 1 to 10
    {
       X = rand();
       Y = rand();
       drawCircle(X,Y, radius);
    }
    

    复杂的解决方案:
    你必须给我们更多才能继续。

    【讨论】:

    • 您提供的示例代码将产生重叠。基本上我正在尝试生成不重叠的小行星。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多