用于在3D中封装三角形的最小球体?

时间:2012-01-20 19:59:23

标签: algorithm math linear-algebra

首先,我想你将顶点和比例相加1/3以找到原点然后从顶点到原点的最大距离。这会产生一个包含三角形的球体,但它不一定是最小的。

是否有一种已知的方法可以确定最小球体以完全封装3D中的任意三角形?

4 个答案:

答案 0 :(得分:5)

使用这里的答案和维基百科来提出适合我的c ++内容,我希望这对某人有帮助!

  static Sphere makeMinimumBoundingSphere(const Vec3 &p1, const Vec3 &p2, const Vec3 &p3) {
     Sphere s;
     // Calculate relative distances
     float A = (p1 - p2).distance();
     float B = (p2 - p3).distance();
     float C = (p3 - p1).distance();

     // Re-orient triangle (make A longest side)
     const Vec3 *a = &p3, *b = &p1, *c = &p2;
     if (B < C) swap(B, C), swap(b, c); 
     if (A < B) swap(A, B), swap(a, b); 

     // If obtuse, just use longest diameter, otherwise circumscribe
     if ((B*B) + (C*C) <= (A*A)) {
        s.radius = A / 2.f;
        s.position = (*b + *c) / 2.f;
     } else {
        // http://en.wikipedia.org/wiki/Circumscribed_circle
        precision cos_a = (B*B + C*C - A*A) / (B*C*2);
        s.radius = A / (sqrt(1 - cos_a*cos_a)*2.f);
        Vec3 alpha = *a - *c, beta = *b - *c;
        s.position = (beta * alpha.dot(alpha) - alpha * beta.dot(beta)).cross(alpha.cross(beta)) /
         (alpha.cross(beta).dot(alpha.cross(beta)) * 2.f) + *c;
     }
     return s;
  }

答案 1 :(得分:4)

封装三角形的最小球体只是延伸到第三维的circumsribed cirlce

更新:抓一点,当然不是。如果围绕其直径旋转最小圆圈,则会得到球体。原因在于,对于任何包含球体,其原点位于三角形平面之外的是一个较小的球体,其原点位于平面上(通过将原点正交投影到平面上)。

答案 2 :(得分:3)

您正在尝试找到点集P 的最小封闭球MB(P),因此您可以使用此处实现的算法https://github.com/hbf/miniball。 (注意:“球”和“球体”在此上下文中是同义词。)

然而,在你的情况下,这是过度的,因为手头的点集 P 恰好包含3个点(三角形的顶点)。在这种特殊情况下,您可以使用 P = {p,q,r} 的最小封闭球 MB(P)等于:

  • B(p,q)如果 b 包含在 B(p,q)
  • B(p,r)如果 q 包含在 B(p,r)
  • 中 如果 p 包含在 B(q,r)或中,则
  • B(q,r)
  • B(p,q,r)否则。

此处, B(x,y)是包含点 x,y B(x,y,z)的最小球是边界上包含点 x,y,z 的最小球。 B(x,y) B(x,y,z)可以通过求解线性方程组来计算。

注意:我是https://github.com/hbf/miniball的作者。

答案 3 :(得分:1)

假设球体只是一个圆形(2-D)到3-D的平凡延伸(使用相同的中心点和相同的半径),我相信你要找的是{ {3}}。

显然我没有考虑circumscribed circle of a triangle的情况,如果你在圆上有三角形的顶点(点),那么圆是最小的边界圆(以及最小的边界球)。

现在我相信您正在寻找obtuse triangle,这是minimum bounding sphere,和计算机mathematics中已知和已研究的问题。 描述了 O(n ^ {2})和线性 O(n)算法。

据我所知,最小边界圆确实产生最小边界球,使用投影到三维的相同参数(中心点和半径)。