I try to store the rectangles as min x, min y, max x and max y. Then overlap occurs when
r1.maxX > r2.minX && r1.minX < r2.maxX && r1.maxY > r2.minY && r1.minY < r2.maxY
And if they overlap, the intersection is determined
r3.minX = max(r1.minX, r2.minX); r3.minY = max(r1.minY, r2.minY); r3.maxX = min(r1.maxX, r2.maxX); r3.maxY = min(r1.maxY, r2.maxY);
Some caution should be taken depending on whether you consider them overlapping if they have the same boundary. I used strict inequalities, which means that overlapping borders are not considered overlapping. Given that you use integers (and therefore borders have a width of 1), I assume that you want to consider overlapping borders as overlapping. I would do something like:
public class Rect { public int minX; public int minY; public int maxX; public int maxY; public Rect() {} public Rect(int x, int y, int w, int h) { this.minX = x; this.minY = y; this.maxX = x + w -1; this.maxY = y + h -1; } public boolean Intersect(Rect r) { return this.maxX >= r.minX && this.minX <= r.maxX && this.maxY >= r.minY && this.minY <= r.maxY; } public Rect GetIntersection(Rect r) { Rect i = new Rect(); if (this.Intersect(r)) { i.minX = Math.max(this.minX, r.minX); i.minY = Math.max(this.minY, r.minY); i.maxX = Math.min(this.maxX, r.maxX); i.maxY = Math.min(this.maxY, r.maxY); } return i; } public int GetWidth() { return this.maxX - this.minX + 1; } public int GetHeight() { return this.maxY - this.minY + 1; } public void SetPosition(int x, int y) { int w = this.GetWidth(); int h= this.GetHeight(); this.minX = x; this.minY = y; this.maxX = x + w -1; this.maxY = y + h -1; } }
source share