求平面内第一象限两个矩形的并的面积

/*

 * Area of Simple Polygons.cpp

 * 求平面内第一象限两个矩形的并的面积

 * 输入为矩形左下角和右上角的坐标

 * 用结构体line_t保存矩形的上下两个线段,upOrDown表示上边还是下边 

 * 用数组xArray保存所有点坐标的X值,要进行去重工作 

 * 按Y值对line_t排序,按X值对xArray排序

 * 最后对xArray中的每一段求面积,线段乘以该线段对应的最上边和最下边 

 */

#include<iostream>

#include<algorithm>

#include<cmath>

#define MAX 1000

 

struct line_t

{

    int xLeft, xRight;

    int y;

    int upOrDown;

};

int xArray[2*MAX];

line_t line[2*MAX];

 

void swap(int *a, int *b)

  int t=*a; *a=*b; *b=t;

}

 

int random_partition(int arr[], int p, int r)

{

    int ran;

    int i, j;

    srand((unsigned)time(NULL));

    ran = rand()%(r-p)+p;

    swap(&arr[ran], &arr[r]);

    i = p-1;

    for(j=p; j<r; j++)

    {

        if(arr[j]<arr[r])

        {

            i++;

            swap(&arr[i],&arr[j]);

        }

    }

    swap(&arr[i+1], &arr[r]);

    return i+1;

}

 

void randomQuick_sort(int arr[], int p, int r)

{

    int q;

    if(p<r)

    {

        q = random_partition(arr, p, r);

        randomQuick_sort(arr, p, q-1);

        randomQuick_sort(arr, q+1, r);

    }

}

 

int cmp(const void *a, const void *b)

{

    line_t *c = (line_t *)a;

    line_t *d = (line_t *)b;

    if(c->y < d->y) return -1;

    else return 1;

}

 

void movex(int t, int &xn)

{

    int i;

    for(i = t;i <= xn - 1;i++){

        xArray[i] = xArray[i + 1];

    }

    xn--;

}

 

int main()

{

    int x1, y1, x2, y2;

    int end = 0;

 

    while(1)

    {

        int n_x = 0;

        int n_line = 0;

        while(1)

        {

            scanf("%d %d %d %d", &x1, &y1, &x2, &y2);

            if(x1 == -1)

            {

                end++;

                break;

            }

            else

                end = 0;

            xArray[n_x++] = x1;

            xArray[n_x++] = x2;

            line[n_line].xLeft = x1;

            line[n_line].xRight = x2;

            line[n_line].y = y1;

            line[n_line++].upOrDown = 0;

            line[n_line].xLeft = x1;

            line[n_line].xRight = x2;

            line[n_line].y = y2;

            line[n_line++].upOrDown = 1;

        }

        if(end == 2) break;

        randomQuick_sort(xArray, 0, n_x-1);

        qsort(line, n_line, sizeof(line[0]),cmp);

 

        for(int i = 1;i < n_x;){

            if(xArray[i] == xArray[i - 1]) movex(i, n_x);

            else i++;

        }

        for(int i=0; i<n_line; i++)

        {

            printf("/n");

            printf("line.x1 = %d/n", line[i].xLeft);

            printf("line.x2 = %d/n", line[i].xRight);

            printf("line.y = %d/n", line[i].y);

            printf("line.flag = %d/n", line[i].upOrDown);

            printf("/n");

        }

        int area = 0;

        for(int i=0; i<n_x-1; i++)

        {

            int cnt = 0;

            int low_y;

            for(int j=0; j<n_line; j++)

                if(line[j].xLeft <= xArray[i] && line[j].xRight >= xArray[i+1])

                {

                    if(cnt==0) low_y = line[j].y;

                    if(line[j].upOrDown = 0)

                        cnt++;

                    else

                        cnt--;

                    if(cnt==0)

                    {

                        area += (xArray[i+1] - xArray[i])*(line[j].y - low_y);

                    }

                }

        }

 

        printf("area = %d/n", area);

    }

    return 0;

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值