您的位置:首页 > 其它

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

2016-04-01 18:11 363 查看
旋转卡壳的用途太广太广了,而且每种用途代码都大同小异,这里只简单介绍一下(毕竟我也没怎么写过)

什么是旋转卡壳?可以想象成有一双筷子(筷子是平行的),把凸多边形夹了起来,然后不停地旋转,旋转。旋转中筷子要么是紧贴多边形的边要么就是紧贴多边形的顶点。

旋转卡壳简介:/article/2838640.html



计算凸多边形上的最远点对(又叫直径)。这样考虑方法:对于每一个点,都求一求它到每个点的距离(这不就跟暴力没有区别了吗!!)。

这样做会有很多无用功。如果一根筷子边紧贴多边形的一条边,那么离这条边最远的点不就是与它们构成的最大面积的三角形吗?于是乎,每遍历一条边的时候,就把另外一个点朝相同方向转动直到面积最大(这个面积的变化是单峰的),然后求一求几个点的最短距离。(为什么是几个点?)因为另外一根筷子有可能与多边形的另外一条边重合。如下图:



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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: