Cod sursa(job #57387)

Utilizator mariusdrgdragus marius mariusdrg Data 1 mai 2007 22:01:02
Problema Camera Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.94 kb
#include<stdio.h>

const int maxn = 10100;

int n;
int i;
int j;
long double x[maxn];
long double y[maxn];
long double colx[maxn];
long double coly[maxn];
long double colx1[maxn];
long double coly1[maxn];
int l;
int l1;
long double sol;

long double abs(long double x)
{
        if (x < 0) return x * -1;
        return x;
}

long double arie(long double x1,long double y1,long double x2,long double y2,long double x3,long double y3)
{
        return x1 * y2 + x2 * y3 + x3 * y1 - y1 * x2 - y2 * x3 - y3 * x1;
}

int main()
{
        freopen("camera.in","r",stdin);
        freopen("camera.out","w",stdout);

        scanf("%d",&n);
        for(i = 1;i <= n; ++i)
        {
                scanf("%llf %llf",&x[i],&y[i]);
        }

        x[n + 1] = x[1];
        y[n + 1] = y[1];
        x[n + 2] = x[2];
        y[n + 2] = y[2];
        colx[1] = -100000;
        coly[1] = -100000;
        colx[2] =  100000;
        coly[2] = -100000;
        colx[3] =  100000;
        coly[3] =  100000;
        colx[4] = -100000;
        coly[4] =  100000;
        colx[5] = -100000;
        coly[5] = -100000;

        l = 4;
        
        for(i = 1;i <= n; ++i)
        {
                for(j = 1;j <= l;++j)
                {
                        long double a = y[i + 1] - y[i];
                        long double b = x[i] - x[i + 1];
                        long double c = a * x[i] + b * y[i];
                        long double a1 = coly[j + 1] - coly[j];
                        long double b1 = colx[j] - colx[j + 1];
                        long double c1 = a1 * colx[j] + b1 * coly[j];
                        long double y1 = (c1 * a - a1 * c) / (b1 * a - b * a1);
                        long double x1 = (c - b * y1) / a;
                        long double ver = 1;//arie(x[i],y[i],x[i + 1],y[i + 1],x[i + 2],y[i + 2]) * (-1);
                        if (((arie(x[i], y[i], x[i + 1],y[i + 1], colx[j],coly[j]) < 0) == (ver < 0) ) && ((arie(x[i], y[i], x[i + 1],y[i + 1], colx[j + 1],coly[j + 1]) < 0) == (ver < 0)))
                        {
                                ++l1;
                                colx1[l1] = colx[j + 1];
                                coly1[l1] = coly[j + 1];
                        }
                        if (((arie(x[i], y[i], x[i + 1],y[i + 1], colx[j],coly[j]) < 0) != (ver < 0) ) && ((arie(x[i], y[i], x[i + 1],y[i + 1], colx[j + 1],coly[j + 1]) < 0) == (ver < 0)))
                        {
                                ++l1;
                                colx1[l1] = x1;
                                coly1[l1] = y1;
                                ++l1;
                                colx1[l1] = colx[j + 1];
                                coly1[l1] = coly[j + 1];
                        }
                        if (((arie(x[i], y[i], x[i + 1],y[i + 1], colx[j],coly[j]) < 0) != (ver < 0) ) && ((arie(x[i], y[i], x[i + 1],y[i + 1], colx[j + 1],coly[j + 1]) < 0) != (ver < 0)))
                        {
                                continue;
                        }
                        if (((arie(x[i], y[i], x[i + 1],y[i + 1], colx[j],coly[j]) < 0) == (ver < 0) ) && ((arie(x[i], y[i], x[i + 1],y[i + 1], colx[j + 1],coly[j + 1]) < 0) != (ver < 0)))
                        {
                                ++l1;
                                colx1[l1] = x1;
                                coly1[l1] = y1;
                        }
                }
                l = l1;
                for(j = 1;j <= l1; ++j)
                {
                        colx[j] = colx1[j];
                        coly[j] = coly1[j];
                        colx1[j] = 0;
                        coly1[j] = 0;
                }
                l1 = 0;
                colx[l + 1] = colx[1];
                coly[l + 1] = coly[1];
        }

        for(i = 1;i <= l; ++i)
        {
                sol += colx[i] * coly[i + 1] - coly[i] * colx[i + 1];
        }
        
        printf("%.2llf\n",abs(sol) / 2);
                     
        return 0;
}