/*
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.
*/
data class Rect(
val x: Double, // top-left X
val y: Double, // top-left Y
val w: Double, // width
val h: Double // height
)
/*
Returns true if rectangles A and B overlap.
*/
fun rectanglesOverlap(A: Rect, B: Rect): Boolean {
// Compute edges of A
val A_left: Double = A.x
val A_right: Double = A.x + A.w
val A_top: Double = A.y
val A_bottom: Double = A.y + A.h
// Compute edges of B
val B_left: Double = B.x
val B_right: Double = B.x + B.w
val B_top: Double = B.y
val B_bottom: Double = 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
}
fun main() {
val A = Rect(10.0, 10.0, 30.0, 20.0) // Example rectangle A
val B = Rect(25.0, 15.0, 40.0, 25.0) // Overlaps A
val C = Rect(100.0, 100.0, 10.0, 10.0) // Does not overlap A
println("A vs B overlap? ${if (rectanglesOverlap(A, B)) "YES" else "NO"}")
println("A vs C overlap? ${if (rectanglesOverlap(A, C)) "YES" else "NO"}")
}
/*
run:
A vs B overlap? YES
A vs C overlap? NO
*/