现在的位置: 首页 > 综合 > 正文

计算矩形相交区域

2012年03月05日 ⁄ 综合 ⁄ 共 2174字 ⁄ 字号 评论关闭

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

/* 函数结果状态代码 */
#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;

}

抱歉!评论已关闭.