#include #include #include #include #define eps 1e-6 #define N 10010 using namespace std; struct Point { double x,y; Point(){} Point(double a,double b):x(a),y(b){} }; struct Line { Point a,b; Line(){} Line(Point u,Point v):a(u),b(v){} }; struct Info { int n; Point p[N]; Line l; Point fa; }; Info a,b; struct Node { int u,v; double len; Node(){} Node(int u0,int v0,double len0):u(u0),v(v0),len(len0){} }nod[8*N]; bool cccc(Node a,Node b) { return a.len < b.len; } int nod_n; int Sig(double a) { return a<-eps?-1:a>eps; } Point Intersection(Line u,Line v) { Point ret=u.a; double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))/ ((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x)); ret.x+=(u.b.x-u.a.x)*t; ret.y+=(u.b.y-u.a.y)*t; return ret; } int cmp(Point a,Point b) { if(a.x==b.x) return a.y>1; if(Sig(num-p[mid].y)>=0) left=mid; else right=mid; } } else { while(left+1>1; if(Sig(num-p[mid].x)>=0) left=mid; else right=mid; } } return left; } Point operator +(Point a,Point b) { Point tmp; tmp.x=a.x+b.x; tmp.y=a.y+b.y; return tmp; } void Init() { double t; double ax,ay,bx,by,cx,cy,dx,dy; scanf("%d%d",&a.n,&b.n); scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by); scanf("%lf%lf%lf%lf",&cx,&cy,&dx,&dy); for(int i=0;i=0) nod[nod_n++]=Node(i,a.n+b.n-1,Dis(a.p[i],b.p[b.n-1])); else { int pos=Find(y,b.p,b.n-1,1); double d1=Dis(a.p[i],b.p[pos]); double d2=Dis(a.p[i],b.p[pos+1]); nod[nod_n++]=Node(i,a.n+pos,d1); nod[nod_n++]=Node(i,a.n+pos+1,d2); } } else { double x=tp.x; if(Sig(x-b.p[0].x)<=0) nod[nod_n++]=Node(i,a.n,Dis(a.p[i],b.p[0])); else if(Sig(x-b.p[b.n-1].x)>=0) nod[nod_n++]=Node(i,a.n+b.n-1,Dis(a.p[i],b.p[b.n-1])); else { int pos=Find(x,b.p,b.n-1,2); double d1=Dis(a.p[i],b.p[pos]); double d2=Dis(a.p[i],b.p[pos+1]); nod[nod_n++]=Node(i,a.n+pos,d1); nod[nod_n++]=Node(i,a.n+pos+1,d2); } } } for(int i=0;i=0) nod[nod_n++]=Node(i+a.n,a.n-1,Dis(b.p[i],a.p[a.n-1])); else { int pos=Find(y,a.p,a.n-1,1); double d1=Dis(b.p[i],a.p[pos]); double d2=Dis(b.p[i],a.p[pos+1]); nod[nod_n++]=Node(i+a.n,pos,d1); nod[nod_n++]=Node(i+a.n,pos+1,d2); } } else { double x=tp.x; if(Sig(x-a.p[0].x)<=0) nod[nod_n++]=Node(i+a.n,0,Dis(b.p[i],a.p[0])); else if(Sig(x-a.p[a.n-1].x)>=0) nod[nod_n++]=Node(i+a.n,a.n-1,Dis(b.p[i],a.p[a.n-1])); else { int pos=Find(x,a.p,a.n-1,2); double d1=Dis(b.p[i],a.p[pos]); double d2=Dis(b.p[i],a.p[pos+1]); nod[nod_n++]=Node(i+a.n,pos,d1); nod[nod_n++]=Node(i+a.n,pos+1,d2); } } } for(int i=0;i