自己写着玩,这样做倒是能够判断"直立"的两个矩形是否相交,但不能判断"倾斜"的矩形相交,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");
}
}