题目介绍:
在坐标系中设定左上方点为原点坐标(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;
}