Минимальная ограничивающая сфера для одного трехмерного треугольника

- Оригинальный пост--

Я пытаюсь вычислить минимальную ограничивающую сферу для трехмерного треугольника. Треугольник задается точками точка0, точка1, точка2.

Код ниже был создан из http://en.wikipedia.org/wiki/Circumscribed_circle

Для примера ввода (0,0,10), (0,10,0), (10,0,0) следующий код дает:

radius = 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);

    }

1 ответ

Я обнаружил проблему: в исходном коде minSphereCenter использовалась функция scaleAdd(), которая, как я предполагал, работала как функция addScale().

Исходный вопрос был отредактирован вместе с решением.

Другие вопросы по тегам