【问题标题】:Placing random circles without overlap (and without using brute force)?放置没有重叠的随机圆圈(并且不使用蛮力)?
【发布时间】:2011-05-14 14:20:50
【问题描述】:

我刚刚提交了一个 Java 作业,其中我需要在屏幕上随机绘制一些圆圈作为游戏的一部分。我们面临的挑战之一是确保没有一个圆圈重叠。我最终采用了一种奇怪的方法(因为我想:D),它基本上只是使用三角函数从屏幕中心创建了一个图案,这很有趣。虽然这种方法中的圆圈从不重叠,但并不理想......圆圈的分布相当紧凑,围绕屏幕中间,角落使用的空间非常小。

我还创建了一种(已注释掉的)蛮力方法,如果提议的圆的 x,y 坐标与已创建的圆相交,则该方法简单地重新滚动新坐标,虽然理论上可以循环到无限,但很可能不会超过 10路口。

在与朋友讨论了解决方案(并在谷歌上进行了大量搜索)之后,我们实际上很想看看如何在没有蛮力的情况下做到这一点。要求:

  • 要在 640x480 窗口上绘制 20 个圆,半径为 10 个单位
  • 绝对没有圆圈重叠
  • 否则在屏幕上随机分布

可能,使用标准库?

【问题讨论】:

    标签: java


    【解决方案1】:
    1. 制作一个 640x480 条目的列表,并在其中放入从 1 到 307.200 (640x480) 的连续数字。每个条目代表屏幕上的一个像素。
    2. 从 1 到 307.200 随机选择一个数字,它代表屏幕上的一个像素。在那里画圈。
    3. 计算落在该圆的 10 像素半径内的所有像素。从列表中删除代表这些像素的所有条目。

    重复十次。

    【讨论】:

    • +1 是的..似乎是一个很好的解决方案。我也想过。唯一的问题是列表的大小。该解决方案可能不适用于增加窗口尺寸。
    • 我没有测试过这个,但是 307,190~ 数组副本听起来很贵。但是,整数可能会使其足够快,甚至更快。
    • 我可能措辞错误;我的意思是复制的数组大小,而不是副本数。是的,二十份(每个圈一份)并不多。
    • 我建议将“在 10 像素半径内”更改为“在 20 像素半径内”。 (另外,我将首先生成区域 (10...630)x(10...470) 中的所有点。
    • 这种方法会导致圆圈重叠,假设一个圆圈的中心点被发现不在另一个圆圈中,但它们的中心之间的距离小于半径(在这种情况下为 10)即使你的条件会工作,他们仍然会重叠。由于我在尝试使用您的解决方案时遇到了类似的问题,repository
    【解决方案2】:

    制作一个覆盖整个屏幕的网格;将网格放在一组中。每个网格部分应该是十个单位(你的圆圈的大小)。

    1. for 循环 1-20。
    2. 从集合中随机绘制一个网格图块。
    3. 在该网格图块中放置一个圆圈;圆的中心是网格图块的中心。
    4. 从集合中移除该网格图块。
    5. 下一个 for 循环。

    您现在有 20 个随机放置的不能重叠的圆圈。

    现在,还有哪些其他空间分区系统在这里有用?

    【讨论】:

    • 您必须是一名顾问。此解决方案符合要求,但不符合意图:)
    • 我也支持该解决方案,但要求每个圆只能根据网格部分在离散位置绘制。
    • 这个答案不符合要求。 3
    • 我刚刚发布了一个简单的解决方案
    • 确实符合。每个位置都是随机的 - 您的“像素”更大。但是,我明白你的意思——本课的目的可能是教授空间分割技术。 @Dave:不,我只是喜欢简化。我认为,更准确的说法是他们的要求不符合他们的意图。
    【解决方案3】:
    1. 定义一个包含有效坐标的集合。
    2. 从该集合中找到一个随机元素。
    3. 从集合中排除所有不再有效的坐标。
    4. 转到 2。

    【讨论】:

      【解决方案4】:

      这是我一直在寻找的东西。我做的基本相同,但在 HTML5 中。幸运的是,我只需要在 800 x 400 像素的画布上布置 100 个半径为 20 像素的圆圈。使用蛮力方法最多可以工作 120 圈。

      这里是my solution

      我想尝试一下 Peter 使用数组的优雅方法。我不知道怎么做,但是一旦我有了它,我会在这里发布。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-24
        • 2015-02-28
        • 1970-01-01
        • 2023-04-01
        • 2021-03-21
        • 2021-03-16
        • 2019-04-06
        相关资源
        最近更新 更多