Cod sursa(job #2900261)

Utilizator bem.andreiIceman bem.andrei Data 10 mai 2022 17:16:51
Problema Camera Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("camera.in");
ofstream w("camera.out");
struct str
{
    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(str a,str b ,str 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 <str> sol,copie;
str ver (str a,str b,str c,str d)
{
    double a1=b.y-a.y, b1=a.x-b.x, c1=a.y*b.x-a.x*b.y, a2=d.y-c.y, b2=c.x-d.x, c2=c.y*d.x-c.x*d.y;
   str 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 (str a,str b)
{
    int i;
    int semn1,semn2;
    sol.push_back(sol[0]);
    copie.clear();
    for (int 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)
        {
            str valoare=ver(a,b,sol[i],sol[i+1]);
            copie.push_back(ver(a,b,sol[i],sol[i+1]));

        }
        if (semn2>=0)
        {
            copie.push_back(sol[i+1]);
        }
    }
    sol=copie;
}
int n;
double sum;
str origine;
int main()
{
    r>>n;
    for (int i=1;i<=n;i++)
    {
        r>>v[i].x>>v[i].y;
    }
    double arie=0;
    for (int 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 (int i=1;i<n;i++)
    {
        solutie(v[i],v[i+1]);
    }
    if (sol.empty())
    {
        w<<"0";
        return 0;
    }
    sol.push_back(sol[0]);
    sum=0;
    for (int i=0;i<(int)sol.size()-1;i++)
    {
        sum=sum+det(sol[i],sol[i+1],origine);
    }
    sum=sum/2;
    sum=abs(sum);
    w<<fixed<<setprecision(2)<<sum;
    return 0;
}