我真诚地在这里迷惑......哪一个实际上返回了两个矩形之间的交叉区域?请求解释(数学让我感到沮丧)。任何帮助将不胜感激。
APPROACH ONE: double newX = Math.max(this.x,rect2.x); double newY = Math.max(this.y,rect2.y); 返回new Rect(newX,newY,Math.min(this.x + this.width,rect2.x + rect2.width) - newX,Math.min(this.y + this.height,rect2.y + rect2.height) - newY);
APPROACH TWO:
double areaOfIntersection = Math.max(0,Math.max(rect1x2,rect2x2) - Math.min(rect1x1,rect2x1))
* Math.max(0,Math.max(rect1y2,rect2y2) - Math.min(rect1y1,rect2y1));
答案 0 :(得分:4)
您的代码几乎是正确的。您发布代码的方式令人困惑,因为似乎this
指的是一个矩形而rect2
指的是第二个矩形。为什么不制作Rect#area()
方法而不是单独计算交叉区域?
class Rect {
double x, y, width, height;
... members and stuff
Rect intersection(Rect rect2) {
double newX = Math.max(this.x, rect2.x);
double newY = Math.max(this.y, rect2.y);
double newWidth = Math.min(this.x + this.width, rect2.x + rect2.width) - newX;
double newHeight = Math.min(this.y + this.height, rect2.y + rect2.height) - newY;
if (newWidth <= 0d || newHeight <= 0d) return null;
return new Rect(newX, newY, newWidth, newHeight);
}
double area() {
return this.width * this.height;
}
}
然后你会做
Rect intersection = rect1.intersection(rect2);
double areaOfIntersection = intersection == null ? 0 : intersection.area();
答案 1 :(得分:1)
继承人我会做什么:
将每个矩形分解为4个点 - 然后对它们进行排序:
你只需要比较每个矩形的修正点。 每个人都有: - 左上 - 右上方 - 左下角 - 右下角
计算交点创建的矩形左上角的x,y值:
首先通过获取最右边的点(最高x值)来计算左上角的x坐标,因为我们正在寻找左角
if rect_1_upper_left_x > rect_2_upper_left_x then
intersect_upper_left_x = rect_1_upper_left_x
else
intersect_upper_left_x = rect_2_upper_left_x
endif
或更简单
intersect_upper_left_x = max( rect_1_upper_left_x , rect_2_upper_left_x )
获取左上角的y坐标,选择最低的y值(因为我们正在寻找顶角)
intersect_upper_left_y = min( rect_1_upper_left_y , rect_2_upper_left_y )
请注意,您只需要为两个相对的角落执行此操作;
ex:左上角和右下角
编辑:虽然,如果你的左上角低于你的右下角,他们就不会受到攻击。 就像你的左上角比右下角更靠近...