给定3D空间中的N个点,如何找到包含这N个点的最小球体?

时间:2010-03-07 04:26:19

标签: c++ algorithm data-structures

在3D空间中给定N个点,如何找到包含这N个点的最小球体?

3 个答案:

答案 0 :(得分:8)

这个问题被称为最小封闭球问题。 (谷歌这个术语可以找到关于它的教程和论文)。

这是一个实现:c ++中的http://www.inf.ethz.ch/personal/gaertner/miniball.html

它的2d情况(找到一个圆圈来包围平面中的所有点)是计算几何课程中教授的经典示例。 3D只是2D案例的简单扩展。

此问题的一种算法是增量样式。你从4点开始他们修复一个球体,当你添加第5点时,有两种情况:

  1. 这一点在球体中。无需更新。

  2. 除此之外。在这种情况下,您需要更新球体。然后一个非平凡的属性是这个新点必须在你的新球体上!

  3. 根据上述观察,您的问题会变小。阅读this book的第4.7节。它也可以在谷歌书上找到。

答案 1 :(得分:1)

问题归结为找到N点的凸包。大多数凸包算法,如分而治之,礼品包装或Jarvis March和Timothy Chan的算法也可以应用于3D。在所有这些算法中,Timothy Chan的算法是已知的最佳算法。

答案 2 :(得分:0)

这个问题有几种算法和实现。

  • 对于2D和3D,Gärtner's implementation可能是最快的。

  • 对于更高的尺寸(比如说高达10,000),请查看https://github.com/hbf/miniball,这是Gärtner,Kutz和Fischer的算法实现(注意:我是其中一个-authors)。

  • 对于非常非常高的维度,核心集(近似)算法会更快。

注意:如果您正在寻找计算球体的最小封闭球的算法,您将在Computational Geometry Algorithms Library (CGAL)中找到C ++实现。 (您不需要使用所有CGAL;只需提取所需的头文件和源文件。)