矩形的相交问题也是一个常用的问题,最近碰到的有点多,连续碰到了三四题了,每次都要重新写,不如直接总结出来,直接写成一个板子,以后就能抄了;
首先是矩形的相交问题:矩形的相交分为好几种相交:即
我们设两个矩形的点分别为:
第一个矩形:ax1,ay1,ax2,ay2 第二个矩形:bx1,by1,bx2,by2
方法一:
矩形相交的结果仍是矩形,因此构成相交矩形的左下和右上就是:cx1,cy1,cx2,cy2;
cx1=max(ax1,bx1) //左下x为最大的左下x集合
cy1=max(ay1,by1) //左下y为最大的左下y集合
cx2=min(ax2,bx2) //右上x为最小的右上x集合
cy2=min(ay2,by2) //右上y为最小的右上y集合
如果两个矩形不相交,那么的出来的相交矩形满足:(cx1>cx2)||(cy1>cy2),就是左下不是左下点了。
根绝这个方法,可以得出,1.矩形是否相交,2.相交的面积。
写成代码就是:
int get_sum(){//判断和求和一起出来
if(cx1>cx2)
return 0;
if(cy1>cy2)
return 0;
return (cx2-cx1)*(cy2-cy1);
}
方法二:
两个矩形相交的条件:两个矩形的重心距离在x轴y轴上都小于两个矩形长或宽的一半之和。
就是判断:
重心距离在x轴上的投影长度<两个矩形的在x轴的长度之和/2
重心距离在y轴上的投影长度<两个矩形在y轴上的宽度之和/2
换成代码就是:
int judge(Rect r1,RECT r2){
if(abs((r1.x1+r1.x2)/2-(r2.x1+r2.x2)/2)<((r1.x2+r2.x2-r1.x1-r2.x1)/2)
&& abs((r1.y1+r1.y2)/2-(r2.y1+r2.y2)/2)<((r1.y2+r2.y2-r1.y1-r2.y1)/2))
return 1;
return 0;
}