旋转的部分始终感觉有点别扭。。后来发现是因为叉积顺序为负。。
所以让三角形面积逐渐变大实际上就是让三角形面积变小(绝对值意义上的),这样就是让高变小了。。
至于为什么要选最下和最上。。应该是为了满足两条线始终可以生成所有多边形间的对踵点对吧?
//#include<bits/stdc++.h>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<iostream>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
using namespace std; const double pi=acos(-1.0);
#define ll long long
#define pb push_back#define sqr(a) ((a)*(a))
#define dis(a,b) sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))const double eps=1e-10;
const int maxn=5e4+56;
const int inf=0x3f3f3f3f;struct Point{double x,y;Point(){}Point(double x,double y):x(x),y(y){}Point operator -(const Point &p){return Point(x-p.x,y-p.y);}bool operator<(const Point &a)const{if(x!=a.x)return x<a.x;else return y<a.y;}double dot(const Point&p){return x*p.x+y*p.y;}double det(const Point&p){return x*p.y-y*p.x;}
};
Point P[maxn],Q[maxn];//AB与AC的叉积,正表示C在向量AB的逆时针方向
double cross(Point A,Point B,Point C){return (B-A).det(C-A);
}
//AB与AC的点积,0则垂直
double multi(Point A,Point B,Point C){return (B-A).dot(C-A);
}void anticlockwise_sort(Point *p,int N){for(int i=0;i<N-2;i++){double tmp=cross(p[i],p[i+1],p[i+2]);if(tmp>eps)return;else if(tmp<-eps){reverse(p,p+N);return;}}
}//C到线段AB的距离
double point_to_line(Point A,Point B,Point C){if(dis(A,B)<eps)return dis(B,C);if(multi(A,B,C)<-eps)return dis(A,C);if(multi(B,A,C)<-eps)return dis(B,C);return fabs(cross(A,B,C)/dis(A,B)); //面积
}
//两线段AB到CD的距离
double line_to_line(Point A,Point B,Point C,Point D){return min(min(point_to_line(A,B,C),point_to_line(A,B,D)),min(point_to_line(C,D,A),point_to_line(C,D,B)));
}
//两凸包求距
//
double solve(Point *P,Point *Q,int n,int m){int yminP=0,ymaxQ=0;for(int i=0;i<n;i++)if(P[i].y<P[yminP].y)yminP=i;for(int i=0;i<m;i++)if(Q[i].y>Q[ymaxQ].y)ymaxQ=i;P[n]=P[0];Q[m]=Q[0];double arg,ans=inf;for(int i=0;i<n;i++){ //枚举p上的点while(arg=(cross(P[yminP+1],Q[ymaxQ+1],P[yminP])-cross(P[yminP+1],Q[ymaxQ],P[yminP]))>eps){
/*cout<<"here"<<endl;cout<<cross(P[yminP+1],Q[ymaxQ+1],P[yminP])<<endl;cout<<cross(P[yminP+1],Q[ymaxQ],P[yminP])<<endl;cout<<P[yminP].x<<" "<<Q[ymaxQ].x<<"ww"<<endl;
*/ymaxQ=(ymaxQ+1)%m;}ans=min(ans,line_to_line(P[yminP],P[yminP+1],Q[ymaxQ],Q[ymaxQ+1]));yminP=(yminP+1)%n;}return ans;
}int main(){int N,M;while(~scanf("%d%d",&N,&M)&&N){for(int i=0;i<N;i++){scanf("%lf%lf",&P[i].x,&P[i].y);}for(int i=0;i<M;i++){scanf("%lf%lf",&Q[i].x,&Q[i].y);}anticlockwise_sort(P,N);anticlockwise_sort(Q,M);printf("%.5lf\n",solve(P,Q,N,M));}
}