public void RectRayCasting_ShouldReturnNull_WhenInOppositeDirection()
        {
            // arrange
            MapRect rect = new MapRect(1, 0, 2, 2);
            Ray     ray  = new Ray(-3, 0, -1, 0);

            // act
            Trace trace = RayCast.CheckBulletTrace(ray, rect);

            // assert
            Assert.IsNull(trace);
        }
        public void CircleRayCasting_ShouldReturnNull_WhenInOppositeDirection()
        {
            // arrange
            MapCircle circle = new MapCircle(1, 0, 1);
            Ray       ray    = new Ray(-3, 0, -1, 0);

            // act
            Trace trace = RayCast.CheckBulletTrace(ray, circle);

            // assert
            Assert.IsNull(trace);
        }
        public void CircleRayCasting_ShouldReturnHitPosition_2()
        {
            // arrange
            MapCircle circle = new MapCircle(10, 10, 1);
            Ray       ray    = new Ray(20, 10, -1, 0);

            // act
            Trace trace = RayCast.CheckBulletTrace(ray, circle);

            // assert
            Assert.IsNotNull(trace);
            Assert.AreEqual(trace.Position, new Vector2(11, 10));
        }
        public void RectRayCasting_ShouldReturnHitPosition_3()
        {
            // arrange
            MapRect rect = new MapRect(10, 10, 1, 1);
            Ray     ray  = new Ray(10, 12, 0, -1);

            // act
            Trace trace = RayCast.CheckBulletTrace(ray, rect);

            // assert
            Assert.IsNotNull(trace);
            Assert.AreEqual(trace.Position, new Vector2(10, 10.5));
        }
        public void CircleRayCasting_ShouldReturnHitPosition_1()
        {
            // arrange
            MapCircle circle = new MapCircle(10, 10, 1);
            Ray       ray    = new Ray(0, 0, 1, 1);

            // act
            Trace trace = RayCast.CheckBulletTrace(ray, circle);

            // assert
            Assert.IsNotNull(trace);

            var     c = Math.Sqrt(2) / 2;
            Vector2 expectedPosition = circle.Position - new Vector2(c, c);

            Assert.AreEqual(expectedPosition.X, trace.Position.X, 1e-6);
            Assert.AreEqual(expectedPosition.Y, trace.Position.Y, 1e-6);
        }