我有以下几何问题: 您将获得一个圆心,其中心位于原点 - 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]。
欢迎任何建议!
答案 0 :(得分:2)
集合中的每个点都必须覆盖点集的voronoi图中的单元格与原点周围的测试圆的交集。
要查找半径,请先计算点集的voronoi diagram。现在通过将所有无限边与目标圆相交来“关闭”此voronoi图。然后,对于集合中的每个点,检查其“闭合”voronoi单元格的所有点的距离。最大值应该是你的解决方案。
在测试圆之前,细胞被弧线而不是直线关闭,直到你的解决方案半径大于1(因为那时“小”圆圈会更强)。在这种情况下,您还必须检查从细胞中心到该弧的最远点。
答案 1 :(得分:0)
我可能会遗漏一些东西,但似乎你只需要找到圆点和给定点之间的最小最小距离。
也就是说,如果你考虑圆上所有点的集合,并将每个点之间的最小距离与给定点之一取得一致,然后取所有这些点的最大值 - 你就找到了你的半径。 / p>
当然,这不是一种算法,因为有很多不足之处。
我认为我要做的就是:
这个算法本身永远不会覆盖圆,但很容易证明它以指数方式收敛到一个完整的覆盖,因此它应该能够在合理的迭代次数内以任意精度找到所需的半径。
希望有所帮助。