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