当前位置: 首页 > 知识库问答 >
问题:

求具有圆的二维空间中任意点[x,y]的圆的最近自由位置

沃学
2023-03-14

我正在做一个游戏,用户玩家在屏幕上放置圆圈。重要的是圆圈永远不会重叠,所以我需要找出离光标最近的可能的空闲点。我已经找到了圆包装算法,但它们似乎不适合我的问题。我也解决了一个类似的问题在过去的盒子(这里),但对于圆形,我似乎无法弄清楚。

我想出了当它与一个圆相交时,或者甚至涉及两个时,我如何才能找到最近的自由位置。然而,我找不到一个健壮的算法,可以处理在任何排列中有任何数目的圆的复杂情况。

问题的精确描述:我有一个2D空间,有任意数量的不相交的圆,都有相同的半径(尽管这可能不重要)。我想为下一个圆找到一个位置,使它不与任何其他圆相交,并且哪个中心[x,y]最接近一个指定的位置[x,y]。

附注。如果解决方案包括确保圆圈保持在特定的边界框内(即显示),则可获得奖励。

我的最终解决方案:(基于大卫·华莱士的建议)

  • 计算两个圆的中心之间的最小距离(在我的例子中,所有的圆都是相同的大小,所以总是2*半径)
  • 列出比最小距离更接近鼠标位置的所有圆圈
  • 如果0重叠:全部良好!
  • 如果1个重叠:沿着从比较圆心到鼠标位置的向量,将新圆心移动到与比较圆心的最小距离
  • 如果2个重叠:找出两个重叠的圆相交的地方。将新圆圈放置在最接近鼠标位置的交叉点上。如果此位置仍与任何圆重叠,则移动到另一个交点。如果那一个不起作用,就离开新的圆圈。
  • 如果3个重叠:与2个重叠相同,只取最接近新圆的两个圆。

请注意,这并不完美,但在我的例子中,用户正在屏幕上拖动新的圆圈,这已经足够好了。它在大多数情况下起作用,在那些情况下它不起作用,通常当有许多圈非常靠近时,新的圈只是停留在上一个位置(这是有效的)。然后,用户可以决定进一步拖动它,并更精确地确定他想要的新圆圈的位置。

共有1个答案

龚鸿羽
2023-03-14

这不是一个完整的答案,但你也许可以把它变成一个。

假设你已经放置了半径为r1,r2,r3...rn的圆圈,圆心为C1,C2,C3...Cn,而你要放置一个半径为rz的新圆圈,新圆圈的中心必须在一组“放大”的圆圈之外,圆心为C1,C2,C3...Cn;半径(R1+RZ),(R2+RZ),(R3+RZ)...(RN+RZ)。所以如果光标在点P,那么就有一些情况需要考虑。

(1)如果P不在任何一个放大的圆中,那么问题就解决了。

(2)如果P只在其中一个放大的圆内,那么沿着该圆的半径向外移动,直到你到达所有放大的圆外的一点,或者直到你到达另一个放大的圆。前一种情况简化为情景(1);后者简化为设想方案(2)。如果P恰好是圆心,选择一个任意的方向。

(3)如果P在几个圆中,那么求出P到它所在的圆心的方向。找到两个方向之间有最宽间隔的方向,然后将这个角度平分,就可以算出该往哪个方向走。例如,如果圆心的方向是30deg、120deg和330deg,那么将120deg和330deg之间的夹角平分,然后朝225deg的方向移动。朝那个方向前进,直到你到达一个圆的边缘,然后重新计算。继续这样做,直到回到场景(2)。

我想不出的是,如果你陷入场景(3)该怎么办。也许只允许一定的步数,然后退出。毕竟有可能是没有合适的地方放圆圈。

 类似资料:
  • 我画了一个正方形,它的宽度和长度是20x,或者20y,然后我在正方形里面画了一个圆,它的半径是10x。现在,一条来自圆心的射线以45度角穿过圆圈的边界(可以是38度或其他任何角度)。现在我如何从正方形中得到射线与圆的连接地的x&y距离? 我试过以下代码: 我没有用这段代码得到确切的距离,用什么方法得到x&y距离?

  • 问题: 给定n个半径为r1的圆...rn和位置p1...pn。该算法必须找到包含所有n个圆的最小半径的圆的半径和圆心。圆的位置和半径是固定的,所以不能移动。 圆圈的结构可以看起来像这样: 输入值:[c1...cn] (c圈) 输出值:c 图像示例: 我的想法: 如果我找到最远的两点之间的距离并将圆心放在这条直线的一半上,我就可以画出包含n个圆的最小圆,但是有可能其他圆与主圆的圆心之间的距离比最远的

  • 给定空间(3D)中的3个点:A=(x1,y1,z1),B=(x2,y2,z2)C=(x3,y3,z3);那么如何求经过这三点的圆(弧)的圆心和半径,即求圆方程呢?使用Python和Numpy这里是我的初始代码 从CounterRadius定义中,可以使用以下方法找到半径: 那么中心(P)的笛卡尔坐标为: 但是,上面的barcyntric坐标值似乎并不正确。当用一个已知值的例子求解时,半径是正确的,

  • 我有一个Java Swing任务,目标如下: 当程序启动时,它会绘制20个未填充的圆,每个圆的半径和位置随机确定。 如果一个圆的周长线不与任何其他圆相交,则用红色画出该圆的轮廓。如果它至少与另一个圆相交,请用黑色绘制它。 添加一个JButton,每次按下JButton,就会创建一组新的圆,如上所述。 这些圆相距太远,不能共享一个周长点,即它们中心之间的距离大于它们半径的和(d>r1+r2)。示例。

  • 圆心o = (0.3501, -0.0881, -4.8466) 圆的法向量n = (0.4163, -0.8326, -0.3653) 圆的半径r=1.34954 直线上两点: a=(3.1932, -0.9005, 0.8082) b=(1.9885, -0.9691, -0.8353) 求圆上一点p,离直线ab的距离最近时的座标 由于圆与直线不共面,垂足f到圆心o的连线到圆的投影不再是最短距

  • 我想知道一种干净和通用的方法来实现这一点,只使用CSS超文本标记语言。最小的标记/黑客攻击是可取的。 目标是提供一个工作示例,其中: 有一个任意大小的父容器盒 到目前为止,这是一种丑陋的方法: