题目
Find the total area covered by two rectilinear rectangles in a 2D plane.
Each rectangle is defined by its bottom left corner and top right corner as shown in the figure.
Assume that the total area is never beyond the maximum possible value of int.
大致意思
在x和y轴上,给出两个矩形,分别有边界上的四个点,求出在整个平面上,他们覆盖了多少的面积
解决方案
首先,我们先求出两个矩形各自的面积,然后进行相加
var sumArea = (C - A) * (D - B) + (G - E) * (H - F);
两个矩形在平面上,他们只有两种可能性,相交或者不相交。
- 相交情况
- 我们求出相交的顶点,求出相交的面积,再根据总面积相减,就得到了覆盖的总面积
- 如何求出相交的点的坐标
- 矩形A、B左上角的顶点,求出X的最小,右下角顶点X的最大
- 矩形A、B左上角的顶点,求出Y的最小,右下角顶点Y的最大
(Math.min(G, C) - max(A, E)) * (Math.min(D, H) - max(B, F))
- 不相交情况
- 因为不相加,所以,覆盖的面积就是两个矩形相加的和
- 什么情况下会不相交
- 矩形B的左下角X >= 矩形A右上角的X
- 矩形B的左下角Y >= 矩形A右上角的Y
- 矩形A的左下角X >= 矩形B右上角的X
- 矩形A的左下角Y >= 矩形B右上角的Y
if (E >= C || F >= D || B >= H || A >= G) return sumArea;
源代码
var computeArea = function(A, B, C, D, E, F, G, H) {
var sumArea = (C - A) * (D - B) + (G - E) * (H - F);
if (E >= C || F >= D || B >= H || A >= G) return sumArea;
return sumArea - ((Math.min(G, C) - max(A, E)) * (Math.min(D, H) - max(B, F)));
};