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

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

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;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值