凸包模板(Graham)

//凸包,Graham算法
//点编号0~n-1
//返回凸包结果Stack[0~Top-1]
Point List[maxn],Stack[maxn]; int Top;
bool cmp( Point a , Point b )
{
    double tmp = (a-List[0])^(b-List[0]);
    if ( tmp>0 ) return true;
    else if ( tmp==0&&sgn( dist2( a , List[0] )-dist2( b , List[0] ) )<=0 ) return true;
    else return false;
}
void Graham( int n )
{
    int k = 0;
    for ( int i=1 ; i<n ; i++ )
        if ( List[i].y<List[k].y||(List[i].y==List[k].y&&List[i].x<List[k].x) ) k = i;
    swap ( List[k] , List[0] );
    sort ( List+1  , List+n , cmp );
    if ( n==1 )
    {
        Top = 1;
        Stack[0] = List[0];
        return;
    }
    if ( n==2 )
    {
        Top = 2;
        Stack[0] = List[0];
        Stack[1] = List[1];
        return;
    }
    Stack[0] = List[0];
    Stack[1] = List[1];
    Top = 2;
    for ( int i=2 ; i<n ; i++ )
    {
        while ( Top>1&&((Stack[Top-1]-Stack[Top-2])^(List[i]-Stack[Top-2]))<=0 ) Top--;
        Stack[Top++] = List[i];
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值