Cod sursa(job #2556761)

Utilizator stefantagaTaga Stefan stefantaga Data 25 februarie 2020 10:27:05
Problema Camera Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("camera.in");
ofstream g("camera.out");
struct wow
{
    double x,y;
}v[2005];
double eps=1e-6;
int semn (double a)
{
    if (a<eps&&a>-eps)
    {
        return 0;
    }
    if (a>eps)
    {
        return 1;
    }
    return -1;
}
double det(wow a,wow b ,wow c)
{
    return a.x*b.y+b.x*c.y+a.y*c.x-a.y*b.x-b.y*c.x-a.x*c.y;
}
vector <wow> sol,copie;
wow intersectie (wow a,wow b,wow c,wow d)
{
    double a1,b1,c1,a2,b2,c2;
   ///dreapta 1
   a1=b.y-a.y;
   b1=a.x-b.x;
   c1=a.y*b.x-a.x*b.y;
   ///dreapta 2
   a2=d.y-c.y;
   b2=c.x-d.x;
   c2=c.y*d.x-c.x*d.y;
   wow rez;
   rez.x=(c2*b1-c1*b2)/(a1*b2-a2*b1);
   rez.y=(c1*a2-c2*a1)/(a1*b2-a2*b1);
   return rez;
}
void solutie (wow a,wow b)
{
    int i;
    int semn1,semn2;
    sol.push_back(sol[0]);
    copie.clear();
    for (i=0;i<(int)sol.size()-1;i++)
    {
        semn1=semn(det(a,b,sol[i]));
        semn2=semn(det(a,b,sol[i+1]));
        if (semn1*semn2==-1)
        {
            wow valoare=intersectie(a,b,sol[i],sol[i+1]);
            copie.push_back(intersectie(a,b,sol[i],sol[i+1]));

        }
        if (semn2>=0)
        {
            copie.push_back(sol[i+1]);
        }
    }
    sol=copie;
}
int n,i,j;
double sum;
wow origine;
int main()
{
    f>>n;
    for (i=1;i<=n;i++)
    {
        f>>v[i].x>>v[i].y;
    }
    double arie=0;
    for (i=1;i<n;i++)
    {
        arie=arie+det(v[i],v[i+1],origine);
    }
    if (arie<0)
    {
        reverse(v+1,v+n+1);
    }
    v[++n]=v[1];
    double lim=1e5;
    sol.push_back({-lim,-lim});
    sol.push_back({lim,-lim});
    sol.push_back({lim,lim});
    sol.push_back({-lim,lim});
    for (i=1;i<n;i++)
    {
        solutie(v[i],v[i+1]);
    }
    if (sol.empty())
    {
        g<<"0";
        return 0;
    }
    sol.push_back(sol[0]);
    sum=0;
    for (i=0;i<(int)sol.size()-1;i++)
    {
        sum=sum+det(sol[i],sol[i+1],origine);
    }
    sum=sum/2;
    sum=abs(sum);
    g<<fixed<<setprecision(2)<<sum;
    return 0;
}