poj 3608 Bridge Across Islands
求两个凸包的最小距离。
旋转卡壳求凸多边形间最小距离 点击打开链接
double Rotating_Calipers_Distance(vector<Point>& ch1, vector<Point>& ch2){
vector<Point> P = ConvexHull(ch1);
vector<Point> Q = ConvexHull(ch2);
int n = P.size(), m = Q.size();
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.push_back(P[0]);
Q.push_back(Q[0]);
double tmp, ans = 1e20;
for(int i=0; i<n; ++i)
{
//Cross(Q[ymaxQ+1],P[yminP],P[yminP+1]) - Cross(Q[ymaxQ],P[yminP],P[yminP+1])
while( tmp=Cross(Q[ymaxQ+1]-Q[ymaxQ], P[yminP]-P[yminP+1]) > eps)
ymaxQ = (ymaxQ+1) % m;
if(tmp <-eps) ans = min(ans, DistanceToSegment(Q[ymaxQ], P[yminP], P[yminP+1]));
else ans = min(ans, DistanceTwoSegment(P[yminP],P[yminP+1], Q[ymaxQ],Q[ymaxQ+1]));
yminP = (yminP+1) % n;
}
return ans;
}