二维凸包 Graham扫描算法
题目链接:
http://poj.org/problem?id=1113
求下列点的凸包

求得凸包如下:

Graham扫描算法:
找出最左下的点,设为一号点,将其它点对一号点连线,按照与x轴的夹角大小排序:

让点1,2入栈,从第三个点开始循环
步骤1:判断该点是否在栈顶第二个点和栈顶的点的连线的左边,
2.如果在左边,将该点入栈,继续循环,
3.如果不在,弹出栈顶点,重复步骤1,

3在1,2连线左边,3入栈

4在2,3连线左边,4入栈

5不在3,4连线左边,4出栈,5在2,3连线左边,5入栈

6在3,5连线左边,6入栈

7不在5,6连线左边,6出栈,7在3,5连线左边,7入栈

遍历完成后,将栈顶与1连起来就完成了
代码
//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define NEW(a,b) memset(a,b,sizeof(a))
#define lowbit(x) ((x)&(-x))
using namespace std;
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const int maxn=4e4+;
typedef long long LL;
typedef unsigned long long ULL;
const LL mod=1e9+;
const ULL base=1e7+;
struct Point{
int x,y;
bool operator<(Point &u){//坐标排序
if(x!=u.x) return x<u.x;
return y<u.y;
}
};
Point vex[maxn],Stack[maxn],Basis;
short checkL(Point p,Point q,Point s){//判断点s是否在直线pq的左侧
int area2=p.x*q.y-p.y*q.x+q.x*s.y-q.y*s.x+s.x*p.y-s.y*p.x;
if(area2>) return ;//表示在左侧
if(area2==) return ;//表示在同一条线上;
return -;//表示在右侧
}
double dis(Point u,Point v){//计算uv的距离
return sqrt((u.x-v.x)*(u.x-v.x)*1.0+(u.y-v.y)*(u.y-v.y));
}
bool cmp(Point a,Point b){//极角排序
short m=checkL(Basis,a,b);
if(m==) return ;//b在基点与a的连线的左侧,说明b的极角大于a
if(m==&&dis(Basis,a)<=dis(Basis,b))//极角相同时,靠近基点的排在前
return ;
return ;
}
int main(){
cin.tie();
cout.tie();
int n,l;
cin>>n>>l;
for(int i=;i<n;i++){
cin>>vex[i].x>>vex[i].y;
}
sort(vex,vex+n);
Basis=vex[];//选第一个点为基点
sort(vex+,vex+n,cmp);
int top=;
Stack[top]=vex[];
Stack[++top]=vex[];
for(int i=;i<n;i++){
while(top>=&&checkL(Stack[top-],Stack[top],vex[i])<){
top--;
}
Stack[++top]=vex[i];
}
double sum=0.0;
for(int i=;i<top;i++){
sum+=dis(Stack[i],Stack[i+]);
}
sum+=dis(Stack[top],Stack[]);
sum+=2.0*pi*l;
LL ans=(LL)sum;
if(sum-(double)ans>=0.5){
ans++;
}
cout<<ans<<endl;
system("pause");
return ;
}
二维凸包 Graham扫描算法的更多相关文章
- 【计算几何】二维凸包——Graham's Scan法
凸包 点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内.右图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包. 一组平面上的点, ...
- 计算几何 二维凸包问题 Andrew算法
凸包:把给定点包围在内部的.面积最小的凸多边形. Andrew算法是Graham算法的变种,速度更快稳定性也更好. 首先把全部点排序.依照第一keywordx第二keywordy从小到大排序,删除反复 ...
- Andrew算法求二维凸包-学习笔记
凸包的概念 首先,引入凸包的概念: (有点窄的时候...图片右边可能会被吞,拉开图片看就可以了) 大概长这个样子: 那么,给定一些散点,如何快速地求出凸包呢(用在凸包上的点来表示凸包) Andrew算 ...
- 使用Graham扫描法求二维凸包的一个程序
#include <iostream> #include <cstring> #include <cstdlib> #include <cmath> # ...
- POJ 2187 旋转卡壳 + 水平序 Graham 扫描算法 + 运算符重载
水平序 Graham 扫描算法: 计算二维凸包的时候可以用到,Graham 扫描算法有水平序和极角序两种. 极角序算法能一次确定整个凸包, 但是计算极角需要用到三角函数,速度较慢,精度较差,特殊情况较 ...
- Luogu P2742 模板-二维凸包
Luogu P2742 模板-二维凸包 之前写的实在是太蠢了.于是重新写了一个. 用 \(Graham\) 算法求凸包. 注意两个向量 \(a\times b>0\) 的意义是 \(b\) 在 ...
- android 二维码生成+扫描
android 二维码生成+扫描 1.在Android应用当中,很多时候都要用到二维码扫描,来避免让用户手动输入的麻烦. Google官方自己推出了一个二维码开源项目:ZXing库. 2.这里简单介绍 ...
- UVA 10652 Board Wrapping(二维凸包)
传送门 刘汝佳<算法竞赛入门经典>P272例题6包装木板 题意:有n块矩形木板,你的任务是用一个面积尽量小的凸多边形把它们抱起来,并计算出木板占整个包装面积的百分比. 输入:t组数据,每组 ...
- ios中二维码的使用之二: 二维码的扫描
二维码的扫描: 1,导入支持框架,<AVFoundation/AVFoundation.h> 2 ,扫描:
随机推荐
- Apache Hive处理数据示例
继上一篇文章介绍如何使用Pig处理HDFS上的数据,本文将介绍使用Apache Hive进行数据查询和处理. Apache Hive简介 首先Hive是一款数据仓库软件 使用HiveQL来结构化和查询 ...
- C语言笔记变量与数据类型
目录 1.转义字符 2.常量与变量 2.1 什么是常量和变量 2.2 内存 2.3 变量的内存机制 2.4 变量命名规则 2.5 变量的定义 2.6 常量的定义 2.7 计算机内存字节顺序 2.8 局 ...
- easyui datagrid去掉全选按钮
第一步: F12查看元素,选中全选按钮,把全选按钮的class里边加上display:none属性.找到对应的class,即.datagrid-header-check. 第二步: 在加载 表格的时候 ...
- jsp/servlet环境搭建
手动配置servlet开发环境: 1. eclipse.tomcat.jdk下载安装: 2. eclipse新建项目,项目依赖tomcat的jar包(包含tomcat和servlet相关jar包)以及 ...
- Dynamics CRM Publisher
如果你想创建并且部署一个solution(解决方案),你需要创建一个publisher. 当准备创建一个solution并且创建entity field, relationship在这个solutio ...
- oData 排序字段生成
跟踪SQL 发现生成的SQL中所有的字段都进行了排序,查看OData原代码,发现如果实体有Key,就按照Key asc 加上指定字段进行排序 属性 EnsureStableOrdering可以控制是否 ...
- 后台自动运行,定期记录定位数据(Hbuilder监听 app由前台切换到后台、切换运行环境的 监听方法)
http://ask.dcloud.net.cn/question/28090 https://blog.csdn.net/qq_37508970/article/details/86649703 各 ...
- Can't parse message of type "gazebo.msgs.Packet" because it is missing required fields: stamp, type
在gazebo的仿真环境中,采用强化学习HER算法训练baxter执行reach.slide和pick and place任务. 运行HER算法,此时尚未启动gazebo仿真环境,出现如下报错: [l ...
- Padavan老毛子固件:17CE插件集成
Padavan老毛子固件:17CE插件集成 1.老毛子路由设置:系统管理-服务-启动SSH服务器 以下链接下载 "winscp" http://down.orsoon.co ...
- mosquitto centos安装配置
周末弄wordpress的Mysql,一不小心把wordpress弄不好了,写了的好几遍文章也没有了,一怒之下,把整个系统重装了,安装了不带任何软件的新系统,重新搭一遍. 0.安装ftp服务器 #yu ...