题目描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出
输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
代码:
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
double vsmax(double x,double y)
{
(x>y)?return x:return y;
}
double vsmin(double x,double y)
{
(x<y)?return x:return y;
}
void YON(double *x_1,double *y_1,double *x_2,double *y_2)
{
if( (*y_1-*y_2)/(*x_1-*x_2) <0)//斜率为负数,说明则给出的是左上角、右下角的点,就进行转换
{
double temp1,temp2,temp3,temp4;
temp1=vsmax(*x_1,*x_2);
temp2=vsmax(*y_1,*y_2);
temp3=vsmin(*x_1,*x_2);
temp4=vsmin(*y_1,*y_2);
*x_1=temp1,*y_1=temp2;
*x_2=temp3,*y_2=temp4;
}
}
int main()
{
double f_x1,f_x2,f_y1,f_y2;
double s_x1,s_x2,s_y1,s_y2;
double area=0.00;
cin>>f_x1>>f_y1>>f_x2>>f_y2>>s_x1>>s_y1>>s_x2>>s_y2;
YON(&f_x1,&f_y1,&f_x2,&f_y2);//YON函数用于判断给出的相对顶点是右上角、左下角的还是左上角右下角的,再通过函数一律转换为右上角左下角的
YON(&s_x1,&s_y1,&s_x2,&s_y2);
if( vsmax(f_x1,f_x2)<vsmax(s_x1,s_x2) && vsmax(f_x1,f_x2)<vsmin(s_x1,s_x2) || vsmax(f_x1,f_x2)>vsmax(s_x1,s_x2) && vsmax(s_x1,s_x2)<vsmin(f_x1,f_x2) )
{
cout<<"两个矩形不相交"<<endl;
area=0.00;
}
else
{
double temp1=(vsmax(f_x1,f_x2)>vsmax(s_x1,s_x2))?vsmax(s_x1,s_x2):vsmax(f_x1,f_x2);//找出两个矩形中右上角坐标的x值
double temp2=(vsmin(f_x1,f_x2)>vsmin(s_x1,s_x2))?vsmin(f_x1,f_x2):vsmax(s_x1,s_x2);//找出两个矩形中左下角坐标的x值
double temp3=(vsmax(f_y1,f_y2)>vsmax(s_y1,s_y2))?vsmax(s_y1,s_y2):vsmax(f_y1,f_y2);//找出两个矩形中右上角坐标的y值
double temp4=(vsmin(f_y1,f_y2)>vsmin(s_y1,s_y2))?vsmin(f_y1,f_y2):vsmin(s_y1,s_y2);//找出两个矩形中左下角坐标的y值
area=double(fabs((temp1-temp2)*(temp3-temp4)));
}
printf("%.2f",area);
return 0;
}
求矩形面积的方法如下(提供思路,我的代码有点问题!):
如图所示的两个相交矩形,欲求红色部分面积,那就求出红色矩形右上角顶点(xr,yr)以及左下角(xl,yl),此时面积area=(xr-xl)*(yr-yl)
首先,分别找出1号矩形、2号矩形x坐标最大的点,分别为x1,x2,这一定分别为两个矩形的右上角顶点,然后比较x1、x2的大小,取比较小的那个为xr。
同理,找出1、2号矩形x坐标最小的点,分别为x3、x4,这一定分别为两个矩形左下角的定点,比较x3、x4的大小,取比较大的那个为xl。
同样的方法可以求出yr,yl。
最后通过area可以求出。
我感觉我的代码没有问题,但是放到编译器里显示我答案错误
求高人指点