基于中心点均匀分布不同距离尺寸圆形并规避碰撞的方法咨询
圆形排布实现方案
核心逻辑
优先级严格遵循:碰撞规避 > 同层均匀分布 > 跨层间隙优化,围绕固定中心点按distance分层处理,优先确定内层位置再向外扩展。
分步实现
- 分层排序
将所有圆形按distance从小到大分组,相同distance的归为同一层,优先处理内层(distance值更小的层),避免外层占位影响内层布局。 - 同层初始角度分配
同一层的圆形先按size从大到小排序,大尺寸圆形优先分配位置降低后续碰撞概率。初始角度默认按数量均分:初始角度 = 2π * i / 同层圆形总数,i为当前圆形的排序序号,初步保证分布均匀。
若同层圆形size差异较大,可换用权重分配逻辑:单圆初始占用角度 = 2π * (当前圆半径 / 同层所有圆半径总和),进一步减少同层碰撞概率。 - 碰撞检测与位置微调
碰撞判定规则:两个圆形碰撞的充要条件为两圆圆心距 < 两圆半径之和。
先做同层相邻碰撞检测,若相邻两圆碰撞,将两个圆的角度往远离对方的方向等比例微调,直到同层所有圆形无碰撞。微调时可设置最大偏移阈值,避免偏移过量导致扎堆,超过阈值直接触发合并逻辑。
同层处理完成后,再与所有已确定位置的内层圆形做跨层碰撞检测,若出现碰撞优先微调外层圆形的角度,角度调整范围内无法规避的直接触发合并。 - 碰撞合并规则
触发合并的多个圆形,新圆形参数按以下规则计算:- 新
size:若size对应面积则直接取所有合并圆size之和;若size对应半径则先计算所有合并圆的总面积加总,再换算为新半径 - 新
distance:取所有合并圆的distance按各自size加权的平均值 - 新位置:取所有合并圆的质心位置
合并完成后重新对新圆形做相邻碰撞检测,直到所有圆形均无碰撞。
- 新
可选优化
如果对均匀性要求更高,可以在所有层处理完成后,做一次全局的力导向模拟:给每个圆形施加斥力,同一层的圆形额外施加均匀分布的拉力,迭代若干次后锁定位置,既能保证无碰撞,也能进一步降低扎堆概率。
内容的提问来源于stack exchange,提问作者stiil
相关产品推荐
相关产品推荐

