【蓝桥杯基础练习】矩形面积交

1471:矩形面积交

题目描述

平面上有两个矩形,它们的边平行于直角坐标系的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可以求出。
在这里插入图片描述

我感觉我的代码没有问题,但是放到编译器里显示我答案错误
求高人指点

猜你喜欢

转载自blog.csdn.net/passer__jw767/article/details/108719863