package utils.scene.quadtree;
public class Box {
public final float minX;
public final float minY;
public final float maxX;
public final float maxY;
public final float centreX;
public final float centreY;
public Box(float minX, float minY, float maxX, float maxY) {
this.minX = Math.min(minX, maxX);
this.minY = Math.min(minY, maxY);
this.maxX = Math.max(minX, maxX);
this.maxY = Math.max(minY, maxY);
this.centreX = (minX + maxX) / 2;
this.centreY = (minY + maxY) / 2;
}
public boolean contains(float x, float y) {
return (x >= this.minX &&
y >= this.minY &&
x < this.maxX &&
y < this.maxY);
}
public boolean containsOrEquals(Box box) {
return (box.minX >= this.minX &&
box.minY >= this.minY &&
box.maxX <= this.maxX &&
box.maxY <= this.maxY);
}
public Box intersection(Box r) {
float tempX1 = this.minX;
float tempY1 = this.minY;
float tempX2 = this.maxX;
float tempY2 = this.maxY;
if (this.minX < r.minX) tempX1 = r.minX;
if (this.minY < r.minY) tempY1 = r.minY;
if (tempX2 > r.maxX) tempX2 = r.maxX;
if (tempY2 > r.maxY) tempY2 = r.maxY;
if(tempX2-tempX1 <=0.f || tempY2-tempY1 <= 0.f) return null;
return new Box(tempX1, tempY1, tempX2, tempY2);
}
public boolean intersects(Box other) {
if ((this.maxX-this.minX) <= 0 || (this.maxY-this.minY) <= 0) {
return false;
}
return (other.maxX > this.minX &&
other.maxY > this.minY &&
other.minX < this.maxX &&
other.minY < this.maxY);
}
public Box union(Box b) {
return new Box( Math.min(this.minX, b.minX),
Math.min(this.minY, b.minY),
Math.max(this.maxX, b.maxX),
Math.max(this.maxY, b.maxY));
}
public float calcDist(float x, float y) {
float distanceX;
float distanceY;
if (this.minX <= x && x <= this.maxX) {
distanceX = 0;
} else {
distanceX = Math.min(Math.abs(this.minX - x), Math.abs(this.maxX - x));
}
if (this.minY <= y && y <= this.maxY) {
distanceY = 0;
} else {
distanceY = Math.min(Math.abs(this.minY - y), Math.abs(this.maxY - y));
}
return (float) Math.sqrt(distanceX * distanceX + distanceY * distanceY);
}
public Box scale(float scaleX, float scaleY) {
scaleY *= this.centreY - this.minY;
scaleX *= this.centreX - this.minX;
return new Box(this.minX - scaleX, this.minY-scaleY, this.maxX + scaleX, this.maxY + scaleY);
}
@Override
public String toString() {
return "upperLeft: (" + minX + ", " + minY + ") lowerRight: (" + maxX + ", " + maxY + ")";
}
}