给定中心,找到圆的最小半径,使它们完全覆盖另一个圆

时间:2011-04-30 15:27:54

标签: c algorithm geometry computational-geometry

我有以下几何问题: 您将获得一个圆心,其中心位于原点 - C(0,0)和半径1.圆内有N个点,代表N个不同圆的中心。要求您找到小圆的最小半径(所有圆的半径相等),以覆盖大圆的所有边界。

圆的数量为:3≤N≤10000,问题必须以P小数的精度求解,其中1≤P≤6。

例如:
N = 3且P = 4

和坐标:
(0.193,0.722)
(-0.158,-0.438)
(-0.068,0.00)

小圆圈的半径为:1.0686。

我有以下想法,但我的问题是实现它。该想法包括二进制搜索,以找到半径和二进制搜索给出的每个值,以尝试找到小圆圈和大圆圈之间的所有交叉点。每个交叉点都会产生弧形。下一步是将弧的坐标“投影”到X轴和Y轴,结果是多个间隔。如果来自X轴和Y轴的间隔的重聚具有每个轴上的间隔[-1,1],则意味着覆盖了所有圆。

为了避免精度问题,我想在0和2×10 P 之间进行搜索,并将半径设为10 P ,从而消除了逗号,但我的问题是弄清楚如何模拟圆的交集,然后如何查看结果区间的重聚是否形成区间[-1,1]。

欢迎任何建议!

2 个答案:

答案 0 :(得分:2)

集合中的每个点都必须覆盖点集的voronoi图中的单元格与原点周围的测试圆的交集。

要查找半径,请先计算点集的voronoi diagram。现在通过将所有无限边与目标圆相交来“关闭”此voronoi图。然后,对于集合中的每个点,检查其“闭合”voronoi单元格的所有点的距离。最大值应该是你的解决方案。

在测试圆之前,细胞被弧线而不是直线关闭,直到你的解决方案半径大于1(因为那时“小”圆圈会更强)。在这种情况下,您还必须检查从细胞中心到该弧的最远点。

答案 1 :(得分:0)

我可能会遗漏一些东西,但似乎你只需要找到圆点和给定点之间的最小最小距离。

也就是说,如果你考虑圆上所有点的集合,并将每个点之间的最小距离与给定点之一取得一致,然后取所有这些点的最大值 - 你就找到了你的半径。 / p>

当然,这不是一种算法,因为有很多不足之处。

我认为我要做的就是:

  1. 找出圆周与点集之间的最小距离,这是您的初始半径R。
  2. 检查整个圆圈是否被覆盖,如下所示: 对于彼此距离大于2R的任何两个点,检查整个段是否被覆盖(对于每个点,检查它周围的圆是否相交,如果是,则删除该段并继续)。那应该是大约o(N ^ 3)(你迭代每对点的所有点)。如果我是正确的(虽然我没有正式证明),如果所有部分都被覆盖,那么圆圈就会被覆盖。
  3. 在未覆盖的所有部分中,取长部分,并将其长度的一半加到R中。
  4. 重复。
  5. 这个算法本身永远不会覆盖圆,但很容易证明它以指数方式收敛到一个完整的覆盖,因此它应该能够在合理的迭代次数内以任意精度找到所需的半径。

    希望有所帮助。