C++中如何计算两个区域是否有交集

来源:互联网 发布:java thread run start 编辑:程序博客网 时间:2024/05/19 16:48

判断两个矩形是否相交,可以自己写一个函数判断,也可以用你说的那个函数判断,但你说的那个函数主要的目的不是为了判断两个矩形是否相交。

用该函数的方法:

    HRGN hRgn1 = CreateRectRgn(rc1.left, rc1.top, rc1.right, rc1.bottom);
    HRGN hRgn2 = CreateRectRgn(rc2.left, rc2.top, rc2.right, rc2.bottom);

 

    //用RGN_AND标志表示你要合并两个区域并得到交集

    HRGN hRgnSum = NULL;
    int nRet = CombineRgn(hRgnSum, hRgn1, hRgn2, RGN_AND);

    if (nRet == SIMPLEREGION)
    {        //有交集       

        //得到交集矩形

        RECT rc3;

        GetRgnBox(hRgnSum, &rc3);

    }
    else if (nRet == NULLREGION)
        //没有交集

   

    DeleteObject(hRgnSum);
    DeleteObject(hRgn2);
    DeleteObject(hRgn1);

补充:

第二种方法:

 

//用来将所有的矩形调整为左上右下的形式

//其中swap函数没有实现,因为太简单了

void AdjustRect(RECT &rc)
{
    if (rc.left > rc.right)
        swap(rc.left, rc.right);
    if (rc.top > rc.bottom)
        swap(rc.top, rc.bottom);
}

 

//用来判断是否有交集,最后的参数返回有交集时候的矩形

//max和min函数没有实现,因为太简单了

BOOL HasIntersect(const RECT &rc1, const RECT &rc2, RECT &rc3)
{
    RECT src1 = rc1;
    AdjustRect(src1);
   
    RECT src2 = rc2;
    AdjustRect(src2);

 

    rc3 = RECT(0, 0, 0, 0);
    if (((src1.right < src2.left) && (src1.bottom < src2.top))
        || ((src1.left > src2.right) && (src1.top > src2.bottom)))
        return FALSE;

 

    rc3.left = max(src1.left, src2.left);
    rc3.right = min(src1.right, src2.right);
    rc3.top = max(src1.top, src2.top);
    rc3.bottom = min(src1.bottom, src2.bottom);
    return TRUE;
}