找到不包含点

时间:2017-01-15 05:09:50

标签: algorithm geometry

我正在研究一个基本上减少到以下问题的问题:

假设:

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

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

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

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

有关解决此类位置的算法的任何想法?我最终会在java中实现,但我可以使用psuedocode。

2 个答案:

答案 0 :(得分:0)

答案

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

你可以找到两个通过选定的2个点的圆圈。

Circles that goes through 2 points

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

因此,您可以选择一对积分(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
如果你无法在随机选择的数千个点中找到,我认为&#34;找不到&#34;没关系。

答案 1 :(得分:0)

构建{point}的Delaunay triangulation。对于每个点,请执行以下步骤。

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

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

你可以用各种方式加速它(例如,如果任何三角形的外接圆完全在你的矩形内,并且半径是r或更大,你就完成了。)