Chinaunix首页 | 论坛 | 博客
  • 博客访问: 533980
  • 博文数量: 118
  • 博客积分: 3995
  • 博客等级: 中校
  • 技术积分: 1276
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-15 12:15
文章分类

全部博文(118)

文章存档

2014年(1)

2013年(1)

2010年(6)

2009年(27)

2008年(10)

2007年(33)

2006年(38)

2005年(2)

我的朋友

分类:

2009-11-16 21:12:20

给定两个矩形的坐标,求其公共部分的面积。
矩形由两个点的坐标确定,左下角和右上角的坐标,所以不用考虑矩形旋转的情况。
而且假定左下角和右上角的坐标的相对位置是正确的,坐标都是整数。

/*矩形*/
typedef struct rectangle{
        int blx,bly; /* bottom left point*/
        int trx,try; /* top right point */
} rect;


/* 交换两个值 */
#define swap(type,x,y) ({type t; t=x; x=y; y=t;})


/* 计算面积
 * 输入: A,B两个矩形
 * 输出: 公共面积
*/

int area(rect *A, rect *B){
        int x,y;

        /* 确保B矩形在A的右边, 这样可以减少判断的情况*/
        if (A->blx > B->blx) swap(rect *, A,B);

        /* 没有公共部分 */
        if (B->try <= A->bly || B->bly >= A->try || B->blx >= A->trx) return 0;

        /* 剩下的肯定有公共部分,此时如果只看B矩形的右上角那个点,它的x和y坐标各只有2中可能,下面分别讨论x和y坐标 */
        /* 公共部分(也是矩形) 长 */
        if (B->trx <= A->trx) { /* B被A包含 */
                x = B->trx - B->blx;
        }
        else { /* 交 */
                x = A->trx - B->blx;
        }

    /* B的右上角y坐标有2种情况,对于每种情况其左下角y左右又有两种可能位置*/
        /* 公共部分(也是矩形) 宽(高) */
        if (B->try <= A->try) {
                if (B->bly <= A->bly)
                        y = B->try - A->bly;
                else
                        y = A->try - A->bly;
        }
        else {
                if (B->bly <= A->try)
                        y = A->try - B->bly;
                else
                        y = A->try - A->bly;

        }

        /* 公共面积 */
        return (x*y);
}




测试
int main()
{
        rect A,B;
        int n;

        A.blx = -1;
        A.bly = -2;
        A.trx = 3;
        A.try = 5;

        B.blx = -3;
        B.bly = -4;
        B.trx = 5;
        B.try = 4;

        n = area(&A, &B);
        printf("%d\n",n);
}


阅读(1317) | 评论(0) | 转发(0) |
0

上一篇:打印进度

下一篇:大数乘法

给主人留下些什么吧!~~