凸包是啥??

凸包就是:

给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点。

外层的红线 就是凸包

一般题目会让你求利用最外层凸包的一些性质如下面这道题

来看一道模板题:HDU - 1348

本题题目就是要求尽可能少的围墙周长 围墙内的城堡是多边形的 而围墙还要和城堡相隔l距离

可证 实质周长其实就是 城堡的凸包周长 + 以l为半径的周长之和

由于多边形城堡 尽可能少的包围他其实就是凸包周长 而在凸包的拐角处 要相隔l距离 所以变成了一个圆弧

把圆弧加起来就是圆的周长

n边形的内角和公式 :(n-2)*180

n变形外角永远是360度

所以 可以列式 n×360 - (n-2)×180 -90×n×2 = 360° (n个角 减去内角 在减去多余的90° 画个图就能得到)

所以多出来的那些空间可知就是一个360°的整圆

关于这个方法就是先取左下点为基准点

然后 对其他点 按照从基准点的x轴逆时针方向射出的极角 扫过的顺序排序

然后再对其中的每前后三个点进行叉乘操作

如果我们以逆时针方向遍历所有点

n,m,l三个点 

n为起点 向m和l点做两个向量分别是向量a,向量b

向量a*b<0 说明 a在 b的逆时针方向  即是说 m点在l点里面,左边 若选凸包 我们舍弃a的终点m 而选取b的终点

若叉乘结果>0说明a在b的顺时针方向 也就是 m在l的外边 右边

最终将保存下来的点 按顺序遍历求两点之间的线段长度就可以了

code

#include<bits/stdc++.h>using namespace std;
typedef long long ll;
const int maxn = 1010;
const double pi = acos(-1.0);// 得到PI
struct node
{double x,y;
}p[1010],P[1010];//P内存储凸包内的店
int t,tot,N;
double L;
double X(node a,node b,node c)
{return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}// 计算叉积
double len(node a,node b)
{return sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
}//两点之间距离公式
bool cmp(node b,node c)
{double pp = X(p[1],b,c);if(pp<0)return 0;else if(pp>0)return 1;else if(pp==0&&len(p[1],b)<len(p[1],c))return 1;else return 0;
}//扫描排序
int main()
{scanf("%d",&t);for(int cas = 1;cas<=t;cas++){if(cas!=1)puts("");scanf("%d%lf",&N,&L);for(int i=1;i<=N;i++)scanf("%lf%lf",&p[i].x,&p[i].y);double ans = pi*2.0*L;for(int i=2;i<=N;i++){if(p[1].y>p[i].y)swap(p[1],p[i]);else if(p[1].y==p[i].y&&p[1].x>p[i].x)swap(p[1],p[i]);}//找基准点sort(p+2,p+1+N,cmp);P[1]=p[1];P[2]=p[2];tot=2;for(int i=3;i<=N;i++){while(tot>1&&X(P[tot-1],P[tot],p[i])<=0)tot--;tot++;P[tot] = p[i];}//筛选点for(int i=1;i<tot;i++){ans+=len(P[i],P[i+1]);}//围圈求和ans+=len(P[1],P[tot]);printf("%.0lf\n",ans);}return 0;
}

二维凸包 Graham's Scan相关推荐

  1. POJ4449(三维凸包+空间坐标旋转+二维凸包)

    题目:Building Design 题意: 题目就是给了一个凸多面题. 要把这个凸多面体放到地上,一个面要接触到地面. 求一种放法,使得最高点最高,最高点相同时使投影面积最小.输出最高点高度H和投影 ...

  2. 模板:二维凸包(计算几何)

    所谓凸包,就是一个凸出来的包 (逃) 前言 解析集合的第一课. 关键特征:周长最小.此时一定是凸包. 解析 定义 凸包:在平面上能包含所有给定点的最小凸多边形叫做凸包. 性质:凸包的周长是所有能包含给 ...

  3. P2742 [USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包

    P2742 [USACO5.1]圈奶牛Fencing the Cows /[模板]二维凸包 题目: 给定一些点,问围住所有点所用的围栏的长度 题解: 凸包模板题 凸包详细 代码: #include&l ...

  4. luogu P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows

    题解: 二维凸包裸题 按照x坐标为第一关键字,y坐标为第二关键字排序 然后相邻判断叉积用单调队列搞过去 正反都做一次就好了 代码: #include <bits/stdc++.h> usi ...

  5. P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows

    传送门 二维凸包的板子,抄yyb大佬的 //minamoto #include<bits/stdc++.h> #define rint register int #define inf 0 ...

  6. POJ 3348 Cows(二维凸包)

    题目链接:https://cn.vjudge.net/problem/POJ-3348 题意:有一些数,坐标已知,要用这些树作为篱笆的顶点圈一块多边形的地养牛,每头牛占地大小50,问最多能养多少头牛. ...

  7. 二维凸包(模板) hdu 1348 求凸包的周长

    题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1348 凸包模板: const int N =1010; const double PI = 3.141 ...

  8. Graham扫描法求解二维凸包问题

    最近在LeetCode的每日一题和实验中接连遇到凸包问题,因为之前从来没写过,于是写这篇博客记录一下,内容部分参考每日一题的官方题解和算法导论.算法的具体描述以及代码实现多为个人理解,如有谬误还请指出 ...

  9. Matlab 二维凸包计算(内置函数)

    文章目录 一.简介 二.实现代码 三.实现效果 参考资料 一.简介 Matlab中的凸包算法不同于很经典的Graham算法,它采用的是Delaunay三角剖分的方式来获取凸包,这里也进行记录一下. 二 ...

最新文章

  1. 如何用matlab读取npz文件,Python Numpy中数据的常用的保存与读取方法
  2. puppet recurse 导致的性能问题一例
  3. 那些重要却容易被忽视的用户体验(五)
  4. 把DXF导入到Altium Designer的完美方法
  5. mosquitto mysql_在laravel中使用Mosquitto-PHP
  6. TCP UDP IP
  7. javaEE项目发布方法
  8. flex布局怎么设置子元素大小_Web前端(三):前端布局
  9. 有了这个开源项目,再也不怕去BAT和字节跳动面试考算法了
  10. (转)c# Invoke和BeginInvoke区别
  11. SQL Server 中WITH (NOLOCK)
  12. 电子设计大赛-仪器仪表类题目分析
  13. 马哥linux多道处理程序,马哥linux课堂笔记
  14. Ubuntu16.04 安装 卸载 pip
  15. echarts南丁格尔玫瑰图
  16. linux超时设置函数,I/O操作上设置超时之alarm闹钟法
  17. vue3的逻辑复用抽离
  18. 五大电子邮件的营销方法,教你提高客户的回头率!
  19. 微波放大器和混频器的测试
  20. PostgreSQL 各种查询

热门文章

  1. Ubuntu彻底删除MySQL重装MySQL
  2. Oracle Explain Plan,hint解释与示例
  3. onCreateOptionsMenu
  4. 烙饼啊烙饼{转自ITEO
  5. SAP 那点事BW HANA
  6. maven项目发布到tomcat里lib包没有发布的问题
  7. cesium根据输入高度设置相机camera视角高度
  8. nginx负载分发情况日志输出
  9. C#图片按指定大小分割
  10. flash调用摄像头弹出设置框监听