Ejemplo n.º 1
0
        public static Collision2? FindCollision(Rectangle2 rectangle, Vector2 movement, Line2 line)
        {
            if (Vector2.Dot(movement, line.Normal()) >= 0)
                return null;

            var h = InFrontOf(rectangle.Center, line);
            var j = InFrontOf(rectangle.Center + movement, line);
            if (!h && !j)
                return null;

            var f1 = LineSegmentIntersection(line.Start, line.End, rectangle.TopLeft, rectangle.TopLeft + movement);
            var f2 = LineSegmentIntersection(line.Start, line.End, rectangle.TopRight, rectangle.TopRight + movement);
            var f3 = LineSegmentIntersection(line.Start, line.End, rectangle.BottomLeft, rectangle.BottomLeft + movement);
            var f4 = LineSegmentIntersection(line.Start, line.End, rectangle.BottomRight, rectangle.BottomRight + movement);

            if (!f1.HasValue && !f2.HasValue && !f3.HasValue && !f4.HasValue)
                return null;

            f1 = LinesIntersection(line.Start, line.End, rectangle.TopLeft, rectangle.TopLeft + movement);
            f2 = LinesIntersection(line.Start, line.End, rectangle.TopRight, rectangle.TopRight + movement);
            f3 = LinesIntersection(line.Start, line.End, rectangle.BottomLeft, rectangle.BottomLeft + movement);
            f4 = LinesIntersection(line.Start, line.End, rectangle.BottomRight, rectangle.BottomRight + movement);

            List<float> fs = new List<float>();

            if ((Vector2.Dot(rectangle.Top.Normal(), line.Normal()) <= 0) && (Vector2.Dot(rectangle.Left.Normal(), line.Normal()) <= 0))
                fs.Add(f1.Value);

            if ((Vector2.Dot(rectangle.Top.Normal(), line.Normal()) <= 0) && (Vector2.Dot(rectangle.Right.Normal(), line.Normal()) <= 0))
                fs.Add(f2.Value);

            if ((Vector2.Dot(rectangle.Bottom.Normal(), line.Normal()) <= 0) && (Vector2.Dot(rectangle.Left.Normal(), line.Normal()) <= 0))
                fs.Add(f3.Value);

            if ((Vector2.Dot(rectangle.Bottom.Normal(), line.Normal()) <= 0) && (Vector2.Dot(rectangle.Right.Normal(), line.Normal()) <= 0))
                fs.Add(f4.Value);

            var array = fs.OrderBy(x => x);

            if (!array.Any())
                return null;

            if (array.Last() < 0)
                return null;

            if (array.First() > 1)
                return null;

            Collision2 collision = new Collision2();

            collision.Value = MinLinesIntersection(rectangle, movement, line);
            collision.Line = line;

            return collision;
        }
Ejemplo n.º 2
0
        public static float? FindCollision(Vector2 position, Vector2 movement, Line2 line)
        {
            if (Vector2.Dot(movement, line.Normal()) >= 0)
                return null;

            return SegmentsIntersection(position, position + movement, line.Start, line.End);
        }
Ejemplo n.º 3
0
        public static Vector2? FindCollision(Rectangle2 rectangle, Line2 line)
        {
            var f1 = SegmentsIntersection(rectangle.Top, line);
            var f2 = SegmentsIntersection(rectangle.Left, line);
            var f3 = SegmentsIntersection(rectangle.Right, line);
            var f4 = SegmentsIntersection(rectangle.Bottom, line);

            if (!f1.HasValue && !f2.HasValue && !f3.HasValue && !f4.HasValue)
                return null;

            var d = Math.Min(Math.Min(Distance(rectangle.TopLeft, line), Distance(rectangle.TopRight, line)), Math.Min(Distance(rectangle.BottomLeft, line), Distance(rectangle.BottomRight, line)));

            return -line.Normal() * d * 1.01f;
        }