获得两个相交矩形的区域

时间:2013-03-08 17:03:06

标签: java

我真诚地在这里迷惑......哪一个实际上返回了两个矩形之间的交叉区域?请求解释(数学让我感到沮丧)。任何帮助将不胜感激。

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));

2 个答案:

答案 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:左上角和右下角

编辑:虽然,如果你的左上角低于你的右下角,他们就不会受到攻击。 就像你的左上角比右下角更靠近...