单个三维三角形的最小边界球体



——原始帖子--

我正在尝试计算三维三角形的最小边界球体。三角形由点0、点1、点2给出。

下面的代码是从创建的http://en.wikipedia.org/wiki/Circumscribed_circle#Barycentric_coordinates_from_cross-_和不生产

对于样本输入(0,0,10(、(0,10,0(、(10,0,0(,以下代码给出:

半径=8.164967,这是正确的(通过使用Google Sketchup绘制模型进行验证(。

minSphereCenter=(10,3.333…,1.111…(,这是不正确的。

正确的中心点是(3.333…,3.333……,3.333..(。


我做错了什么?

注意:我知道这不会给出钝角三角形的最小边界球体。

--解决方案--

class Triangle{
  Vector3f point0, point1, point2;
  Vector3f minSphereCenter;
  float minSphereRadius;
  private void calculateMinimumBoundingSphere() {
    minSphereRadius=
      (point0.distance(point1)*point1.distance(point2)*point2.distance(point0))/
                (2*(new Vector3f().cross(new Vector3f().sub(point0, point1), new Vector3f().sub(point1, point2)).length()));
    float divisor=2*(new Vector3f().cross(new Vector3f().sub(point0, point1), new Vector3f().sub(point1, point2)).lengthSquared());
    float
      i=point1.distanceSquared(point2)*new Vector3f().sub(point0, point1).dot(new Vector3f().sub(point0, point2))/
        divisor,
      j=point0.distanceSquared(point2)*new Vector3f().sub(point1, point0).dot(new Vector3f().sub(point1, point2))/
        divisor,
      k=point0.distanceSquared(point1)*new Vector3f().sub(point2, point0).dot(new Vector3f().sub(point2, point1))/
        divisor;
      minSphereCenter=new Vector3f(point0).scale(i).add(new Vector3f(point1).scale(j)).add(new Vector3f(point2).scale(k));
      System.out.println(minSphereCenter);
      System.out.println(minSphereRadius);
    }

我发现了问题:最初的minSphereCenter代码使用了scaleAdd((函数,我认为它的工作原理类似于addScale((函数。

原始问题已随解决方案一起编辑。

相关内容

  • 没有找到相关文章

最新更新