/*
* 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;
}