zoukankan      html  css  js  c++  java
  • 计算几何之凸包模板

     一、 点的定义:

    int n,tot;//n为二维平面上点的个数,tot为凸包上点的个数  
    struct node  
    {  
        int x,y;  
    }a[N],p[N];//p[]用来储存凸包  

    二、距离公式:

    double dis(node a,node b)  
    {  
        return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);  
    }

    三、叉积:返回结果为正说明p2在向量p0p1的左边(三点构成逆时针方向);为负则相反;为0则三点共线(叉积的性质很重要)

    double multi(node p0,node p1,node p2)  
    {  
        return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);  
    } 

    四、极角排序:极角排序是根据坐标系内每一个点与x轴所成的角,逆时针比较,。按照角度从小到大的方式排序。

    int cmp(node p1,node p2)//极角排序;  
    {  
        int x=multi(p1,p2,a[0]);  
        if(x>0||(x==0&&dis(p1,a[0])<dis(p2,a[0]))) return 1;  
        return 0;  
    } 

    graham 算法:O(nlogn)

    void Graham()  
    {  
        int k=0;          
        for(int i=0;i<n;i++)  
            if(a[i].y<a[k].y||(a[i].y==a[k].y&&a[i].x<a[k].x)) k=i;  
        swap(a[0],a[k]);  
        sort(a+1,a+n,cmp);  
        tot=2,p[0]=a[0],p[1]=a[1];  
        for(int i=2;i<n;i++)  
        {  
            while(tot>1&&multi(p[tot-1],p[tot-2],a[i])>=0) tot--;  
            p[tot++]=a[i];  
        }  
    }  

    凸包问题的五种解法 https://blog.csdn.net/bone_ace/article/details/46239187

  • 相关阅读:
    JS 操作属性
    JS 操作对象 事件 样式
    JS 一个页面关闭多个页面
    JS DOM
    JS 语言基础
    JS 基础知识
    CSS样式表
    HTML 常用标记
    HTML iframe框架
    28-2 logging 日志模块
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/9077083.html
Copyright © 2011-2022 走看看