public static Sphere From4Points( Vector3D s1, Vector3D s2, Vector3D s3, Vector3D s4 )
{
// http://www.gamedev.net/topic/652490-barycentric-coordinates-of-circumcenter-of-tetrahedron/
/*
// Python from Henry:
def sphere_from_4_points(points):
O, A, B, C = points
a = A - O
b = B - O
c = C - O
det = matrix3_det([a, b, c])
denominator = 2. * det
temp_v1 = cross(a,b) * dot(c,c)
temp_v2 = cross(c,a) * dot(b,b)
temp_v3 = cross(b,c) * dot(a,a)
o = (temp_v1 + temp_v2 + temp_v3) * (1./denominator)
radius = o.norm()
center = O + o
return (center,radius) */
Vector3D O = s1, A = s2, B = s3, C = s4;
Vector3D a = A - O;
Vector3D b = B - O;
Vector3D c = C - O;
double det = a.X * ( b.Y * c.Z - b.Z * c.Y ) - a.Y * ( b.X * c.Z - b.Z * c.X ) + a.Z * ( b.X * c.Y - b.Y * c.X );
double denominator = 2 * det;
Vector3D temp_v1 = a.Cross( b ) * c.Dot( c );
Vector3D temp_v2 = c.Cross( a ) * b.Dot( b );
Vector3D temp_v3 = b.Cross( c ) * a.Dot( a );
Vector3D o = (temp_v1 + temp_v2 + temp_v3) * (1/denominator);
double radius = o.Abs();
Vector3D center = O + o;
return new Sphere() { Center = center, Radius = radius };
}