public bool Intersect(LineSegment l, out Vector2 pt, out Vector2 K) { Vector2 P = P1 - P0; Vector2 S = l.P1 - l.P0; Matrix2 A = new Matrix2(P.X, -S.X, P.Y, -S.Y); if (Math.Abs(A.Determinant()) < 1e-10) { pt = default(Vector2); K = default(Vector2); return(false); } K = A.Inverse() * (l.P0 - P0); if (K.X >= 0 && K.X <= 1 && K.Y >= 0 && K.Y <= 1) { pt = P0 + P * K.X; return(true); } else { pt = default(Vector2); return(false); } }
public static Circle FromLines(Line oncircle, Line toline, out Vector2 tolinePoint) { tolinePoint = default(Vector2); Vector2 m = (oncircle.P1 - oncircle.P0).Normalize(); Vector2 u = (toline.P1 - toline.P0).Normalize(); if (Math.Abs(m.Cross(u)) < 1e-10) { return(Circle.Infinite); } Vector2 c = m.Rotate90(); Vector2 t = u.Rotate90(); Vector2 t_c = t - c; Matrix2 A = new Matrix2( u.X, t_c.X, u.Y, t_c.Y); Vector2 d = oncircle.P0 - toline.P0; if (Math.Abs(A.Determinant()) < 1e-10) { return(Circle.Infinite); } Vector2 pvec = A.Inverse() * d; Vector2 center = oncircle.P0 + pvec.Y * c; tolinePoint = toline.P0 + pvec.X * u; return(new Circle(Math.Abs(pvec.Y), center)); }
public void DeterminantIsCorrectFor2x2() { // Arrange var matrix = new Matrix2(3, 5, -2, 3); // Act var result = matrix.Determinant(); // Assert Assert.AreEqual(19, result); }
public void Determinant_ShouldReturnExpectedValue() { // arrange var sut = new Matrix2(new[, ] { { 1f, 5f }, { -3f, 2f } }); // act var result = sut.Determinant(); // assert result.Should().Be(17); }