java – 在圆形的2D空间中为任意点[x,y]找到圆的最近自由位置
我正在制作一个用户玩家在屏幕上放置圆圈的游戏.重要的是圆圈永远不会重叠,所以我需要从光标中找出最近的可能自由点.我找到了圆形打包算法,但它们似乎不适合我的问题.我也解决了过去类似的问题(
here),但是用圆圈,我似乎无法弄明白.
我想出了当它与一个圆相交时,或者即使涉及两个圆时,我如何找到最近的自由位置.但是,我找不到一个可以处理任何排列中具有任意数量圆圈的复杂情况的稳健算法. 准确描述问题: 任何类型的建议(参考,方法或(Java)库). 附:如果解决方案包括确保圆圈保持在特定边界框(即显示)内,则奖励积分. 我的最终解决方案:(根据David Wallace的建议) >计算两个圆心之间的最小距离(在我的例子中,所有圆都是相同的大小,所以总是2 *半径) 请注意,这不能很好地完成,但在我的情况下,用户正在拖动屏幕上的新圆圈就足够了.它适用于大多数情况下,有些情况下没有,通常当很多圆圈非常靠近时,新圆圈只停留在最后一个位置(这是有效的).然后,用户可以决定进一步拖动它,并且更准确地在他想要新圆圈去的地方. 解决方法
这不是一个完整的答案,但您可以将其合而为一.
假设你已经放置了半径为r1,r2,r3 … rn的圆圈,其中心为C1,C2,C3 …… Cn,你想要放置一个半径为rz的新圆圈,新圆圈的中心将会有在所有一组“放大”的圆圈之外,以C1,C3 …… Cn为中心;半径(r1 rz),(r2 rz),(r3 rz)…(rn rz).因此,如果光标位于P点,则有一些情况需要考虑. (1)如果P不在任何放大的圆圈中,则问题得以解决. (2)如果P只在一个放大的圆圈中,那么沿着该圆的半径向外移动,直到你到达所有放大圆圈之外的点,或者直到你到达另一个放大的圆圈.前一种情况简化为方案(1);后者简化为方案(2).如果P恰好是圆的中心,则选择任意方向. (3)如果P在几个圆中,则找到从P到它所在圆的每个中心的方向.找到它们之间具有最宽间隔的一对方向,并将该角平分,得出哪个方向前进.例如,如果到圆心的方向是30度,120度和330度,则将120度和330度之间的角度平分 – 然后朝225度方向前进.朝那个方向前进,直到你到达圆圈的边缘,然后重新计算.继续这样做,直到你回到方案(2). 我无法解决的问题是,如果你陷入情景(3),该怎么办.也许只允许一定数量的步骤,然后退出.毕竟,可能没有合适的地方放置圆圈. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |