/*
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 {
public float $x; // top-left X
public float $y; // top-left Y
public float $w; // width
public float $h; // height
public function __construct(float $x, float $y, float $w, float $h) {
$this->x = $x;
$this->y = $y;
$this->w = $w;
$this->h = $h;
}
}
/*
Returns true if rectangles A and B overlap.
*/
function rectanglesOverlap(Rect $A, Rect $B): bool {
// Compute edges of A
$A_left = $A->x;
$A_right = $A->x + $A->w;
$A_top = $A->y;
$A_bottom = $A->y + $A->h;
// Compute edges of B
$B_left = $B->x;
$B_right = $B->x + $B->w;
$B_top = $B->y;
$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
}
// Example rectangles
$A = new Rect(10, 10, 30, 20); // Example rectangle A
$B = new Rect(25, 15, 40, 25); // Overlaps A
$C = new Rect(100, 100, 10, 10); // Does not overlap A
echo "A vs B overlap? " . (rectanglesOverlap($A, $B) ? "YES" : "NO") . "\n";
echo "A vs C overlap? " . (rectanglesOverlap($A, $C) ? "YES" : "NO") . "\n";
/*
run:
A vs B overlap? YES
A vs C overlap? NO
*/