给定两个矩形的坐标,求其公共部分的面积。
矩形由两个点的坐标确定,左下角和右上角的坐标,所以不用考虑矩形旋转的情况。
而且假定左下角和右上角的坐标的相对位置是正确的,坐标都是整数。
/*矩形*/
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);
}
阅读(1302) | 评论(0) | 转发(0) |