判断矩形是否重叠(结构)

  • Post author:
  • Post category:其他



目录


题目描述


思路分析


AC代码


题目描述

用具有x,y两个整型变量成员的结构类型SPoint来表示坐标点。用SRect结构类型来描述矩形,其中包含p1和p2两个SPoint成员分别表示矩形对角线上的两个点。

编写判断两个矩形是否重叠的函数bool isoverlap(const SRect &rect1, const SRect &rect2)。

主函数输入两个矩形,调用isoverlap函数判断是否重叠。


输入

判断次数

矩形1的对角线顶点坐标x1、y1、x2、y2

矩形2的对角线顶点坐标x1、y1、x2、y2

……


输出

是否重叠


输入样例1

3

1 5 2 9

1 3 2 4

5 6 7 8

5 7 7 9

2 5 1 0

9 4 2 9


输出样例1

not overlapped

overlapped

overlapped

思路分析

这道题坑很多。

我们首先来看一下如何怎么解决这道题。

首先它给出的只是对角线顶点坐标并没有说是哪个对角线,所以我们首先要处理一下,把它变成次对角线的两个坐标,即左下角的坐标和右上角 的坐标,具体方法是把大的坐标放到右边,小的放坐标,代码中的standard函数就是用来干这个的。

完了之后怎么知道重不重叠呢?

判断不重叠应该更方便一些,那什么情况下两个矩阵不重叠?

就是一个矩阵在另一个矩阵的周围,以一个矩阵为中心,四条边可以划出八个区域,这八个区域又可分成上下左右四种情况,对于每一种情况都只是需要进行坐标与坐标之间的比较就行。

还要注意的是,在这道题,沾边也算重叠。

AC代码

#include"iostream"
using namespace std;
struct SPoint
{
	int x,y;
}; 
struct SRect
{
	SPoint p1,p2;
};
bool isoverlap(const SRect &rect1, const SRect &rect2)
{
	if(rect1.p1.x>rect2.p2.x||rect1.p1.y>rect2.p2.y||rect1.p2.x<rect2.p1.x||rect1.p2.y<rect2.p1.y)
	return 0;
	return 1;
}
void standard(SRect &rect)
{
	if(rect.p1.x>rect.p2.x)
	swap(rect.p1.x,rect.p2.x);
	if(rect.p1.y>rect.p2.y)
	swap(rect.p1.y,rect.p2.y);
}
int main()
{
	int n;
	SRect rect1,rect2;
	cin>>n;
	while(n--)
	{
		cin>>rect1.p1.x>>rect1.p1.y>>rect1.p2.x>>rect1.p2.y;
		cin>>rect2.p1.x>>rect2.p1.y>>rect2.p2.x>>rect2.p2.y;
		standard(rect1);
		standard(rect2);
		if(isoverlap(rect1,rect2))
		cout<<"overlapped"<<endl;
		else
		cout<<"not overlapped"<<endl;
	}
}