那么我们来看看两个矩形相交的所有可能情况,并确定交集矩形所在的位置,见下图:
【两个矩形相交的所有可能的组合图】
而AB两个矩形没有交集的就可以作为特例来判断是否有交集矩形,所以最后提取特征就只有是三种了。那么我们从包含的关系来确定一下,然后看看提取的特征是否可以适用于前面的两种。因为特例比较好提取特征,而非特例比较好验证特征。
从包含的关系即A矩形完全包含了B矩形,A矩形比B矩形大,所以,A矩形和B矩形相交之后,就是B矩形了。那么交集矩形的确定就是B的左上角和右下角。不过为了通用一点,我们一定要将B与A扯上关系,那么B的左上角和右下角与A的左上角和右下角有什么关系呢?
这个很明显,B的左上角的x大于A的左上角的x,而B的左上角的y则也大于A的左上角的y值。那么我们假设交集矩形的左上角的点坐标确定就是:取两个矩形左上角坐标中x、y大的作为交集矩形的左上角的坐标。
这样我们就得到了一个符合特例(两矩形为包含关系)的交集矩形的左上角点的坐标的确定方法。然后是否适用于普通的情况,我们就用这个方法用在普通的情况上。
结果表明,完全符合。那么这个方法就是正确的。依次类推不,交集矩形的右下角的坐标,也可以这么确定:取两个矩形的右下角坐标xy值小的作为交集矩形的右下角坐标。
注意,交集矩形的左上角的x是取两个矩形中左上角的x最大的一个,y也是取两个左上角最大的y。同样,右下角是取小的组合成xy。
这样就确定了交集矩形的大小了。如果用这种方法确定的左上角的坐标在右下角坐标的下边或者右边,则表示不存在交集。
所以我们可以写出求交集的代码了,求交集的函数如下:
bool IntersectRect_cjjjs(LPRECT lpDstRect,const RECT* lpSrcRect1,const RECT* lpSrcRect2)
{
if (lpSrcRect1->left>lpSrcRect2->left)
{
lpDstRect->left=lpSrcRect1->left;
}
else
{
lpDstRect->left=lpSrcRect2->left;
}
if (lpSrcRect1->top>lpSrcRect2->top)
{
lpDstRect->top=lpSrcRect1->top;
}
else
{
lpDstRect->top=lpSrcRect2->top;
}
if (lpSrcRect1->right>lpSrcRect2->right)
{
lpDstRect->right=lpSrcRect2->right;
}
else
{
lpDstRect->right=lpSrcRect1->right;
}
if (lpSrcRect1->bottom>lpSrcRect2->bottom)
{
lpDstRect->bottom=lpSrcRect2->bottom;
}
else
{
lpDstRect->bottom=lpSrcRect1->bottom;
}
if (lpDstRect->left>=lpDstRect->right || lpDstRect->top>=lpDstRect->bottom)
{
SetRectEmpty(lpDstRect);
return false;
}
else
{
return true;
}
}
我们自己实现的函数IntersectRect_cjjjs和系统提供的IntersectRect参数和返回值一模一样,你可以将《IntersectRect求两个矩形的交集矩形图解》文中的代码中的额IntersectRect名称换成IntersectRect_cjjjs,并将这个函数的定义放在最开始就可以了。实现的效果和之前的是一样的。如果函数返回false则表示两个矩形不存在交集矩形,否则返回true表示存在交集矩形。