Pagini recente » Cod sursa (job #1453099) | Cod sursa (job #1541832) | Cod sursa (job #1780300) | Cod sursa (job #1153672) | Cod sursa (job #2900261)
#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;
}