题目要求:求两个长方形的总面积(长方形长和x周平行,宽和y轴平行)
tags:math
思路:求重合边的长度,然后求得重合面积。总面积为两个长方形的面积和减去重合面积。
我的代码:
情况1:如果长方形有一对边是分离的,则两个长方形不相交
情况2:如果长方形有一对边是包含的,则短边乘以另一对边相交长度,则为重合面积
情况3:两对边都是包含一部分,则重合面积为两边相交长度乘机
由上分析可得,3种情况可以合并成为计算每对边交合长度来计算其重合面积。
public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
int mutualACEG = 0;
if(A>E){//E在A左边
if(A>G){//G在A左边
mutualACEG = 0;
}else if(A<=G&&C>=G){//G在AC中间
mutualACEG = G-A;
}else{//G在C左边
mutualACEG = C-A;
}
}else if(A<=E&&C>=E){//E在AC中间
if(A<=G&&C>=G){//G在AC中间
mutualACEG = G-E;
}else{//G在C右边
mutualACEG = C-E;
}
}else{//E在C右边
mutualACEG = 0;
}
int mutualBDFH = 0;
if(B>F){//F在B下边
if(B>H){//H在B下边
mutualBDFH = 0;
}else if(B<=H&&D>=H){//H在BD中间
mutualBDFH = H-B;
}else{//H在D上边
mutualBDFH = D-B;
}
}else if(B<=F&&D>=F){//F在BD中间
if(B<=H&&D>=H){//H在BD中间
mutualBDFH = H-F;
}else{//H在D上边
mutualBDFH = D-F;
}
}else{//F在D上边
mutualBDFH = 0;
}
return (C-A)*(D-B)+(G-E)*(H-F)-mutualACEG*mutualBDFH;
}
//别人的思路,只需要知道小的点的最大点,和大的点的最小点,即可获得共同长度
//由于两个长方形不分先后,所以可以通过比大小来操作
public int computeArea2(int A, int B, int C, int D, int E, int F, int G, int H) {
int left = Math.max(A,C);
int right = Math.max(Math.min(C, G),left);
int bottom = Math.max(B, F);
int top = Math.max(Math.min(D,H), bottom);
return (C-A)*(D-B)+(G-E)*(H-F)-(right-left)*(top-bottom);
}