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 <stdio.h>
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; 
}

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算不出来没办法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值