判断两个矩形是否相交

自己写着玩,这样做倒是能够判断"直立"的两个矩形是否相交,但不能判断"倾斜"的矩形相交,Oh~失败~。

要求:输入的是两个矩形的主对角线的两个点的坐标,两个矩形还必须是"直立"的。
原理是根据两个矩形中心之间的距离关系来进行判断。好像也没啥可以解释的,就是如果相交时选择相交矩形的主对角线坐标注意下就ok。


Test Data:
1.00 3.00 3.00 1.00 2.00 4.00 4.00 2.00
5.00 13.00 13.00 5.00 4.00 12.50 12.50 4.00
1.00 3.00 3.00 1.00 4.00 5.00 6.00 1.00
1.00 3.00 2.00 1.00 2.00 5.00 4.00 1.00
1.00 5.00 7.00 1.00 3.00 4.00 5.00 2.00
1.00 5.00 7.00 1.00 1.00 5.00 7.00 1.00
2.00 2.00 4.00 1.00 2.50 5.00 3.50 0.50
-3.00 1.00 -1.00 -2.00 -2.00 0.00 2.00 -1.00

1.00 2.00 4.00 2.00 2.00 4.00 3.00 1.00 // 倾斜的矩形

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define test 

struct point{
	double x,y;
};
point a1,a2,b1,b2;
double area;

bool Rectangle_inersection(){
	point c1,c2;		//c1,c2分别代表两个矩形中心的坐标
	c1.x = (a1.x+a2.x)/2 ; c1.y = (a1.y+a2.y)/2;
	c2.x = (b1.x+b2.x)/2 ; c2.y = (b1.y+b2.y)/2;
	double Wa,Ha,Wb,Hb;
	Wa = fabs(a2.x-a1.x) ; Ha = fabs(a1.y-a2.y);
	Wb = fabs(b2.x-b1.x) ; Hb = fabs(b1.y-b2.y);
//	printf("%.2lf %.2lf %.2lf %.2lf %.2lf %.2lf %.2lf %.2lf\n",a1.x,a1.y,a2.x,a2.y,b1.x,b1.y,b2.x,b2.y);
//	printf("c1.x=%.2lf,c1.y=%.2lf,w=%.2lf,h=%.2lf\n",c1.x,c1.y,Wa,Ha);	
//	printf("c2.x=%.2lf,c2.y=%.2lf,w=%.2lf,h=%.2lf\n",c2.x,c2.y,Wb,Hb);
	
	if( fabs(c1.x-c2.x)<=(Wa+Wb)/2 && fabs(c1.y-c2.y)<=(Ha+Hb)/2){
		point e1,e2;
		e1.x=max(a1.x,b1.x);	e1.y=min(a1.y,b1.y);
		e2.x=min(a2.x,b2.x);	e2.y=max(a2.y,b2.y);
		area = (e2.x-e1.x)*(e1.y-e2.y);
//		printf("e1.x=%.2lf,e1.y=%.2lf,e2.x=%.2lf,e2.y=%.2lf,area=%.2lf\n",e1.x,e1.y,e2.x,e2.y,area);
		return true;
	}
	else{
		return false;
	}
}
int main(){ 
	#ifdef	test
		freopen("Rectangle.txt","r",stdin);
	#endif
	while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a1.x,&a1.y,&a2.x,&a2.y,&b1.x,&b1.y,&b2.x,&b2.y)!=EOF){
		area=0;
		if(Rectangle_inersection())
			printf("%.2lf\n",area);
		else
			printf("Disjoint\n");
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值