我倾向于将矩形存储为min x,min y,max x和max y。然后当发生重叠时
r1.maxX > r2.minX &&r1.minX < r2.maxX &&r1.maxY > r2.minY &&r1.minY < r2.maxY
如果它们重叠,则交点定义为
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);
如果它们具有相同的边界,则应根据您是否认为它们重叠来进行一些注意。我使用了严格的不等式,这意味着重叠的边界不算作重叠。假设您使用的是整数(因此边界的宽度为1),则我假设您确实希望将重叠边界视为重叠。我会做类似的事情:
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; }}


