我正在制作一个游戏,用户可以在屏幕上放置圆形。重要的是,这些圆形不能重叠,因此我需要找到最接近光标的可用空间。我已经找到了圆形打包算法,但它们似乎不适合我的问题。我之前也解决过类似的盒子问题(here),但对于圆形,我似乎无法解决它。
我已经想出了如何在与一个圆相交或两个圆相交时找到最近的空闲位置。然而,我找不到一个能够处理复杂情况的强大算法,其中有任意数量的圆以任何方式排列。
问题的精确描述: 我有一个二维空间,其中有任意数量的非交叉圆形,所有圆形都具有相同的半径(尽管可能并不重要)。我想找到下一个圆形的位置,使其不与任何其他圆形相交,并且其中心[x,y]最靠近指定位置[x,y]。
欢迎任何建议(参考资料,方法或(Java)库)。
我已经想出了如何在与一个圆相交或两个圆相交时找到最近的空闲位置。然而,我找不到一个能够处理复杂情况的强大算法,其中有任意数量的圆以任何方式排列。
问题的精确描述: 我有一个二维空间,其中有任意数量的非交叉圆形,所有圆形都具有相同的半径(尽管可能并不重要)。我想找到下一个圆形的位置,使其不与任何其他圆形相交,并且其中心[x,y]最靠近指定位置[x,y]。
欢迎任何建议(参考资料,方法或(Java)库)。
p.s. 如果解决方案包括确保圆圈保持在特定的边界框内(即显示),则会获得额外加分。
我的最终解决方案:(基于David Wallace的建议)
- 计算两个圆心之间的最小距离(在我的情况下,所有圆都是相同大小的,因此始终为2*半径)
- 列出所有距离鼠标位置比最小距离更近的圆的列表
- 如果没有重叠:一切正常!
- 如果有1个重叠:将新圆的中心移动到与比较的圆的中心的最小距离处,沿着从比较圆的中心到鼠标位置的向量
- 如果有2个重叠:找出两个重叠圆的交点。将新圆置于最靠近鼠标位置的交点上。如果该位置仍然与任何圆重叠,请移动到另一个交点。如果那个交点不起作用,请将新圆留在原地。
- 如果有3个重叠:与2个重叠相同,只需选择最靠近新圆的两个圆。