2

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

方法一:

double newX = Math.max(this.x, rect2.x);
double newY = Math.max(this.y, rect2.y);
return 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);

方法二:

double areaOfIntersection = Math.max(0, Math.max(rect1x2, rect2x2) - Math.min(rect1x1, rect2x1))
                        * Math.max(0, Math.max(rect1y2, rect2y2) - Math.min(rect1y1, rect2y1)); 
4

2 回答 2

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();
于 2013-03-08T17:17:29.787 回答
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 ) 

请注意,您只需要对 2 个对角执行此操作;

例如:左上和右下

编辑:虽然,如果你的左上角低于你的右下角,它们不会相交。就像你的左上角比右下角更靠右一样......

于 2013-03-08T17:21:37.627 回答