我正在制作一个用户玩家在屏幕上放置圆圈的游戏。重要的是圆圈永远不会重叠,所以我需要找出离光标最近的可能空闲点。我找到了圆形包装算法,但它们似乎不适合我的问题。过去我也为盒子(这里)解决了一个类似的问题,但是对于圆圈,我似乎无法弄清楚。
我想出了如何在它与一个圆相交时找到最近的自由位置,甚至当涉及两个圆时。但是,我找不到一个健壮的算法来处理任何排列中具有任意数量的圆的复杂情况。
问题的精确描述:我有一个 2D 空间,其中包含任意数量的非相交圆,所有圆都具有相同的半径(尽管这可能无关紧要)。我想为下一个圆找到一个位置,使其不与任何其他圆相交,并且哪个中心 [x,y] 最接近指定位置 [x,y]。
任何形式的建议(参考、方法或(Java)库)。
ps 如果解决方案包括确保圆保持在特定边界框内(即显示),则加分。
我的最终解决方案:(基于大卫华莱士的建议)
- 计算两个圆的中心之间的最小距离(在我的例子中,所有圆的大小都相同,所以总是 2*radius)
- 列出比最小距离更接近鼠标位置的所有圆圈
- 如果 0 重叠:一切都好!
- 如果 1 重叠:沿着从比较圆的中心到鼠标位置的向量,将新圆的中心移动到距比较圆的中心的最小距离
- 如果 2 重叠:找出两个重叠的圆相交的位置。将新圆放在最靠近鼠标位置的交点上。如果此位置仍与任何圆重叠,则移动到另一个交叉点。如果那个不起作用,请离开新的圈子。
- 如果 3 重叠:与 2 重叠,只取最接近新圆的两个圆。
请注意,这并不完美,但在我的情况下已经足够好了,用户在屏幕上拖动新圆圈。它在大多数情况下都有效,而在某些情况下则无效,通常当有许多圈子非常靠近时,新圈子只会停留在最后一个位置(这是有效的)。然后,用户可以决定将其拖得更远,并更精确地确定他希望新圆圈去哪里。