如果两个矩形相交,则必然存在线条交叉,而能交叉的线条只有横线和竖线,两根横线或两根竖线都不可能交叉。所以,这个问题就转化成寻找是否存在交叉的横线与竖线。
另外,A线与B线交叉等价于B线与A线交叉,所以,只要写一个函数就足够用了,多调用几次,反正计算机是专门做简单而又烦琐的工作的。
下面是这个函数:判断一条横线和一条竖线是否交叉。该函数的参数分别是:横线左、横线右,横线Y,竖线上,竖线下,竖线X。
bool CrossLine(left, right, y, top, bottom, x)
{
//判断一根横线和一根竖线是否交叉
//横线有三个参数:left, right和y
//竖线有三个参数:top, bottom和x
return (top < y) && (bottom > y)
&& (left < x) && (right > x);
}
下面是判断两个矩形是否相交的函数,把同一个函数多调用几篇就OK了。
bool CrossRect(CRect &r1, CRect &r2)
{
//判断两个矩形是否相交,
//从一个矩形中取出一条横线,与另一矩形中的一条竖线判断是否交叉
return CrossLine(r1.x1, r1.x2, r1.y1, r2.y1, r2.y2, r2.x1)
|| CrossLine(r1.x1, r1.x2, r1.y1, r2.y1, r2.y2, r2.x2)
|| CrossLine(r1.x1, r1.x2, r1.y2, r2.y1, r2.y2, r2.x1)
|| CrossLine(r1.x1, r1.x2, r1.y2, r2.y1, r2.y2, r2.x2)
|| CrossLine(r2.x1, r2.x2, r2.y1, r1.y1, r1.y2, r1.x1)
|| CrossLine(r2.x1, r2.x2, r2.y1, r1.y1, r1.y2, r1.x2)
|| CrossLine(r2.x1, r2.x2, r2.y2, r1.y1, r1.y2, r1.x1)
|| CrossLine(r2.x1, r2.x2, r2.y2, r1.y1, r1.y2, r1.x2);
}
另一个算法:
两个矩形相交的条件:两个矩形的重心距离在X和Y轴上都小于两个矩形长或宽的一半之和.这样,分两次判断一下就行了.
bool CrossLine(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 true;
return false;
}
即:
l:left t:top w:width h:height
BOOL isInterset(l1,t1,w1,h1, l2,t2,w2,h2)
{
if( math.abs(l1+w1/2-l2-w2/2)<=(w1+w2)/2 && Math.abs(t1+h1/2-t2-h2/2)<= (h1+h2)/2)
{
return TRUE;
}
else
{
return FALSE;
}
}