#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
#include<cstdio>
#define rep(i,n) for(int i=0;i<n;i++)
#define pb push_back
using namespace std;
namespace Geometry
{
namespace Data_Struct
{
template<int D>
struct Point
{
double X[D];
void input()
{
rep(i,D)scanf("%lf",X+i);
}
void operator=(const Point&a)
{
memcpy(X,a.X,sizeof(double)*D);
}
Point&operator+=(const Point&a)
{
rep(i,D)X[i]+=a.X[i];
return *this;
}
Point&operator-=(const Point&a)
{
rep(i,D)X[i]-=a.X[i];
return *this;
}
Point&operator*=(double d)
{
rep(i,D)X[i]*=d;
return *this;
}
Point&operator/=(double d)
{
rep(i,D)X[i]/=d;
return *this;
}
Point operator+(const Point&a)
{
Point ret=*this;
return ret+=a;
}
Point operator-(const Point&a)
{
Point ret=*this;
return ret-=a;
}
Point operator*(double d)
{
Point ret=*this;
return ret*=d;
}
Point operator/(double d)
{
Point ret=*this;
return ret/=d;
}
bool operator<(const Point&a)const
{
rep(i,D)
{
if(X[i]<a.X[i])return true;
if(X[i]>a.X[i])return false;
}
return false;
}
};
typedef Point<1> Point1D;
typedef Point<2> Point2D;
typedef Point<3> Point3D;
double dot(Point2D a,Point2D b)
{
return a.X[0]*b.X[0]+a.X[1]*b.X[1];
}
double det(Point2D a,Point2D b)
{
return a.X[0]*b.X[1]-a.X[1]*b.X[0];
}
template<int D>
struct Rec
{
typedef Point<D> PointD;
PointD low,high;
void just()
{
rep(i,D)
{
if(low.X[i]>high.X[i])
swap(low.X[i],high.X[i]);
}
}
bool inrange(double x,double l,double r)
{
return(x>=l&&x<=r);
}
bool Contain(const PointD&a)const
{
rep(i,D)
{
if(!inrange(a.X[i],low.X[i],high.X[i]))
return false;
}
return true;
}
};
typedef Rec<1> Rec1D;
typedef Rec<2> Rec2D;
typedef Rec<3> Rec3D;
}
namespace Algorithm
{
namespace ConvexHull
{
typedef Geometry::Data_Struct::Point2D Point;
using Geometry::Data_Struct::det;
using Geometry::Data_Struct::dot;
vector<Point> Calc_ConvexHull(vector<Point> P)
{
sort(P.begin(),P.end());
int n=P.size(),k=0;
if(n<=1)return P;
vector<Point> qs(2*n);
for(int i=0;i<n;qs[k++]=P[i++])
while(k>1&&det(qs[k-1]-qs[k-2],P[i]-qs[k-1])<=0)k--;
for(int i=n-2,t=k;i>=0;qs[k++]=P[i--])
while(k>t&&det(qs[k-1]-qs[k-2],P[i]-qs[k-1])<=0)k--;
vector<Point> ret(qs.begin(),qs.begin()+k);
return ret;
}
double Area(const vector<Point>&P)
{
int n=P.size();double ret=0;
rep(i,n)ret+=det(P[i],P[(i+1)%n]);
return ret/2;
}
}
}
}
int main()
{
using namespace Geometry::Algorithm::ConvexHull;
vector<Point> A;
rep(i,4)
{
Point a;a.input();
A.pb(a);
}
vector<Point>ret=Calc_ConvexHull(A);
cout<<Area(ret)<<endl;
}
I2luY2x1ZGU8Y3N0cmluZz4KI2luY2x1ZGU8YWxnb3JpdGhtPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPGlvc3RyZWFtPgojaW5jbHVkZTxjc3RkaW8+CiNkZWZpbmUgcmVwKGksbikgZm9yKGludCBpPTA7aTxuO2krKykKI2RlZmluZSBwYiBwdXNoX2JhY2sKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKbmFtZXNwYWNlIEdlb21ldHJ5CnsKICAgIG5hbWVzcGFjZSBEYXRhX1N0cnVjdAogICAgewogICAgICAgIHRlbXBsYXRlPGludCBEPgogICAgICAgIHN0cnVjdCBQb2ludAogICAgICAgIHsKICAgICAgICAgICAgZG91YmxlIFhbRF07CiAgICAgICAgICAgIHZvaWQgaW5wdXQoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXAoaSxEKXNjYW5mKCIlbGYiLFgraSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgUG9pbnQmYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVtY3B5KFgsYS5YLHNpemVvZihkb3VibGUpKkQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFBvaW50Jm9wZXJhdG9yKz0oY29uc3QgUG9pbnQmYSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVwKGksRClYW2ldKz1hLlhbaV07CiAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUG9pbnQmb3BlcmF0b3ItPShjb25zdCBQb2ludCZhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXAoaSxEKVhbaV0tPWEuWFtpXTsKICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICBQb2ludCZvcGVyYXRvcio9KGRvdWJsZSBkKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXAoaSxEKVhbaV0qPWQ7CiAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUG9pbnQmb3BlcmF0b3IvPShkb3VibGUgZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVwKGksRClYW2ldLz1kOwogICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFBvaW50IG9wZXJhdG9yKyhjb25zdCBQb2ludCZhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQb2ludCByZXQ9KnRoaXM7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0Kz1hOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFBvaW50IG9wZXJhdG9yLShjb25zdCBQb2ludCZhKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQb2ludCByZXQ9KnRoaXM7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0LT1hOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFBvaW50IG9wZXJhdG9yKihkb3VibGUgZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUG9pbnQgcmV0PSp0aGlzOwogICAgICAgICAgICAgICAgcmV0dXJuIHJldCo9ZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBQb2ludCBvcGVyYXRvci8oZG91YmxlIGQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFBvaW50IHJldD0qdGhpczsKICAgICAgICAgICAgICAgIHJldHVybiByZXQvPWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUG9pbnQmYSljb25zdAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXAoaSxEKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKFhbaV08YS5YW2ldKXJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmKFhbaV0+YS5YW2ldKXJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdHlwZWRlZiBQb2ludDwxPiBQb2ludDFEOwogICAgICAgIHR5cGVkZWYgUG9pbnQ8Mj4gUG9pbnQyRDsKICAgICAgICB0eXBlZGVmIFBvaW50PDM+IFBvaW50M0Q7CiAgICAgICAgZG91YmxlIGRvdChQb2ludDJEIGEsUG9pbnQyRCBiKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGEuWFswXSpiLlhbMF0rYS5YWzFdKmIuWFsxXTsKICAgICAgICB9CiAgICAgICAgZG91YmxlIGRldChQb2ludDJEIGEsUG9pbnQyRCBiKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGEuWFswXSpiLlhbMV0tYS5YWzFdKmIuWFswXTsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGU8aW50IEQ+CiAgICAgICAgc3RydWN0IFJlYwogICAgICAgIHsKICAgICAgICAgICAgdHlwZWRlZiBQb2ludDxEPiBQb2ludEQ7CiAgICAgICAgICAgIFBvaW50RCBsb3csaGlnaDsKICAgICAgICAgICAgdm9pZCBqdXN0KCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVwKGksRCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZihsb3cuWFtpXT5oaWdoLlhbaV0pCiAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAobG93LlhbaV0saGlnaC5YW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBib29sIGlucmFuZ2UoZG91YmxlIHgsZG91YmxlIGwsZG91YmxlIHIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybih4Pj1sJiZ4PD1yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBib29sIENvbnRhaW4oY29uc3QgUG9pbnREJmEpY29uc3QKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVwKGksRCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZighaW5yYW5nZShhLlhbaV0sbG93LlhbaV0saGlnaC5YW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHR5cGVkZWYgUmVjPDE+IFJlYzFEOwogICAgICAgIHR5cGVkZWYgUmVjPDI+IFJlYzJEOwogICAgICAgIHR5cGVkZWYgUmVjPDM+IFJlYzNEOwogICAgfQogICAgbmFtZXNwYWNlIEFsZ29yaXRobQogICAgewogICAgICAgIG5hbWVzcGFjZSBDb252ZXhIdWxsCiAgICAgICAgewogICAgICAgICAgICB0eXBlZGVmIEdlb21ldHJ5OjpEYXRhX1N0cnVjdDo6UG9pbnQyRCBQb2ludDsKICAgICAgICAgICAgdXNpbmcgR2VvbWV0cnk6OkRhdGFfU3RydWN0OjpkZXQ7CiAgICAgICAgICAgIHVzaW5nIEdlb21ldHJ5OjpEYXRhX1N0cnVjdDo6ZG90OwogICAgICAgICAgICB2ZWN0b3I8UG9pbnQ+IENhbGNfQ29udmV4SHVsbCh2ZWN0b3I8UG9pbnQ+IFApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNvcnQoUC5iZWdpbigpLFAuZW5kKCkpOwogICAgICAgICAgICAgICAgaW50IG49UC5zaXplKCksaz0wOwogICAgICAgICAgICAgICAgaWYobjw9MSlyZXR1cm4gUDsKICAgICAgICAgICAgICAgIHZlY3RvcjxQb2ludD4gcXMoMipuKTsKICAgICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8bjtxc1trKytdPVBbaSsrXSkKICAgICAgICAgICAgICAgICAgICB3aGlsZShrPjEmJmRldChxc1trLTFdLXFzW2stMl0sUFtpXS1xc1trLTFdKTw9MClrLS07CiAgICAgICAgICAgICAgICBmb3IoaW50IGk9bi0yLHQ9aztpPj0wO3FzW2srK109UFtpLS1dKQogICAgICAgICAgICAgICAgICAgIHdoaWxlKGs+dCYmZGV0KHFzW2stMV0tcXNbay0yXSxQW2ldLXFzW2stMV0pPD0wKWstLTsKICAgICAgICAgICAgICAgIHZlY3RvcjxQb2ludD4gcmV0KHFzLmJlZ2luKCkscXMuYmVnaW4oKStrKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG91YmxlIEFyZWEoY29uc3QgdmVjdG9yPFBvaW50PiZQKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgbj1QLnNpemUoKTtkb3VibGUgcmV0PTA7CiAgICAgICAgICAgICAgICByZXAoaSxuKXJldCs9ZGV0KFBbaV0sUFsoaSsxKSVuXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0LzI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KaW50IG1haW4oKQp7CiAgICB1c2luZyBuYW1lc3BhY2UgR2VvbWV0cnk6OkFsZ29yaXRobTo6Q29udmV4SHVsbDsKICAgIHZlY3RvcjxQb2ludD4gQTsKICAgIHJlcChpLDQpCiAgICB7CiAgICAgICAgUG9pbnQgYTthLmlucHV0KCk7CiAgICAgICAgQS5wYihhKTsKICAgIH0KICAgIHZlY3RvcjxQb2ludD5yZXQ9Q2FsY19Db252ZXhIdWxsKEEpOwogICAgY291dDw8QXJlYShyZXQpPDxlbmRsOwp9Cg==