/*
translation:
求两个凸包间的最小距离?
solution:
旋转卡壳法。
note:
* 网上给出的资料都差不多,具体如下:
1. 计算凸包P在y轴方向上的最小值记为yminP,和凸包Q在y轴方向上的最大值记为ymaxQ。
2. 建立两条紧贴着yminP, ymaxQ的两条水平的直线LP, LQ。要求他们指向不同的方向。这时候他们就形成了一对anti-podal pair。
3. 计算(yminP,ymaxQ)的距离,并记为minimum.
4. 将两条直线顺时针旋转,直到其中一条遇到凸包的一条边停止。
5. 只要有一条直线遇到了一条边,我们就需要计算新的vertex-vertex anti-podal之间的距离,并同minimum比较,并更新。如果两条直线都分同 一 条 边重合,那么情况就复杂一些了。如果这两条边”重合“,也就是说我们可以画一条垂直于这两条直线的直线并且和凸包上的两个边都相交(不包括在顶点相交),那么我们就需要计算两条直线的距离了。否则的话我们只要计算3个新的顶点到顶点之间的距离。所有的具体都要同minimum比较,并更新minimum 的值。
6. 重复步骤4,5,直到两条直线又回到起始位置为止。
7. 输出最小的距离。
# 之所以在最后旋转卡壳求2次是因为旋转卡壳要求两个直线都已经回到原点后才能结束。但是由于具体代码实现时,结束时不一定保证两条
直线都已经回到原点(因为一个凸包的点数可能较多)。所以可以将两个凸包互换后再处理一次,就能保证正确性。
# 题目所给的点都是按照时针顺序排好的,如果不是的话还需要对其进行排序。
*/
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 50000 + 5;
const double INF = 0x3f3f3f3f * 1.0;
struct Point
{
double x, y;
poj3608(旋转卡壳求两凸包间的最短距离)
最新推荐文章于 2018-05-25 12:54:16 发布