R3.Geometry.Sphere.From4Points C# (CSharp) Method

From4Points() public static method

public static From4Points ( Vector3D s1, Vector3D s2, Vector3D s3, Vector3D s4 ) : Sphere
s1 Vector3D
s2 Vector3D
s3 Vector3D
s4 Vector3D
return Sphere
        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 };
        }