python - 绘制n个相同的无重叠和中心重心的圆

标签 python algorithm geometry

我正在查看一组 100 张 PowerPoint 幻灯片,这些幻灯片具有相同大小的红色圆圈,第一张幻灯片有 1 个圆圈,第 100 张幻灯片有 100 个圆圈。在每张幻灯片上,圆圈不重叠,虽然它们是半随机放置的,但它们往往会被吸引到中心并且彼此不太接近(我看不到极端异常值)。大家可以自己看看幻灯片here ).

这些似乎是手工创建的(这一定花了很长时间!),我开始思考以编程方式创建这样的东西的最佳方法是什么(有趣的玩具问题 - 自动化无聊的东西)?

我一直在沿着以下思路思考。

对于每张幻灯片最多 n 个圆圈:

  1. 在 Canvas 上的随机点生成圆的坐标。
  2. 为此圆圈和 Canvas 上已有的所有其他圆圈计算更大的直径(对于某个更大的值),并使用计算出的更大直径检查新圆圈是否与任何现有圆圈重叠(以防止圆圈靠得太近一起)。如果可以,请继续,否则重新开始 2。
  3. 要阻止异常值,请进行某种检查以确保新生成的圆与 3(?) 个现有圆的中心的距离不超过 x?
  4. 如果所有检查都结束,则保留新圈子并再次从 1 开始,直到有足够的圈子。
  5. 想办法为每个 Canvas 生成 png 或其他东西。

还需要找到一种方法,至少让前几个圆圈趋向于中心。

但是,虽然我喜欢思考问题,但我的编码技巧需要改进,并且必须有某种出色的算法或其他方法才能正确地做到这一点?

很高兴得到任何指点或任何人对此有所了解 - 特别喜欢阅读一些 python 实现以供学习。

[我知道这可能不完全符合 StackOverflow 的风格,但不确定还能从哪里获得有关该问题的想法]。

最佳答案

迭代松弛是解决此类问题的常用方法。

基本上,您先随机放置 n 个圆圈。然后您进行多次迭代以尝试将圆圈移动到更令人满意的配置中。

对于每个圆 C,您测量与其他圆的距离,并且对于每个圆,您计算将 C 推离另一个圆的力 C。力的方向将与另一个圆的方向相反,大小通常与距离成反比。 (因此该力的行为类似于重力,但方向相反。)您将 C 上的所有力相加,类似地将所有其他圆上的力相加,然后根据 C 上的总力稍微移动每个圆它。 (您还需要一种力使圆圈远离边缘。)那是一次迭代,之后,圆圈的配置应该比之前稍微更好。

现在,如果您对大量迭代执行此操作,您最终可能会得到一个规则的六边形拼贴,这看起来不会很有趣。所以你可能想在那之前停下来,或者添加另一个力来防止每个圆从它的原始位置移动太远,或者忽略来自其他圆超过给定距离的任何力,或者如果它的总力低于一个给定的幅度。

顺便说一下,您要做的很多事情与 smoothed-particle hydrodynamics 非常相似,一种流体模拟方法。 Here's一个基于 Python 的模拟视频,嗯,超过 100 个球体模拟水溅,几乎完全基于试图与附近球体保持正确距离的单个球体。

关于python - 绘制n个相同的无重叠和中心重心的圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54942707/

相关文章:

python - 模拟 Python whl 文件中的函数

python - 使用 Pandas 合并三个或更多数据框

java - 使用 2D 三边测量查找对象的位置

python - 将一个矩形分割成n个大小相等的矩形

graphics - 如何将由 4 个点标识的任意平面投影到二维平面上?

python - Celery link_error 引发 NotRegistered 异常

python - 可以在 TensorFlow 中构建增强拓扑 (NEAT) 神经网络的神经进化吗?

algorithm - 初学者(Python 3.6.1): Why isn't this script working?

algorithm - 将一条通过原点 (0,0) 的直线拟合到数据

c# - Unity中如何将一些3D点都在同一平面上降维为2D?