Java 放置无重叠的随机圆(且不使用蛮力)?

Java 放置无重叠的随机圆(且不使用蛮力)?,java,Java,我刚刚提交了一份Java作业,其中我需要在屏幕上随机画一些圆圈,作为游戏的一部分。我们面临的一个挑战是确保所有圆圈都不重叠。我最终采用了一种奇怪的方法(因为我想:D),它基本上只是使用trig从屏幕中心创建了一个模式,这很有趣。虽然这种方法中的圆从不重叠,但并不理想。。。圆圈的分布在屏幕的中间是相当密集的,在角落中使用的空间非常小 我还创建了一个(被注释掉的)蛮力方法,如果一个提议的圆的x,y坐标与一个已经创建的圆相交,只需重新滚动新的坐标,虽然理论上可以循环到无穷大,但最有可能不会超过十个交点

我刚刚提交了一份Java作业,其中我需要在屏幕上随机画一些圆圈,作为游戏的一部分。我们面临的一个挑战是确保所有圆圈都不重叠。我最终采用了一种奇怪的方法(因为我想:D),它基本上只是使用trig从屏幕中心创建了一个模式,这很有趣。虽然这种方法中的圆从不重叠,但并不理想。。。圆圈的分布在屏幕的中间是相当密集的,在角落中使用的空间非常小

我还创建了一个(被注释掉的)蛮力方法,如果一个提议的圆的x,y坐标与一个已经创建的圆相交,只需重新滚动新的坐标,虽然理论上可以循环到无穷大,但最有可能不会超过十个交点

在与一位朋友讨论了解决方案之后(在谷歌上搜索了很多次之后),我们实际上非常有兴趣看看如何在没有暴力的情况下做到这一点。要求:

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

如果可能,使用标准库?

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

  • 对于循环1-20
  • 从集合中随机绘制一个栅格平铺
  • 在网格瓷砖中放置一个圆圈;圆的中心是栅格平铺的中心
  • 从集合中删除该栅格平铺
  • 接下来是循环
  • 您现在有二十个随机放置的不能重叠的圆

    现在,还有什么其他的空间分区系统会在这里有用呢

  • 定义一个包含有效坐标的集合
  • 从该集合中找到一个随机元素
  • 从集合中排除所有不再有效的坐标
  • 去2号
  • 列出640x480条目的列表,并在其中输入从1到307.200(640x480)的连续数字。每个条目代表屏幕上的一个像素
  • 随机选取1到307.200之间的数字,代表屏幕上的一个像素。在那里画圆圈
  • 计算该圆10像素半径内的所有像素。从列表中删除代表这些像素的所有条目
    重复十次。

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

    这是


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

    你必须是一名顾问。此解决方案符合要求,但并非目的:)我也同意此解决方案,但要求每个圆只能根据网格部分在离散位置绘制。此答案不符合第3项要求。我刚刚发布了一个简单的解决方案,它确实符合要求。每个位置都是随机的——你的“像素”只是更大而已。不过,我明白你的意思-本课程的目的可能是教授空间分区技术@戴夫:不,我只是喜欢简化。我认为,更准确的说法是,他们的要求没有达到他们的目的。+1是的……似乎是一个很好的解决方案。我也想过。唯一的问题是列表的大小。该解决方案可能无法用于增加窗口维度。我还没有对此进行测试,但307190~阵列拷贝听起来很昂贵。然而,成为整数可能会使它足够快,甚至更快;我指的是复制的数组的大小,而不是复制的数量。是的,20份拷贝(每个圆一份)并不多。我建议将“落在10像素半径内”改为“落在20像素半径内”。(另外,我将首先生成区域(10…630)x(10…470)中的所有点。此方法将生成重叠圆,假设发现一个圆的圆心不在另一个圆中,但其圆心之间的距离小于半径(本例中为10)即使你的条件有效,它们仍然会重叠。因为我在尝试使用你的解决方案时遇到了类似的问题。