凸包——求周长、面积

凸包

什么是凸包

在平面图中给定一些点集,去求出一些点:相邻2点的连线能够将所有的点包围起来
凸包

葛立恒(Graham)扫描法

1、先找到左下角的点P0(一定在凸包上)
2、以P0为原点,将其他的点按照极坐标排序,角度小的排在前,若角度相同,距离近的排在前
3、P0 ,P1 入栈,从P2(第三个点)开始,若P2 在直线P0 P1(p[ i-1 ] p [ i ]) 的左边 ,则P2入栈,否则P1 出栈,一直遍历完后面所有点 (这里就需要向量叉乘来判断点在线的左边还是右边)
4、最后留在栈中的点就是凸包上的点
图示
撸代码:

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct Point
{
    int x,y;
}p[1010];
int XMUL(Point a,Point b,Point c,Point d)/**ab向量 X cd向量*/
{
    return ((b.x-a.x)*(d.y-c.y)-(d.x-c.x)*(b.y-a.y));
}
double dis(Point a,Point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y)*1.0);
}
bool comp(Point a,Point b)
{
    int m=XMUL(p[0],a,p[0],b);
    if(m>0)
        return 1;
    else if(m==0&&dis(p[0],a)-dis(p[0],b)<1e-8)
        return 1;
    return 0;
}
int main()
{
    int n,r;
    while(~scanf("%d%d",&n,&r))
    {
        for(int i=0;i<n;i++)
            scanf("%d%d",&p[i].x,&p[i].y);
        /**找到P0*/
        int k=0;
        for(int i=1;i<n;i++)
        {
            if(p[k].y>p[i].y)
                k=i;
            else if(p[k].y==p[i].y&&p[k].x>p[i].x)
                k=i;
        }
        swap(p[k],p[0]);
        /**按照极角坐标排序*/
        sort(p+1,p+n,comp);

        Point s[1010];
        int top=1;
        s[0]=p[0];
        s[1]=p[1];
        for(int i=2;i<n;i++)
        {
            while(top>=1&&XMUL(s[top-1],s[top],s[top],p[i])<0)
                top--;
            s[++top]=p[i];
        }
        double ans=0;
        for(int i=0;i<top;i++)
            ans+=dis(s[i],s[i+1]);
        ans+=dis(s[top],s[0]);
        double PI = acos(-1);
        ans+=2*PI*r;
        printf("%.0f\n",ans);
    }
    return 0;
}

若要求凸包的面积

还是先求出凸包上的点,再根据三角形面积公式(叉乘计算)

        /**求凸包面积,{1/2*a*b*sin(c)} ==a,b两向量叉乘 */
        int area=0;
        for(int i=1;i<top;i++)
        {
            area+=cross(s[0],s[i],s[i+1]);
        }
        area=abs(area)/2;
世界地图矢量数据可以通过多种网站进行下载。以下是一些提供免费下载世界地图矢量数据的网站: 1. Open Street Map (https://www.openstreetmap.org/): 这个网站可以根据输入的经纬度或手动选定范围来导出目标区域的矢量图。导出的数据格式为osm格式,但只支持矩形范围的地图下载。 2. Geofabrik (http://download.geofabrik.de/): Geofabrik提供按洲际和国家快速下载全国范围的地图数据数据格式支持shape文件格式,包含多个独立图层,如道路、建筑、水域、交通、土地利用分类、自然景观等。数据每天更新一次。 3. bbbike (https://download.bbbike.org/osm/): bbbike提供全球主要的200多个城市的地图数据下载,也可以按照bbox进行下载。该网站还提供全球数据数据格式种类齐全,包括geojson、shp等。 4. GADM (https://gadm.org/index.html): GADM提供按国家或全球下载地图数据的服务。该网站提供多种格式的数据下载。 5. L7 AntV (https://l7.antv.antgroup.com/custom/tools/worldmap): L7 AntV是一个提供标准世界地图矢量数据免费下载的网站。支持多种数据格式下载,包括GeoJSON、KML、JSON、TopJSON、CSV和高清SVG格式等。可以下载中国省、市、县的矢量边界和世界各个国家的矢量边界数据。 以上这些网站都提供了世界地图矢量数据免费下载服务,你可以根据自己的需求选择合适的网站进行下载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值