【问题标题】:Find circle of given radius that contains no points查找给定半径的不包含点的圆
【发布时间】:2017-01-15 05:09:49
【问题描述】:

我正在解决一个基本上可以归结为以下问题的问题:

给定:

  • 一组(x,y) 点。集合中可能有 0 个点。
  • xy 的最小值和最大值,其中最小值始终为非负数。
  • 半径r

确定是否可以在平面上的任意位置放置一个半径为 r 的圆,以使该圆在边界内且不包含任何点,如果可以,则返回该位置。

允许相交 - 集合中的点可以与圆相交,但不能包含在圆内。圆可以切向接触最小和最大 x 和 y 值,但不能超出范围。

结果将是圆心所在的(x,y)点,或者如果没有这样的位置,则为一些虚拟结果(即(-1,-1))/失败。如果有多个有效的解决方案,返回任何一个都可以。

对解决此类位置的算法有什么想法吗?我最终会在 java 中实现,但我可以使用伪代码。

【问题讨论】:

  • 所以,你想说“给定 n 个点和一个范围,找到一个范围内并包含零个点的圆。” ?
  • 那个圆的半径是r,是的。假设您的意思是二维范围。

标签: algorithm geometry


【解决方案1】:

回答

如果 n 是点数,我会告诉 n >= 2 案例的解决方案。

您可以找到穿过所选 2 点的两个圆圈。

如果圆在一个范围内并且它正好包含零点,则可以输出圆。

因此,您可以选择一对点(p[i], p[j]) 并检查所有圆圈。

如果你不知道得到两个圈的解决方案,请阅读此。
Circle of given radius through two points

你可以这样实现:

for i = 0 to n-1
    for j = 0 to n-1
        if dist(p[i], p[j]) <= 2 * r
            circle c1, c2 = circle that goes through p[i] and p[j]
            bool f1 = true
            for k = 0 to n-1
                if p[k] is in c1 -> f1 = false
            if f1 is true -> return center of c1
            bool f2 = true
            for k = 0 to n-1
                if p[k] is in c2 -> f2 = false
            if f2 is true -> return center of c2

如果找不到,可以使用Monte Carlo Algorithm
如果在随机选择的数千个点中找不到,我认为“找不到”是可以的。

【讨论】:

  • 通过任意两点的圆有无穷多个。
  • @n.m.不,半径是r,而且是给定的。
  • 抱歉错过了。
  • 程序仍然没有给出正确的答案。示例:边界是正方形((0,0),(2,2)),半径为1,点为(0,0.5)和(0,0,1.5)。通过这些点的两个圆都违反了边界,但是 (1,1) 处的圆没有并且不包含点。
  • @n.m.什么是 (0, 0, 1.5)?
【解决方案2】:

构建您的点集的Delaunay triangulation。对于每个点,执行以下过程。

围绕你的点画一个半径为 2r 的圆。如果所有相邻点都在圆内,则此点不好,继续下一个。

如果不是,请考虑所有具有此顶点的三角形。它们形成一些凸多边形。如有必要,将其修剪到您所在地区的边界(它仍然很复杂)。现在您需要找到一个半径为 r 的圆,该圆位于该多边形内部且不包含当前点。这是一个简单的几何练习(绘制一个半径为 r 的圆,与每对相邻边相切;如果任何这样的圆不包含点集中的任何点,则完成)。

您可以通过多种方式加速此过程(例如,如果任何三角形的外接圆完全在您的矩形内,并且半径为 r 或更大,那么您就完成了)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2010-12-10
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多