#include<fstream>
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<iomanip>
#include<set>
#include<algorithm>
#define pb push_back
#define x first
#define y second
using namespace std;
ifstream fin("camera.in");
ofstream fout("camera.out");
const int DN=2005;
const double eps=1e-7;
int n;
typedef pair<double,double>pdd;
pdd a[DN];
double r,val;
set<pair<double,pdd> >s;
double det(pdd A,pdd B,pdd C)
{
return A.x*B.y+B.x*C.y+C.x*A.y-B.y*C.x-C.y*A.x-A.y*B.x;
}
int cmp(pdd A,pdd B)
{
return atan2(A.y,A.x)<atan2(B.y,B.x);
}
void calc(pair<pdd,pdd> A,double &a,double &b,double &c)
{
a=A.x.y-A.y.y;
b=A.y.x-A.x.x;
c=A.x.x*A.y.y-A.y.x*A.x.y;
}
pdd pct(pdd A,pdd B,double aa,double ab,double ac)
{
if(A.x<B.x)
{
if(abs(ab)<eps)
return {1e6,B.y};
return {1e6,(-ac-aa*1e6)/ab};
}
if(A.x>B.x)
{
if(abs(ab)<eps)
return {-1e6,B.y};
return {-1e6,(-ac+aa*1e6)/ab};
}
if(A.y<B.y)
{
if(abs(aa)<eps)
return {B.x,1e6};
return {(-ac-ab*1e6)/aa,1e6};
}
if(A.y>B.y)
{
if(abs(aa)<eps)
return {B.x,-1e6};
return {(-ac+ab*1e6)/aa,-1e6};
}
}
void ins2(pdd A)
{
s.insert({atan2(A.y,A.x),A});
}
int nr;
pdd b[DN];
vector<pair<double,pdd> >dl;
vector<pdd>adaug;
int insidet(pdd A,pdd B,pdd C,pdd D)
{
double rez;
rez=abs(det(A,B,C));
rez-=abs(det(A,B,D));
rez-=abs(det(A,C,D));
rez-=abs(det(C,B,D));
return abs(rez)<eps;
}
int inside(pair<pdd,pdd> A,double rx,double ry)
{
return 1;
}
void sol(pair<pdd,pdd> A,pair<pdd,pdd> B)
{
double aa=0,ab=0,ac=0,ba=0,bb=0,bc=0,rx=0,ry=0,rz=0,t=0;
calc(A,aa,ab,ac);
calc(B,ba,bb,bc);
if(abs(aa)<=eps)
{
ry=(-ac)/ab;
if(abs(ba)<=eps)
{
rz=(-bc)/bb;
if(abs(ry-rz)<=eps)
{
if(inside(B,A.x.x,A.x.y))
adaug.pb({A.x.x,A.x.y});
if(inside(B,A.y.x,A.y.y))
adaug.pb({A.y.x,A.y.y});
if(inside(A,B.x.x,B.x.y))
adaug.pb({B.x.x,B.x.y});
if(inside(A,B.y.x,B.y.y))
adaug.pb({B.y.x,B.y.y});
}
return;
}
rx=-bc-ry*bb;
rx/=ba;
if(inside(A,rx,ry)&&inside(B,rx,ry))
adaug.pb({rx,ry});
return;
}
t=ba/aa;
ab*=t;
ac*=t;
ab-=bb;
ac-=bc;
if(abs(ab)<=eps)
{
if(abs(ac)<=eps)
{
if(inside(B,A.x.x,A.x.y))
adaug.pb({A.x.x,A.x.y});
if(inside(B,A.y.x,A.y.y))
adaug.pb({A.y.x,A.y.y});
if(inside(A,B.x.x,B.x.y))
adaug.pb({B.x.x,B.x.y});
if(inside(A,B.y.x,B.y.y))
adaug.pb({B.y.x,B.y.y});
}
return;
}
ry=(-ac)/ab;
calc(A,aa,ab,ac);
rx=-ac-ry*ab;
rx/=aa;
if(inside(A,rx,ry)&&inside(B,rx,ry))
adaug.pb({rx,ry});
}
void ins(pdd A,pdd B,pdd C)
{
set<pair<double,pdd> >::iterator it;
it=s.begin();
nr=0;
//dl.clear();
while(it!=s.end())
{
nr++;
b[nr]=it->y;
if(!insidet(A,B,C,b[nr]))
dl.pb(*it);
it++;
}
for(auto i:dl)
if(s.find(i)!=s.end())
s.erase(s.find(i));
}
void add(int poz)
{
pdd A=a[poz],B,C;
double aa,ab,ac;
pair<pdd,pdd>zz;
calc({a[poz],a[poz-1]},aa,ab,ac);
B=pct(A,a[poz-1],aa,ab,ac);
calc({a[poz],a[poz+1]},aa,ab,ac);
C=pct(A,a[poz+1],aa,ab,ac);
ins(A,B,C);
}
void sortare()
{
double sx=0,sy=0;
for(int i=1;i<=nr;i++)
{
sx+=b[i].x;
sy+=b[i].y;
}
sx/=nr;
sy/=nr;
for(int i=1;i<=nr;i++)
{
b[i].x-=sx;
b[i].y-=sy;
}
sort(b+1,b+nr+1,cmp);
}
void arie()
{
set<pair<double,pdd> >::iterator it;
it=s.begin();
nr=0;
while(it!=s.end())
{
nr++;
b[nr]=it->y;
it++;
}
sortare();
b[nr+1]=b[1];
double rez=0;
for(int i=1;i<=nr;i++)
rez+=det({0,0},b[i],b[i+1]);
rez/=2;
fout<<fixed<<setprecision(2)<<rez;
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>a[i].x>>a[i].y;
//sort(a+1,a+n+1,cmp);
a[0]=a[n];
a[n+1]=a[1];
for(int i=1;i<=n;i++)
//if(det(a[i-1],a[i],a[i+1])<0)
{
ins2(a[i]);
adaug.clear();
for(int j=i+1;j<=n;j++)
sol({a[i],a[i+1]},{a[j],a[j+1]});
for(auto j:adaug)
ins2(j);
}
for(int i=1;i<=n;i++)
if(det(a[i-1],a[i],a[i+1])<0)
add(i);
arie();
}