我收集了10000-100000个球体,我需要找到相距最远的球体。
一种简单的方法是简单地将所有球体相互比较并存储最大距离,但这感觉就像是算法的真正资源消耗。
球体通过以下方式存储:
Sphere (float x, float y, float z, float radius);
方法Sphere :: distanceTo(Sphere&s)返回两个球的中心点之间的距离。
例:
Sphere *spheres; float biggestDistance; for (int i = 0; i < nOfSpheres; i++) { for (int j = 0; j < nOfSpheres; j++) { if (spheres[i].distanceTo(spheres[j]) > biggestDistance) { biggestDistance = spheres[i].distanceTo(spheres[j]) > biggestDistance; } } }
我正在寻找的是一种算法,该算法会以某种更智能的方式循环遍历所有可能的组合(如果有)。
该项目是用C 编写的(必须使用C 编写),因此, 仅 适用于C / C ++以外的语言的任何解决方案都不会引起人们的兴趣。
一组点中任意两个点之间的最大距离S称为 直径 。在计算几何中,找到一组点的直径是一个众所周知的问题。通常,这里有两个步骤:
S
找到由每个球体的中心组成的三维凸包-使用 quickhull CGAL中的实现。
quickhull
找到船体上最远的点。(在船体内部的两个点不能是直径的一部分,否则它们将在船体上,这是矛盾的。)
使用quickhull,您可以在平均情况下运行O(n log n),在最坏情况下运行时间为O(n 2)。(在实践中,quickhull明显优于所有其他已知算法。)如果可以保证球序的某些属性,则可以保证更好的最坏情况下的边界,但这是不同的话题。
第二步可以通过Ω(h log h)进行,其中h是船体上的点数。在最坏的情况下h = n(每个点都在船体上),但是如果您有成千上万个随机球体,那几乎是不可能的。一般而言,h将小于n。这 是此方法的概述。
h
h = n
n