判断矩形是否重叠(复合类+友元)

判断矩形是否重叠(复合类+友元)
题目描述

用CPoint表示点,用两个CPoint对象表示矩形类CRect的对角线两点。分别实现CPoint类和CRect类,并在主函数用输入的坐标定义4个CPoint类对象,每2个CPoint对象再构造1个CRect对象,然后写个友元函数,判断2个矩形是否重叠。

输入

判断次数

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

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

输出

是否重叠

示例输入

3
1 5 2 9
1 3 2 4
5 6 7 8
5 7 7 7
2 5 1 0
9 4 2 9

样例输出

not overlapped
overlapped
overlapped

#include <iostream>
using namespace std;
#include <iomanip> 


class CPoint{
	public:
		CPoint(){
		}
	CPoint(int a,int b){
		x1=a;
		y1=b;
	}	
	void set(int a,int b){
		x1=a;
		y1=b;
	}
//	private:
		int x1;
		int y1;

	}; 
	
class CRect{
	public:
	CRect(){
	}
	CRect(int a,int b,int c,int d):cp1(a,b),cp2(c,d){
	}
	friend bool isnot(CRect &cr1,CRect &cr2);
	private:
	CPoint cp1;
	CPoint cp2;
	
	
	
};
 bool isnot(CRect &cr1,CRect &cr2){//算法相关 
 	
	return cr1.cp2.x1<=cr2.cp1.x1||cr1.cp2.y1<=cr2.cp1.y1||cr1.cp1.x1>=cr2.cp2.x1||cr1.cp1.y1 >=cr2.cp2.y1;
}

int main(){

	int t;
	cin>>t;
	int x1,y1,x2,y2,x3,y3,x4,y4;
	 
	while(t--){
		cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
		CPoint cp1,cp2,cp3,cp4;
		
		cp1.set(x1,y1);
		cp2.set(x2,y2);
		cp3.set(x3,y3);
		cp4.set(x4,y4);
		CRect cr1(x1,y1,x2,y2);
		CRect cr2(x3,y3,x4,y4);
		if(isnot(cr1,cr2) )cout<<"not overlapped"<<endl;
		else cout<<"overlapped"<<endl; 
		
		
		
		
		
	
	} 

	return 0;
}

 

问题1:怎么写构造函数复合类的构造函数?(不同于继承)

public:
CRect(int a,int b,int c,int d):cp1(a,b),cp2(c,d){
	}
private:
	CPoint cp1;
	CPoint cp2;

之后会写一遍讨论继承和复合的区别

### 使用Python计算两个矩形之间距离的方法 为了计算两个矩形之间的最小距离,可以采用几何方法来处理这个问题。具体来说,可以通过比较矩形边界框的相对位置来进行判断。 #### 方法概述 当考虑两个矩形A和B时,如果这两个矩形不相交,则它们之间的最短距离等于最近的一对边的距离;而如果两者有重叠部分,则其间的距离应视为零[^3]。 #### 实现思路 定义每个矩形四个参数表示:`left`, `top`, `right`, 和 `bottom`,分别代表矩形左边、顶部、右边以及底部的位置坐标。接着根据这些值确定两者的水平间距(`dx`)与垂直间距(`dy`): - 如果一个矩形完全位于另一个矩形左侧或右侧,则取二者横坐标的差绝对值作为水平方向上的间隔; - 同理可得竖直方向上的间隔。 最后返回上述两种情况下的较大者即为所求之距。 下面是具体的代码实现方式: ```python def rect_distance(rect_a, rect_b): """ 计算两个矩形之间的最小距离 参数: rect_a (tuple): 第一个矩形的信息元组(left,top,right,bottom) rect_b (tuple): 第二个矩形的信息元组(left,top,right,bottom) 返回: float: 两个矩形间最小欧几里德距离 """ # 解构输入数据 l1,t1,r1,b1 = rect_a l2,t2,r2,b2 = rect_b # 判断是否有交叉区域 if r1<l2 or r2<l1 or b1<t2 or b2<t1: dx = max(l1-r2,l2-r1,0) ** 2 dy = max(t1-b2,t2-b1,0) ** 2 return (dx + dy)**0.5 else: return 0 # 测试案例 rect1 = (-1,-1,1,1) # 中心在原的小正方形 rect2 = (2,2,4,4) # 远离第一个矩形的一个大一些的正方形 print(f"The minimum distance between two rectangles is {rect_distance(rect1, rect2)} units.") ``` 此段程序能够有效地找出任意给定二维平面上两个矩形对象彼此分离的程度,并给出相应的数值度量结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值