Search code examples
mathintersectionrect

How to check intersection between 2 rotated rectangles?


Can someone explain how to check if one rotated rectangle intersect other rectangle?


Solution

    1. For each edge in both polygons, check if it can be used as a separating line. If so, you are done: No intersection.
    2. If no separation line was found, you have an intersection.
    /// Checks if the two polygons are intersecting.
    bool IsPolygonsIntersecting(Polygon a, Polygon b)
    {
        foreach (var polygon in new[] { a, b })
        {
            for (int i1 = 0; i1 < polygon.Points.Count; i1++)
            {
                int i2 = (i1 + 1) % polygon.Points.Count;
                var p1 = polygon.Points[i1];
                var p2 = polygon.Points[i2];
    
                var normal = new Point(p2.Y - p1.Y, p1.X - p2.X);
    
                double? minA = null, maxA = null;
                foreach (var p in a.Points)
                {
                    var projected = normal.X * p.X + normal.Y * p.Y;
                    if (minA == null || projected < minA)
                        minA = projected;
                    if (maxA == null || projected > maxA)
                        maxA = projected;
                }
    
                double? minB = null, maxB = null;
                foreach (var p in b.Points)
                {
                    var projected = normal.X * p.X + normal.Y * p.Y;
                    if (minB == null || projected < minB)
                        minB = projected;
                    if (maxB == null || projected > maxB)
                        maxB = projected;
                }
    
                if (maxA < minB || maxB < minA)
                    return false;
            }
        }
        return true;
    }
    

    For more information, see this article: 2D Polygon Collision Detection - Code Project

    NB: The algorithm only works for convex polygons, specified in either clockwise, or counterclockwise order.