天天看点

计算2个矩形所占的面积

这是在leetcode上看到的题目。

2个矩形由各自的左下角和右上角来定义。坐标定义为(A,B)(C,D);(E,F)(G,H)。

顶点坐标全部为int整数。

两个矩形分布可以分为三种情况。分离,包含与相交。

计算2个矩形所占的面积
代码如下:

public class ReArea {
	public static int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
		int result = 0;
		int area1,area2;
		if(A >= G || B >= H || E >= C || F >= D){
			area1 = calArea(A,B,C,D);
			area2 = calArea(E,F,G,H);
			result = area1 + area2;
		}
		else if((A <= E)&&(C >= G)&&(B <= F)&&(D >= H)){
			area1 = calArea(A,B,C,D);
			result = area1;
		}
		else if((A >= E)&&(C <= G)&&(B >= F)&&(D <= H)){
			area2 = calArea(E,F,G,H);
			result = area2;
		}
		else{
			int[] xLen = {A,C,E,G}; 
			int[] yLen = {B,D,F,H};
			sort(xLen);
			sort(yLen);
			area1 = calArea(A,B,C,D);
			area2 = calArea(E,F,G,H);
			
			result = area1 + area2 - ((xLen[1] - xLen[2]) * (yLen[1] - yLen[2]));
		}
		
		return result;
	}
	public static void sort(int[] dot){
		for (int i = 0; i < dot.length; i++)
		{
			for (int j = i; j < dot.length; j++)
			{
				if (dot[i] < dot[j])
				{
					int temp = dot[i];
					dot[i] = dot[j];
					dot[j] = temp;
				}
			}
		}
	}
	
	public static int calArea(int x1,int y1,int x2,int y2){
		int r1,r2;
		if (x1 >= x2){
			r1 = x1 - x2;
		}else{
			r1 = x2 - x1;
		}
		if (y1 >= y2){
			r2 = y1 - y2;
		}else{
			r2 = y2 - y1;
		}
		return r1 * r2;
	}
	public static void main(String args[]){

		System.out.print(computeArea(0,0,4,4,0,2,3,3));//output:16
	}
}