放置随机圆圈而不重叠(并且不使用暴力)?

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

我还创建了一个(注释掉的)蛮力方法,如果建议的圆的x,y坐标与已经创建的圆相交,那么简单地重新滚动新坐标,虽然理论上能够循环到无限,但最有可能不会超过十个交点。

在与朋友讨论解决方案之后(以及谷歌搜索后的TON),我们实际上非常有兴趣看看如何在没有暴力的情况下完成这项工作。 要求:

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

可能,使用标准库?

  1. 列出640×480条目并将连续数字从1到307.200(640×480)放入其中。 每个条目代表屏幕上的一个像素。
  2. 随机选择1到307.200之间的数字,表示屏幕上的像素。 在那里画圆圈。
  3. 计算落在此圆圈的10像素半径范围内的所有像素。 从列表中删除表示这些像素的所有条目。

重复十次。

制作一个覆盖整个屏幕的网格; 把网格放在一个集合中。 每个网格部分应为十个单位(圆圈的大小)。

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

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

现在,其他空间分区系统在这里有用以及如何使用?

  1. 定义包含有效坐标的集合。
  2. 从该集中查找随机元素。
  3. 从集合中排除不再有效的所有坐标。
  4. 转到2。

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

这是我的解决方案 。

我想尝试使用arrays的Peter优雅方法。 我不知道该怎么做但我会在这里发布一次。