判断两个矩形是否相交

来源:互联网 发布:比淘宝还好的购物网站 编辑:程序博客网 时间:2024/05/11 23:55

自己写着玩,这样做倒是能够判断"直立"的两个矩形是否相交,但不能判断"倾斜"的矩形相交,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(){ #ifdeftestfreopen("Rectangle.txt","r",stdin);#endifwhile(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);elseprintf("Disjoint\n");}}



0 0
原创粉丝点击