【问题标题】:How do you determine if you can draw a circle around a set of points, such that the points from the other set aren't inside it?您如何确定是否可以围绕一组点画一个圆圈,以使另一组的点不在其中?
【发布时间】:2015-06-06 19:57:04
【问题描述】:

我想知道一个返回真或假的算法,告诉我是否可以围绕一组点 A 画一个圆,这样一组点 B 中的任何点都不在它里面,或者以其他方式周围(可以围绕一组点 B 画一个圆,这样一组点 A 中的任何点都不在其中)。

基本上,您将获得两组点作为输入,您需要确定是否可以围绕其中一组点画一个圆圈,以使另一组的任何点都不在其中。

我查看了Megiddo's linear time algorithmsmallest enclosing circle problem,但问题是它只绘制最小的圆,这意味着它不适用于需要大圆的情况。

这是我的意思的图片:

在这张图片中,可以在一组红点周围画一个非常大的圆圈,这样任何一个绿点都不在其中,因此 Megiddo 的算法将不起作用。

【问题讨论】:

    标签: algorithm math geometry set computational-geometry


    【解决方案1】:

    在本文中,我们减少了检测平面上是否有两组点 可以被一个圆隔开,到3D点的线性可分性:

    O'Rourke、Joseph、S. Rao Kosaraju 和 Nimrod Megiddo。 “计算循环可分性。” 离散和计算几何1.1 (1986):105-113。 (PDF download.)

    【讨论】:

    • 摘自您的摘要:“我们表明,通过 Megiddo 的线性规划算法,可以在 O*(*n) 时间内确定两个集合是否可循环分离。” OP 声称 Megiddo 的算法不适用于该示例(但也许这只是它对拼写错误的报复)。
    • @Jongware Megiddo 的算法表明 3d 中的线性规划问题可以在线性时间内解决。 Megiddo 还提供了一个使用找到最小封闭圆的算法的示例。这个例子不是OP想要的。然而,这里的论文展示了一个不同的公式,它确实允许应用 Megiddo 的算法。 (这个想法是将点投影到抛物面上,然后找到一个分离平面。)
    【解决方案2】:

    试试这个:使用stereographic projection 将您的点投影到球体上。然后你需要找到一个穿过球体的平面来切割球体,使第一组中的所有点都在平面的一侧,第二组中的所有点都在平面的另一侧。平面和球体的交点是一个圆,它映射回原始平面上的一个圆(或在极少数情况下,一条线)。在原始平面上生成的圆具有您想要的属性。

    将问题从关于平面上的圆更改为关于三维平面(线性对象)的问题意味着您可以使用线性规划和凸集的思想来提供帮助。一种方法是使用hyperplane separation theorem 表明当且仅当 A 和 B 中点的图像的凸包不相交时,您可以找到一个平面来分离点族的图像。

    硬件和软件中有很多快速的方法可以确定两个凸体是否相交:这是碰撞检测问题,例如在视频游戏中很重要。在这个问题上已经做了很多工作(参见,例如,https://www.medien.ifi.lmu.de/lehre/ss10/ps/Ausarbeitung_Beispiel.pdf,它声称该算法在 O(n) 时间内运行)并且肯定有免费可用的代码。

    总而言之:通过公式给出的立体投影将您的点 (X,Y) 映射到单位球体 (x,y,z) 上

    (x,y,z) = (2*X/(R^2+1), 2*Y/(R^2+1), (R^2-1)/(R^2+1)), R^2 = X^2+Y^2
    

    然后使用 Gilbert-Johnson-Keerthi 算法或其他一些碰撞检测算法来确定一组中点的图像的凸包是否与另一组中点的图像的凸包不相交。这就回答了圆是否存在的问题。要真正找到圆,您需要两个凸体之间的分离平面,然后将其与球体相交以获得球体上的圆,然后通过立体投影的倒数将其映射回平面。

    如果我理解正确,以上可以在 O(n) 时间内完成。

    【讨论】:

      【解决方案3】:

      如果您要测试很多潜在的中心点(例如在网格上),那么对于每个点,到任何红点的最大距离必须小于到任何绿点的最小距离,以便获得一个只包含红点而没有绿点的圆圈。

      我想通过从稀疏网格开始并监控“到任何红点的最大距离”、“到任何绿点的最小距离”值,您可以使一些有希望的区域越来越精细(巧妙的切片),最终捕捉到具有所需属性的点或区域。

      您甚至可以使用一些导数,例如进入“到任何红点的最大距离”与“到任何绿点的最短距离”的比率下降最快的方向。另一方面,问题可能是非凸的,可能无法保证收敛。

      【讨论】:

        【解决方案4】:

        只是一个想法:取所有红点和绿点对。

        对于每一对,计算正交中心线。

        线上的这些点就是到绿点和红点的距离相等的点,所以以此为中心的圆是没有意义的。

        但是红点所在的直线同一侧的区域也是潜在中心点所在的区域。

        对于每一对 {red,green},您将得到一条线和一个区域,即圆的中心点所在的位置。

        如果你与所有对的所有区域相交,你将获得所有圆的所有潜在中心点。

        在您的示例中,取两个绿色和它们之间的红色点。您将在垂直轴左右距离的 1/2 处得到两条线。

        取左边的绿点和所有的红点,你会得到从左上角到右下角的线,圆心会在它们上面。

        右边的绿点和红色的点差不多。因此,在这种情况下,您会得到一个距离垂直轴不太远且在水平轴上方至少有一定距离并延伸到无穷大的结果区域(多边形)。

        对于另一组点,交叉点可能会导致一个空集,这意味着如果不将一些绿色点纳入其中,您就无法在红色点周围绘制这样的圆圈。

        这将始终计算出正确的结果,但我不知道与 Joseph 的算法相比性能有多好。也许他可以看看?

        【讨论】:

          猜你喜欢
          • 2021-04-11
          • 2021-06-24
          • 2019-09-04
          • 2023-02-24
          • 1970-01-01
          • 1970-01-01
          • 2019-04-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多