How to determine whether two axis‑aligned rectangles overlap in Java

1 Answer

0 votes
/**
Axis‑aligned rectangles are simply rectangles whose edges are parallel to the 
coordinate axes — meaning their sides are horizontal and vertical. 
That single assumption makes the overlap test dramatically simpler and faster.
*/

/**
    Rectangle overlap detection (axis-aligned)

    Each rectangle is defined by:
        - x, y : coordinates of its top-left corner
        - w, h : width and height

    Two rectangles DO NOT overlap if any separating condition is true:
        - One is completely to the left of the other
        - One is completely to the right of the other
        - One is completely above the other
        - One is completely below the other

    Otherwise, they overlap.

    This is the standard O(1) test for axis-aligned rectangles.
*/

class Rect {
    double x;      // top-left X
    double y;      // top-left Y
    double w;      // width
    double h;      // height

    Rect(double x, double y, double w, double h) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
    }
}

/**
    Returns true if rectangles A and B overlap.
*/
public class Main {

    public static boolean rectanglesOverlap(Rect A, Rect B) {
        // Compute edges of A
        double A_left   = A.x;
        double A_right  = A.x + A.w;
        double A_top    = A.y;
        double A_bottom = A.y + A.h;

        // Compute edges of B
        double B_left   = B.x;
        double B_right  = B.x + B.w;
        double B_top    = B.y;
        double B_bottom = B.y + B.h;

        // Separating conditions:
        if (A_right <= B_left)   return false;   // A is left of B
        if (B_right <= A_left)   return false;   // B is left of A
        if (A_bottom <= B_top)   return false;   // A is above B
        if (B_bottom <= A_top)   return false;   // B is above A

        return true; // Otherwise, they overlap
    }

    public static void main(String[] args) {
        Rect A = new Rect(10, 10, 30, 20);   // Example rectangle A
        Rect B = new Rect(25, 15, 40, 25);   // Overlaps A
        Rect C = new Rect(100, 100, 10, 10); // Does not overlap A

        System.out.println("A vs B overlap? " + (rectanglesOverlap(A, B) ? "YES" : "NO"));
        System.out.println("A vs C overlap? " + (rectanglesOverlap(A, C) ? "YES" : "NO"));
    }
}


/*
run:

A vs B overlap? YES
A vs C overlap? NO

*/

 



answered Jul 18 by avibootz

Related questions

...