当前位置:C++技术网 > 精选软件 > IntersectRect求交集的原理分析以及代码实现

IntersectRect求交集的原理分析以及代码实现

更新时间:2015-12-29 10:11:46浏览次数:1+次

    对于IntersectRect函数的内部原理,也就是求取两个矩形交集的过程。表面上看起来求两个矩形交集挺难的。不过不要怕,我们来仔细分析一下各种情形,然后来提取共同特征,就可以了。并不需要和求数学交集一样使用复杂的计算就可以达到了。关键就在于特征提取,而特征提取的最关键就是要考虑全面。
    那么我们来看看两个矩形相交的所有可能情况,并确定交集矩形所在的位置,见下图:
两个矩形相交的所有可能的组合图,IntersectRect求交集的原理分析以及代码实现
【两个矩形相交的所有可能的组合图】
    这六个图,涵盖了所有的可能组合特点。其中前面四种其实可以看做是两种。再加上底下两种,一共要考虑的就是四种可能。
    而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表示存在交集矩形。