C语言解题:求两矩形公共面积

题目描述

平面上有两个矩形A和B,它们的边分别平行于x轴和y轴。现在给出这两个矩形在对角线上的顶点坐标,请计算矩形A和矩形B的公共部分的面积。

输入

输入数据的每一行是8个数(正数或负数),按先后顺序分别是:x1,y1,x2,y2,x3,y3,x4,y4。其中,(x1,y1)和(x2,y2)是矩形A的对角线顶点坐标;(x3,y3)和(x4,y4)是矩形B的对角线顶点坐标。

输出

对每组输入数据,输出矩形公共部分的面积(小数点后面保留两位)。每个输出占一行。

样例输入

1.00 1.00 3.00 3.00 2.00 2.00 4.00 4.00
13.00 13.00 5.00 5.00 4.00 4.00 12.50 12.50

样例输出 

1.00
56.25

做题算法思路

(1)对输入的横坐标和纵坐标分别存放进数组后排序。(升序降序都可,最后结果取绝对值)

(2)排除掉没有相交的情况:①如果某一个矩形的对角线顶点横坐标占据了排序过后最小的两位横坐标或者是最大的两位横坐标,那么两个矩形没有相交部分。②如果某一个矩形的对角线顶点纵坐标占据了排序过后最小的两位纵坐标或者是最大的两位纵坐标,那么两个矩形同样没有相交部分。

(3)存在相交部分的面积为排序过后( x[1] - x[2] )*( y[1] - y[2] )  (想象图形即可得出此结果)

参考代码

#include 
double text(double x1,double y1,double x2,double y2,double x3,double y3,double x4,double y4){
	double x[4];//存储横坐标排序 
	double y[4];//存储纵坐标排序 
	double temp=0.0,s=0.0;
	x[0]=x1;x[1]=x2;x[2]=x3;x[3]=x4;//将横坐标和纵坐标分别放进x[4]和y[4]数组中 
	y[0]=y1;y[1]=y2;y[2]=y3;y[3]=y4;

	for (int i = 0; i < 3; i++)
	{
		for (int j = i+1; j < 4; j++)//这里采用降序排序 
		{
			if (x[i] < x[j])//对横坐标进行排序 
			{
				temp = x[i];
				x[i] = x[j];
				x[j] = temp;
			}
			if (y[i] < y[j])//对纵坐标进行排序 
			{
				temp = y[i];
				y[i] = y[j];
				y[j] = temp;
			}
		}
	}
	
	if (x1 ==x[0] && x2 == x[1])//横坐标区间没有重合部分的情况 
		s = 0.00;
	else if(x2 == x[0] && x1 == x[1])
		s = 0.00;
	else if (x1 == x[2] && x2 == x[3])
		s = 0.00;
	else if (x1 == x[3] && x2 == x[2])
		s = 0.00;
	else if (y1 == y[0] && y2 == y[1])//纵坐标区间没有重合部分的情况 
		s = 0.00;
	else if (y1 == y[2] && y2 == y[3])
		s = 0.00;
	else if (y1 == y[3] && y2 == y[2])
		s = 0.00;
	else
		s = (x[1] - x[2])*(y[1] - y[2]);//想象一下图形即得相交部分面积求法 
	return s;//返回结果面积 
}
int main()
{
	double x1, y1, x2, y2, x3, y3, x4, y4, s, tmp = 0.0;
	double area[2]; 
	for(int i=0;i<2;i++)
	{	
		scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4);
		area[i]=text(x1,y1,x2,y2,x3,y3,x4,y4);
	}
	for(int i=0;i<2;i++){
		printf("%.2f\n",area[i]);
	}
	return 0; 
}

你可能感兴趣的:(算法题,c语言,算法)