旋转卡壳

算法流程:

1:计算凸多边形y方向上的极值点,记为ymin,ymax。

经过ymin,ymax作两条平行于x轴的水平线。这两点意见就是对踵点,计算它们的距离并维护最大值

2:同时旋转两条直线,直至某一条线与多边形的一条边重合。

此时产生了新的一对对踵点,计算新的距离并更新

重复前两个步骤,直至重新回到ymin,ymax这对对踵点。

输出最大直径(这里做适当改变就可以求最大面积等)

//o(n)
int dia_rotating_calipers(int n)
{
    int i,q,dia=0;
    for(i=0,q=1;i<n;i++)
    {
        while(cross_product(stak[i],stak[i+1],stak[q+1])>cross_product(stak[i],stak[i+1],stak[q]))
        q=(q+1)%n;
        dia=max(dia,max(distance(stak[i],stak[q]),distance(stak[i+1],stak[q])));
    }
    return dia;
}
View Code

 

posted @ 2013-08-24 08:41  执着追求的IT小小鸟  阅读(175)  评论(0编辑  收藏  举报