Ejemplo n.º 1
0
        /// <summary> Attempts to calculate circle with center in 'c' and radius 'r' from three points </summary>
        public static bool TryCreate(Vector2 v0, Vector2 v1, Vector2 v2, out Vector2 c, out float r)
        {
            c = default;
            r = default;

            var c1 = new Vector4(v0.x * v0.x + v0.y * v0.y, v1.x * v1.x + v1.y * v1.y, v2.x * v2.x + v2.y * v2.y, 0.0f);
            var c2 = new Vector4(v0.x, v1.x, v2.x, 0.0f);
            var c3 = new Vector4(v0.y, v1.y, v2.y, 0.0f);
            var c4 = new Vector4(1.0f, 1.0f, 1.0f, 0.0f);
            var c5 = new Vector4(0.0f, 0.0f, 0.0f, 1.0f);

            var M11 = new Matrix4x4(c2, c3, c4, c5);
            var M12 = new Matrix4x4(c1, c3, c4, c5);
            var M13 = new Matrix4x4(c1, c2, c4, c5);
            var M14 = new Matrix4x4(c1, c2, c3, c5);

            var m11 = M11.determinant;
            var m12 = M12.determinant;
            var m13 = M13.determinant;
            var m14 = M14.determinant;

            if (Mathx.IsZero(m11))
            {
                return(false);
            }

            c.x = 0.5f * m12 / m11;
            c.y = -0.5f * m13 / m11;
            r   = Mathf.Sqrt(c.x * c.x + c.y * c.y + m14 / m11);
            return(true);
        }
Ejemplo n.º 2
0
        public static LinearEquation FromPoints(Vector2 A, Vector2 B)
        {
            if (Mathx.IsZero(A.x) && Mathx.IsZero(B.x))
            {
                return(invalid);
            }

            float a = (B.y - A.y) / (B.x - A.x);
            float b = A.y - a * A.x;

            return(new LinearEquation(a, b));
        }
Ejemplo n.º 3
0
 public bool IsValid()
 {
     return(!Mathx.IsZero(a) && !Mathx.IsZero(b));
 }
Ejemplo n.º 4
0
 public bool IsValid()
 {
     return(!Mathx.IsZero(x) || !Mathx.IsZero(y));
 }
Ejemplo n.º 5
0
        /// <summary> Attempts to calculate a sphere with center in 'c' and radius 'r' from four points </summary>
        public static bool TryCreate(Vector3 v0, Vector3 v1, Vector3 v2, Vector3 v3, out Vector3 c, out float r)
        {
            c = default;
            r = default;

            var p = new float[4, 4]
            {
                { v0.x, v0.y, v0.z, 1.0f },
                { v1.x, v1.y, v1.z, 1.0f },
                { v2.x, v2.y, v2.z, 1.0f },
                { v3.x, v3.y, v3.z, 1.0f }
            };
            var a = new float[4, 4];

            // Find minor 1, 1.
            for (int i = 0; i < 4; i++)
            {
                a[i, 0] = p[i, 0];
                a[i, 1] = p[i, 1];
                a[i, 2] = p[i, 2];
            }
            float detM11 = Mathx.Determinant(a);

            if (Mathx.IsZero(detM11))
            {
                return(false);
            }

            for (int i = 0; i < 4; i++)
            {
                a[i, 0] = p[i, 0] * p[i, 0] + p[i, 1] * p[i, 1] + p[i, 2] * p[i, 2];
            }

            for (int i = 0; i < 4; i++)
            {
                a[i, 1] = p[i, 1];
                a[i, 2] = p[i, 2];
            }
            float detM12 = Mathx.Determinant(a);

            for (int i = 0; i < 4; i++)
            {
                a[i, 1] = p[i, 0];
                a[i, 2] = p[i, 2];
            }
            float detM13 = Mathx.Determinant(a);

            for (int i = 0; i < 4; i++)
            {
                a[i, 1] = p[i, 0];
                a[i, 2] = p[i, 1];
            }
            float detM14 = Mathx.Determinant(a);

            for (int i = 0; i < 4; i++)
            {
                a[i, 1] = p[i, 0];
                a[i, 2] = p[i, 1];
                a[i, 3] = p[i, 2];
            }
            float detM15 = Mathx.Determinant(a);

            c.x = 0.5f * detM12 / detM11;
            c.y = -0.5f * detM13 / detM11;
            c.z = 0.5f * detM14 / detM11;
            r   = Mathf.Sqrt(c.x * c.x + c.y * c.y + c.z * c.z - detM15 / detM11);
            return(true);
        }