计算几何学习笔记之旋转卡壳

旋转卡壳的用途太广太广了,而且每种用途代码都大同小异,这里只简单介绍一下(毕竟我也没怎么写过)
什么是旋转卡壳?可以想象成有一双筷子(筷子是平行的),把凸多边形夹了起来,然后不停地旋转,旋转。旋转中筷子要么是紧贴多边形的边要么就是紧贴多边形的顶点。
旋转卡壳简介:http://blog.csdn.net/acmaker/article/details/3176910
计算几何学习笔记之旋转卡壳_第1张图片
计算凸多边形上的最远点对(又叫直径)。这样考虑方法:对于每一个点,都求一求它到每个点的距离(这不就跟暴力没有区别了吗!!)。
这样做会有很多无用功。如果一根筷子边紧贴多边形的一条边,那么离这条边最远的点不就是与它们构成的最大面积的三角形吗?于是乎,每遍历一条边的时候,就把另外一个点朝相同方向转动直到面积最大(这个面积的变化是单峰的),然后求一求几个点的最短距离。(为什么是几个点?)因为另外一根筷子有可能与多边形的另外一条边重合。如下图:
计算几何学习笔记之旋转卡壳_第2张图片

double RotatingCaliper(int m)
{
    int q = 1;
    ch[m] = ch[0];
    double ans = 0;
    for(int p = 0; p < m; p++)
    {
        while(fabs(cross(ch[q+1]-ch[p+1], ch[p]-ch[p+1])) > fabs(cross(ch[q]-ch[p+1], ch[p]-ch[p+1]))) q = (q+1)%m;
        ans = max(ans,max(dis(ch[p],ch[q]),dis(ch[p+1],ch[q+1])));
        ans = max(ans,max(dis(ch[p],ch[q+1]),dis(ch[p+1],ch[q])));
    }
    return ans;
}

你可能感兴趣的:(计算几何)