目录
题目
代码
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
double x1,y1,x2,y2,x3,y3,x4,y4;
cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
/* if(max(x1,x2)<min(x3,x4)||min(x1,x2)>max(x3,x4)||max(y1,y2)<min(y3,y4)||min(y1,y2)>max(y3,y4))
{
cout<<"0.00"<<endl;return 0;
}*/
double m1,n1,m2,n2;
m1=max(min(x1,x2),min(x3,x4));//m1并不是四个横坐标里倒数第二小
m2=min(max(x1,x2),max(x3,x4));//m2并不是四个横坐标里第二大
n1=max(min(y1,y2),min(y3,y4));
n2=min(max(y1,y2),max(y3,y4));
if(m2>m1&&n2>n1)//只有这样才能保完全相交,否则包含关系也符合m2>m1
{
double s=abs((m1-m2)*(n1-n2))*1.0;
cout<<setprecision(2)<<fixed<<s<<endl;
}
else
cout<<"0.00"<<endl;
return 0;
}
思路
将所有的横坐标x排序,取中间两个的差值为重合面积的一条边的长度,然后将所有的纵坐标y排序,取中间两个的差值为重合面积的另一条边的长度,判断是否相交,然后得重合面积的值。