java – 在圆形的2D空间中为任意点[x,y]找到圆的最近自由位置

我正在制作一个用户玩家在屏幕上放置圆圈的游戏.重要的是圆圈永远不会重叠,所以我需要从光标中找出最近的可能自由点.我找到了圆形打包算法,但它们似乎不适合我的问题.我也解决了过去类似的问题( here),但是用圆圈,我似乎无法弄明白.

我想出了当它与一个圆相交时,或者即使涉及两个圆时,我如何找到最近的自由位置.但是,我找不到一个可以处理任何排列中具有任意数量圆圈的复杂情况的稳健算法.

准确描述问题:
我有一个2D空间,任意数量的非相交圆,都具有相同的半径(虽然这可能无关紧要).我想找到下一个圆的位置,使其不与任何其他圆相交,并且哪个中心[x,y]最接近指定位置[x,y].

任何类型的建议(参考,方法或(Java)库).

附:如果解决方包括确保圆圈保持在特定边界框(即显示)内,则奖励积分.

我的最终解决方案:(根据David Wallace的建议)

>计算两个圆心之间的最小距离(在我的例子中,所有圆都是相同的大小,所以总是2 *半径)
>列出距离最小距离更近的鼠标位置的所有圆圈
>如果0重叠:一切都好!
>如果1重叠:将新圆的中心移动到比较圆的中心的最小距离,沿着从比较圆的中心到鼠标位置的矢量
>如果2重叠:找出两个重叠圆相交的位置.将新圆放在最靠近鼠标位置的交叉点上.如果此位置仍与任何圆重叠,请移至另一个交叉点.如果那个不起作用,请保留新的圆圈.
>如果3重叠:与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),该怎么办.也许只允许一定数量的步骤,然后退出.毕竟,可能没有合适的地方放置圆圈.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、
线程类,设置有一个公共资源 package cn.org.chris.concurrent; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @Descrip
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量
Java 9中JShell中的不同启动脚本是什么?
使用Java的位填充错误检测技术
java中string是什么
如何使用Java中的JSON-lib API将Map转换为JSON对象?
Java菜单驱动程序以检查数字类型
使用Junit的Maven项目 - 检查银行账号
JAVA编程基础
在Java中使用throw、catch和instanceof来处理异常
在Java中,将数组分割为基于给定查询的子数组后,找到子数组的最大子数组和
如何在Java中从给定的字符串中删除HTML标签?
在PHP中,IntlChar getBlockCode()函数的翻译如下:
如何在Android中实现按下返回键再次退出的功能?
如何使用Java中的流式API解析JSON字符串?
Java中的模式类