二维凸包 Graham's Scan

凸包是啥??

凸包就是:

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


外层的红线 就是凸包


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

来看一道模板题: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;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leedcode][JAVA][第300题][最长上上子序列][动态规划][压缩空间]

【问题描述】[中等] 给定一个无序的整数数组&#xff0c;找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101]&#xff0c;它的长度是 4。 说明:可能会有多种最长上升子序列的组合&#xff0c;你只需要输出对应的…

html:(38):元素分类和块级元素

元素分类 在讲解CSS布局之前&#xff0c;我们需要提前知道一些知识&#xff0c;在CSS中&#xff0c;html中的标签元素大体被分为三种不同的类型&#xff1a;块状元素、内联元素(又叫行内元素)和内联块状元素。 常用的块状元素有&#xff1a; <div>、<p>、<h1…

html:(39):块级元素和内联块级元素

元素分类--内联元素 在html中&#xff0c;<span>、<a>、<label>、 <strong> 和<em>就是典型的内联元素&#xff08;行内元素&#xff09;&#xff08;inline&#xff09;元素。当然块状元素也可以通过代码display:inline将元素设置为内联元素。…

[剑指offer][JAVA]面试题第[15]题[二进制中1的个数][位运算]

【问题描述】[简单] 请实现一个函数&#xff0c;输入一个整数&#xff08;无符号数&#xff09;&#xff0c;输出该数二进制表示中 1 的个数。例如&#xff0c;把 9 表示成二进制是 1001&#xff0c;有 2 位是 1。因此&#xff0c;如果输入 9&#xff0c;则该函数输出 2。示例…

极角排序的几种方法

转载自http://www.cnblogs.com/aiguona/p/7248311.html&#xff01;&#xff01; 关于极角排序&#xff1a; 在平面内取一个定点O&#xff0c;叫极点&#xff0c;引一条射线Ox&#xff0c;叫做极轴&#xff0c;再选定一个长度单位和角度的正方向&#xff08;通常取逆时针方向&a…

[剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]

【问题描述】[中等] 实现函数double Power(double base, int exponent)&#xff0c;求base的exponent次方。不得使用库函数&#xff0c;同时不需要考虑大数问题。示例 1:输入: 2.00000, 10 输出: 1024.00000 示例 2:输入: 2.00000, -2 输出: 0.25000 解释: 2-2 1/22 1/4 0.…

玩转oracle 11g(50):rman备份脚本

D盘新建一个文件夹backup_file&#xff0c;里面新建一个文件夹logs 一个文件叫auto_full_one_rman.bat 修改这三处 set oracle_sidwiicare rman cmdfile D:/backup_file/level_full_one_rman.rman msglog D:/backup_file/logs/full_one_%date:~0,4%%date:~5,2%%date:~8,2%…

Java学习笔记7-2——注解与反射

目录理解 Class 类并获取 Class 实例Class类获取 Class 类的实例哪些类型可以有Class对象所有类型的Class对象从内存角度分析类加载【重点】类加载的过程什么时候会发生类的初始化类加载器获取运行时类的完整结构有了Class对象能做什么性能对比分析通过反射操作泛型通过反射操作…

python实战学习之matplotlib绘图续

学习完matplotlib绘图可以设置的属性&#xff0c;还需要学习一下除了折线图以外其他类型的图如直方图&#xff0c;条形图&#xff0c;散点图等&#xff0c;matplotlib还支持更多的图&#xff0c;具体细节可以参考官方文档&#xff1a;https://matplotlib.org/gallery/index.htm…

Spring MVC面试题

目录概述什么是Spring MVC&#xff1f;简单介绍下你对Spring MVC的理解&#xff1f;Spring MVC的优点核心组件Spring MVC的主要组件&#xff1f;什么是DispatcherServlet什么是Spring MVC框架的控制器&#xff1f;Spring MVC的控制器是不是单例模式,如果是,有什么问题,怎么解决…

5.应用服务器简介

应用服务器简介 Tomcat

NOI-砝码称重v2 多重背包 生成函数

描述 设有1g、2g、3g、5g、10g、20g的砝码各若干枚&#xff08;其总重<100,000&#xff09;&#xff0c;要求&#xff1a;计算用这些砝码能称出的不同重量的个数&#xff0c;但不包括一个砝码也不用的情况。 输入 一行&#xff0c;包括六个正整数a1,a2,a3,a4,a5,a6&#x…

数字图像与数字图像处理

数字图像与数字图像处理 1、基本概念 &#xff08;1&#xff09;图&#xff1a;是物体反射或者透射电磁波的分布。 &#xff08;2&#xff09;像&#xff1a;是人的视觉系统对接收的图信息在大脑 中形成的印象。 &#xff08;3&#xff09;图像(image)&#xff1a;是“图”和…

[剑指offer][JAVA]面试题第[46]题[把数字翻译成字符串][递归][逆推]

【问题描述】[中等] 给定一个数字&#xff0c;我们按照如下规则把它翻译为字符串&#xff1a;0 翻译成 “a” &#xff0c;1 翻译成 “b”&#xff0c;……&#xff0c;11 翻译成 “l”&#xff0c;……&#xff0c;25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函…

前端基础1——HTML5

目录初识HTML网页基本标签列表表格视频和音频页面结构内联框架表单语法初识HTML Hyper Text Markup Language&#xff08;超文本标记语言&#xff09; <!--DOCTYPE&#xff1a;告诉浏览器使用什么规范&#xff08;默认是html&#xff09;--> <!DOCTYPE html> <…

数字图像处理系统组成 及研究内容

数字图像处理系统组成 及研究内容 .数字图像处理系统的组成 基本图象处理系统的结构 图像输入设备 扫描仪分辨率与扫描图象的大小 分辨率&#xff1a;单位长度上采样的像素个数DPI(dot/inch) 图像输出设备 喷墨打印机 激光打印机 数字印刷机 .图像处理技术研究的内容 图…

[剑指offer][JAVA]面试题第[18]题[删除链表的节点]

【问题描述】[中等] 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。返回删除后的链表的头节点。注意&#xff1a;此题对比原题有改动示例 1:输入: head [4,5,1,9], val 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点&#xff0…

Python3 循环

L [Bart, Lisa, Adam] for i in L:print("这是for循环的" "输出 hello:" i.upper())i 0 while i < len(L):print("这是while 循环的输出 hello:" L[i])i i 1转载于:https://www.cnblogs.com/RHadoop-Hive/p/10432219.html

前端基础2——CSS3

目录什么是CSSCSS的导入方式选择器美化网页元素盒子模型浮动定位什么是CSS Cascading Style Sheet 层叠级联样式表 CSS&#xff1a;表现层&#xff08;美化网页&#xff09; 字体&#xff0c;颜色&#xff0c;边距&#xff0c;高宽&#xff0c;背景图片&#xff0c;网页定位&…

前端基础3-1——JavaScript

目录什么是JavaScript快速入门引入JavaScript数据类型和基本语法入门1.变量2.number3.字符串4.布尔值5.逻辑运算6.比较运算符7.浮点数8.数组9.对象10.流程控制11.Map和Set集合严格检查模式use strict函数定义函数变量的作用域方法什么是JavaScript 概述 JavaScript是一门世界上…