Минимальная ограничивающая сфера для одного трехмерного треугольника
- Оригинальный пост--
Я пытаюсь вычислить минимальную ограничивающую сферу для трехмерного треугольника. Треугольник задается точками точка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().
Исходный вопрос был отредактирован вместе с решением.