/// <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); }
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)); }
public bool IsValid() { return(!Mathx.IsZero(a) && !Mathx.IsZero(b)); }
public bool IsValid() { return(!Mathx.IsZero(x) || !Mathx.IsZero(y)); }
/// <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); }