模板

旋转卡壳就是使用一对平行线卡着凸包进行旋转,正好被卡住的一对点称为对踵点对。
逆时针枚举边的时候,对踵点对的变化也是逆时针的,所以当前边所对应的最远点可以紧接着上一次的继续计算。
旋转卡壳可以计算凸包的直径,时间复杂度为\(O(n)\)

double rotatingCalipers(P* qs,int n){
    double ans=0;
    qs[n]=qs[0];
    int q=1;
    for(int i=0;i<n;i++){
        while(Cross(qs[q]-qs[i+1],qs[i]-qs[i+1])<Cross(qs[q+1]-qs[i+1],qs[i]-qs[i+1])){
           q=(q+1)%n;
        }
        ans=max(ans,max(dis(qs[q],qs[i]),dis(qs[q+1],qs[i+1])));
    }
    return ans;
}
posted @ 2020-07-08 19:12  fxq1304  阅读(31)  评论(0编辑  收藏  举报