蓝桥杯练习 矩形面积交
问题描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
思路分析:求出相交的面积也就是求相交的矩形的面积,由于两个矩形的边是平行于直角坐标系的,那么相交的矩形的边也是平行与直角坐标系的。那么先看长(横坐标),每一个矩形的长反映在横坐标上就是两个点之差,右边的点减去左边的点就是矩形的长。两个矩形的长有四个点,其中相交部分的长就是中间的两个点。
例如第一个矩形长是从1到4,第二个矩形的长是2到6,那么相交部分就是2到4。
例如第一个矩形长是从1到6,第二个矩形的长是2到5,那么相交部分就是2到5。
以上两个例子都说明了无论是相交还是大矩形包小矩形的情况,相交部分都是中间两个点。
再看宽(纵坐标):也是一样的,相交部分就是中间两个点。
那么代码的思路就可以先求相交部分的长,就是看横坐标的四个点,求中间两个点,两个点的差值就是相交部分的长度。再求相交部分的宽度,就是看纵坐标的四个点,求中间两个点,两个点的差值就是相交部分的宽度,最后长乘以宽就是相交部分的面积。
注意:上述讨论是存在相交的部分,因此,要判断一下两个矩形是否相交,如果不相交或者相切,直接返回0.00即可。
代码如下
import java.text.DecimalFormat;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//矩形1的坐标
double a1 = sc.nextDouble();
double a2 = sc.nextDouble();
double a3 = sc.nextDouble();
double a4 = sc.nextDouble();
//矩形2的坐标
double b1 = sc.nextDouble();
double b2 = sc.nextDouble();
double b3 = sc.nextDouble();
double b4 = sc.nextDouble();
//判断不相交以及相切的情况
if(Math.max(a1,a3)<=Math.min(b1,b3) || Math.max(b1,b3)<=Math.min(a1,a3)
|| Math.max(a2,a4)<=Math.min(b2,b4) || Math.max(b2,b4)<=Math.min(a2,a4)){
System.out.println("0.00");
return;
}
//求x轴上的相交的长度
double[] x = new double[4];
x[0] = a1;
x[1] = a3;
x[2] = b1;
x[3] = b3;
//从小到达排序后取中间的两个数
Arrays.sort(x);
double xlen = x[2]-x[1];
//求y轴上的相交的长度
double[] y = new double[4];
y[0] = a2;
y[1] = a4;
y[2] = b2;
y[3] = b4;
//从小到达排序后取中间的两个数
Arrays.sort(y);
double ylen = y[2]-y[1];
//面积
double s = xlen*ylen;
DecimalFormat df = new DecimalFormat("0.00");
System.out.println(df.format(s));
}
}