矩形相交区域的计算

 题目介绍:

在坐标系中设定左上方点为原点坐标(0, 0),以矩形的左上点坐标和右下点坐标来表示一个矩形.求两个矩形相交的区域(该区域为矩形).

代码实现:

view plaincopy to clipboardprint?
/* 函数结果状态代码 */ 
#define TRUE 1  
#define FALSE 0  
#define OK 1  
#define ERROR 0  
#define INFEASIBLE -1  
#define OVERFLOW -2  
typedef int Status;  
 
/* 点结构体定义 */ 
typedef struct tagPoint_t  
{  
    int iCdX;               /* Coordinate X */ 
    int iCdY;               /* Coordinate Y */ 
}Point_t;  
 
/* 矩形结构体定义 */ 
typedef struct tagRectangle_t  
{  
    Point_t stLeftUp;       /* 左上点 */ 
    Point_t stRightDown;    /* 右下点 */ 
}Rectangle_t;  
 
/****************************************************************************/ 
/* 取大数 */ 
/****************************************************************************/ 
int GetMax(int iData1, int iData2)  
{  
    return iData1 > iData2 ? iData1 : iData2;  
}  
 
/****************************************************************************/ 
/* 取小数 */ 
/****************************************************************************/ 
int GetMin(int iData1, int iData2)  
{  
    return iData1 > iData2 ? iData2 : iData1;  
}  
 
/****************************************************************************/ 
/* 检测矩形相交 */ 
/****************************************************************************/ 
Status CheckInter(Rectangle_t RectA, Rectangle_t RectB)  
{  
    if ((RectB.stLeftUp.iCdX < RectA.stRightDown.iCdX) &&        /* 矩形B左上点X < 矩形A右下点X */ 
        (RectB.stLeftUp.iCdY < RectA.stRightDown.iCdY) &&        /* 矩形B左上点Y < 矩形A右下点Y */ 
        (RectB.stRightDown.iCdX > RectA.stLeftUp.iCdX) &&        /* 矩形B右下点X > 矩形A左上点X */ 
        (RectB.stRightDown.iCdY > RectA.stLeftUp.iCdY))          /* 矩形B右下点Y > 矩形A左上点Y */ 
    {  
        return TRUE;                                            /* 矩形A与B相交 */ 
    }  
 
    return FALSE;  
}  
 
/****************************************************************************/ 
/* 取得矩形相交区域 */ 
/****************************************************************************/ 
Status GetInterRect(Rectangle_t RectA, Rectangle_t RectB, Rectangle_t InterRect)  
{  
    /* 检测矩形A与B是否相交 */ 
    if (!CheckInter(RectA, RectB))  
    {  
        return ERROR;       /* 2个矩形不相交 */ 
    }  
 
    /* 相交区域左上点X为2个矩形左上点X的最大值 */ 
    InterRect.stLeftUp.iCdX = GetMax(RectA.stLeftUp.iCdX, RectB.stLeftUp.iCdX);  
 
    /* 相交区域左上点Y为2个矩形左上点Y的最大值 */ 
    InterRect.stLeftUp.iCdY = GetMax(RectA.stLeftUp.iCdY, RectB.stLeftUp.iCdY);  
 
    /* 相交区域右下点X为2个矩形右下点X的最小值 */ 
    InterRect.stRightDown.iCdX = GetMin(RectA.stRightDown.iCdX, RectB.stRightDown.iCdX);  
 
    /* 相交区域右下点Y为2个矩形右下点Y的最小值 */ 
    InterRect.stRightDown.iCdY = GetMin(RectA.stRightDown.iCdY, RectB.stRightDown.iCdY);  
 
    return TRUE;  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值