#include <iostream>
#include <math.h>
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
typedef struct
{
double x,y;
}punct;
const int inf=1e9;
const double pi=3.1415;
vector<punct> v,I,J;
double det;
double a1,b1,c1,a2,b2,c2,X,Y;
double dist(punct a,punct b)
{
return (sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y)));
}
double side(punct a,punct b,punct c)
{
return ((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x));
}
void patrulater()
{
punct a,b;
a.x=v[0].x;
a.y=v[0].y;
b.x=v[1].x;
b.y=v[1].y;
if((side(a,b,v[2])<0 && side(a,b,v[3])>0) || (side(a,b,v[2])>0 && side(a,b,v[3])<0))
{
I.push_back(a);
I.push_back(b);
J.push_back(v[2]);
J.push_back(v[3]);
return;
}
a.x=v[0].x;
a.y=v[0].y;
b.x=v[2].x;
b.y=v[2].y;
if((side(a,b,v[1])<0 && side(a,b,v[3])>0) || (side(a,b,v[1])>0 && side(a,b,v[3])<0))
{
I.push_back(a);
I.push_back(b);
J.push_back(v[1]);
J.push_back(v[3]);
return;
}
a.x=v[0].x;
a.y=v[0].y;
b.x=v[3].x;
b.y=v[3].y;
if((side(a,b,v[2])<0 && side(a,b,v[1])>0) || (side(a,b,v[2])>0 && side(a,b,v[1])<0))
{
I.push_back(a);
I.push_back(b);
J.push_back(v[1]);
J.push_back(v[2]);
return;
}
a.x=v[1].x;
a.y=v[1].y;
b.x=v[2].x;
b.y=v[2].y;
if((side(a,b,v[0])<0 && side(a,b,v[3])>0) || (side(a,b,v[0])>0 && side(a,b,v[3])<0))
{
I.push_back(a);
I.push_back(b);
J.push_back(v[0]);
J.push_back(v[3]);
return;
}
a.x=v[1].x;
a.y=v[1].y;
b.x=v[3].x;
b.y=v[3].y;
if((side(a,b,v[0])<0 && side(a,b,v[2])>0) || (side(a,b,v[0])>0 && side(a,b,v[2])<0))
{
I.push_back(a);
I.push_back(b);
J.push_back(v[0]);
J.push_back(v[2]);
return;
}
a.x=v[2].x;
a.y=v[2].y;
b.x=v[3].x;
b.y=v[3].y;
if((side(a,b,v[0])<0 && side(a,b,v[1])>0) || (side(a,b,v[0])>0 && side(a,b,v[1])<0))
{
I.push_back(a);
I.push_back(b);
J.push_back(v[0]);
J.push_back(v[1]);
return;
}
}
double arie(punct a,punct b,punct c)
{
double p,arie,len_a,len_b,len_c;
len_a=dist(a,b);
len_b=dist(b,c);
len_c=dist(a,c);
p=(len_a+len_b+len_c)/2;
arie=sqrt(p*(p-len_a)*(p-len_b)*(p-len_c));
return arie;
}
int comparator(double dif1,double dif2)
{
if(abs(dif1-dif2)<0.001)
return 1;
else
return 0;
}
bool triunghi()
{
int i,max=0;
punct last_p,a,b,c;
last_p.x=v[3].x;
last_p.y=v[3].y;
a.x=v[0].x;
a.y=v[0].y;
b.x=v[1].x;
b.y=v[1].y;
c.x=v[2].x;
c.y=v[2].y;
if(comparator(arie(a,b,c),arie(a,b,last_p)+arie(a,c,last_p)+arie(b,c,last_p))==1 && (arie(b,c,last_p)==0 || arie(a,c,last_p)==0 || arie(b,a,last_p)==0))
{
cout<<"Punctul ("<<last_p.x<<", "<<last_p.y<<") este pe o latura a triunghiului\n";return true;
}
if(comparator(arie(a,b,c),arie(a,b,last_p)+arie(a,c,last_p)+arie(b,c,last_p))==1 && (arie(b,c,last_p)!=0 && arie(a,c,last_p)!=0 && arie(b,a,last_p)!=0))
{
cout<<"Punctul ("<<last_p.x<<", "<<last_p.y<<") este strict in interiorul triunghiului\n"; return true;
}
else {
cout<<"Punctul ("<<last_p.x<<", "<<last_p.y<<") este in afara triunghiului\n"; return false;
}
}
int apartine(double X,double Y)
{
return (((a1*X+b1*Y+c1)==0) && ((a2*X+b2*Y+c2)==0));
}
void circumscriptibil()
{
patrulater();
punct a,b,c,d;
double d1,d2,d3,d4;
a=I[0];
b=J[0];
c=I[1];
d=J[1];
d1=dist(a,b);
d2=dist(b,c);
d3=dist(c,d);
d4=dist(d,a);
cout<<a.x<<" "<<a.y<<"\n";
cout<<b.x<<" "<<b.y<<"\n";
cout<<c.x<<" "<<c.y<<"\n";
cout<<d.x<<" "<<d.y<<"\n";
if(d1+d3==d2+d4)
cout<<"E circumscriptibil";
else
cout<<"Nu este!";
}
int main()
{
ifstream fin("maxsubsum.in");
punct t;
int i;
for(i=1;i<=4;i++)
{
fin>>t.x>>t.y;
v.push_back(t);
}
//Ecuatia A1A2
a1=v[0].y-v[1].y;
b1=v[1].x-v[0].x;
c1=v[0].x*v[1].y-v[1].x*v[0].y;
//Ecuatia A3A4
a2=v[2].y-v[3].y;
b2=v[3].x-v[2].x;
c2=v[2].x*v[3].y-v[3].x*v[2].y;
if(triunghi()==false)
{
circumscriptibil();}
fin.close();
return 0;
}