#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
double EPS=1e-10;
double add(double a,double b)
{
if (abs(a+b)<EPS*(abs(a)+abs(b)))
return 0;
return a+b;
}
struct P
{
double x,y;
P(){
}
P(double x,double y):x(x),y(y)
{
}
P operator +(P p)
{
return P(add(x,p.x),add(y,p.y));
}
P operator -(P p)
{
return P(add(x,-1.0*p.x),add(y,-1.0*p.y));
}
P operator * (double d)
{
return P(x*d,y*d);
}
double det(P p)
{
return add(x*p.y,-1.0*y*p.x);
}
double dot(P a)
{
return add(x*a.x,y*a.y);
}
};
bool on_same_line(P p1,P p2,P q)
{
return (p1-q).det(p2-q)==0&&(p1-q).dot(p2-q)<=0;
}
P Getnode(P p1,P p2,P q1,P q2)
{
return p1+(p2-p1)*((q2-q1).det(q1-p1)/(q2-q1).det(p2-p1));
}
//判断两个线段相交的模板