凸包算法

30-凸包(Convex Hull) 文章目录凸包(convex hull)凸包(convex hull) 凸包(convex hull) 1、凸包概念; 2、API说明; 3、代码演示; convex : 凸面的,凸出的,凸多变形的; hull : 物体外壳; 凸包(convex hull) ... 阅读详情

                凸包

     今天看了一下凸包,自己理解的也不是很深,在这里说说自己的理解 


   凸包:在二维欧几里得空间中,凸包可想象为一条刚好包著所有点的橡皮圈。
      用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能          包含点集中所有的点。--百度百科

      
      这几个用蓝线连起来的红点就组成了一个凸包
                         
      
      

     如何求这个凸包呢


                1.首先我们先对这些点进行极角排序
                            
                         极角排序:找y最小的点,如果y最小的点有好几个,那就找x最小的点,相同的点排除掉,把这个点做为                     基点H,接下来所有的点针对该点的射线,按角度由小到大,若相同按距离由近到远来排序
                 
                  如何判断角度的大小,需要左转判定,假如有两个点p1,p2,求出向量<p1,H> (x1,y1)和<p2,H> (x2,y2),
                  如果 x1*y2-x2*y1>0 说明p1到p2左转    
                 
                            排序后应该是这样
     
             

       2.排完序,我们就可以从基点开始找凸包了(Graham算法)
                         1.把排完序的点p0,p1,p2入栈
                         2.判断p[i]与栈内的stack[top],stack[top-1],p[i]到stack[top]是否左转了,如果是,出栈,直到找到
                            p[i]相对于栈内没有左转的时候,把p[i]进栈

                           过程大概是这样的

        第一步  0 , 1 ,2入栈            第二步   1到3左转,2出栈

          
         第三步  1到4右转,4入栈           最后遍历完成,凸包形成
            

         
                          3.遍历完后stack里存的凸包的点,top+1代表点的个数
                          
                           
下面是代码
struct node
{
    long long x,y;
}q[51234],stack1[51234];
int n,top;
long long dist(node p1,node p2) //两点距离的平方
{
    return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
}
long long mult(node p1,node p2,node p0)  //判断是否左转
{
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int cmp(node p1,node p2)   //极角排序的比较函数
{
    if(mult(p1,p2,q[0])>0)
        return 1;
    else if(mult(p1,p2,q[0])==0 && dist(p1,q[0])<dist(p2,q[0]))  //相等的按距离近的
        return 1;
    return 0;
}
void Gramham()
{
    int i,k=0;
    for(i=0;i<n;i++)
    {
        if(q[i].y<q[k].y || (q[i].y==q[k].y && q[i].x<q[k].x)) //找y最小的点,y相等找x最小的点
        k=i;
    }
    node tep;
    tep=q[0];
    q[0]=q[k];
    q[k]=tep;
    sort(q+1,q+n,cmp);
    stack1[0]=q[0];
    stack1[1]=q[1];
    stack1[2]=q[2];
    top=2;
    for(i=3;i<n;i++)
    {
        while(top>1 && mult(q[i],stack1[top],stack1[top-1])>=0)  //是否左转,是继续判断,不是,就入栈
            top--;
        stack1[++top]=q[i];
    }
}
如有错误,望指出^_^


 
        


凸包算法(convex hull) 前言 今天学习了几何算法——凸包算法,听着名字很奇怪,不知道它是干什么的,但其实也很简单。下面来介绍一下这种凸包算法和其c++代码: 凸包算法 其实很简单,就是用一个的凸多边形围住所有的点。就好像桌面上有许多图钉,用一根紧绷的橡皮筋将它们全部围起来一样。算法详细步骤: 1. 找到所有点中纵坐标y最小的点,也就是这些点中最下面的点,记为p0。 2. 然后计算其余点与该点的连线与x轴之间夹角... 阅读详情

相关推荐

平面点集的凸包算法

平面点集的凸包算法 参考翻译自Dan Sunday的文章The Convex hull of a point set 凸包计算是计算集合中的一个经典问题。这一问题有许多变种,其中最普遍的形式是计算平面离散点集的最小凸集(称为“凸包”)。这一算法也可以用于多边形或者一组线段集的凸包求解。在许多领域中都需要用到凸包算法,例如:碰撞检测、消隐、形状分析等。 最流行的凸包算法是Graham扫描算法和P...

大鹏的blog 1万+

凸包问题的五种解法

前言: 首先,什么是凸包? 假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”。如下图: 然后,什么是凸包问题? 我们把这些点放在二维坐标系里面,那么每个点都能用 (x,y) 来表示。 现给出点的数目13,和各个点的坐标。求构成凸包的点? 解一:穷举法(...

baningtao1470的博客 3413

超详细的凸包问题的分治算法说明及C++实现

题目要求: 输入数字, 再输入点(x,y); 以顺时针方向输出最外侧的点, 使外侧的点组成的多边形能包含所有的输入点参考: &lt;算法设计与分析&gt; 第122-123页准备步骤: 首先, 将输入点按x轴从小到大排序, 如果x相同,则按y排序这时候, 我们就能得到p[0]和p[n-1]的直线, 将求解凸包问题分解为求解上凸包和下凸包两个问题.这里以上凸包为例, 我们要找到一个点Pmax, 使三...

EcsoBaby 1万+

Andrew算法(我确实不懂Graham)

先解释一下:这两个算法分别都是凸包问题的算法,然后Andrew是Graham的变种,速度更快,更稳定,非常优秀,介于我已经把Graham写的莫名其妙的WA了,所以我选择了这种算法! 我认为在这里,还是有必要向大家在这里先普及一下什么是凸包: 计算几何凸包 凸包:给你n个散落的点,让你求出最小的凸多边形将所有的点包括起来,或者点在边上。用到的算法是Graham或Andrew! 这里给...

Mudrobot的博客 1853

基于IDEA与Mill构建Windows下的Chisel开发环境——香山处理器源码解析实战

本文详细指导如何在Windows系统下使用IDEA集成开发环境和Mill构建工具搭建Chisel开发环境,并以香山处理器源码为实战案例进行解析。内容涵盖环境准备、源码获取、工程构建、IDEA配置优化及代码阅读技巧,帮助开发者高效学习硬件设计语言。

a1b2c3d的博客 717

Ubuntu下Ollama局域网共享大模型服务:5分钟搞定配置与防火墙设置

本文提供了一份在Ubuntu系统上快速配置Ollama实现局域网共享大模型服务的实战指南。通过修改服务配置使其监听所有网络接口,并设置UFW防火墙规则,用户可在5分钟内让同一Wi-Fi下的其他设备(如笔记本、手机)便捷调用主机上的AI模型能力,实现团队或多设备间的AI资源共享。

ik6789012的博客 825

计算几何入门 1.3:凸包的构造——增量构造法

极点法和极边法的复杂度分别为O(n^4)和O(n^3),当点集S的规模稍大时就难以适用了。为了满足实际需要必须寻找更高效的算法来构造凸包。 一、减治 在引入新算法之前首先来回顾一下经典的算法思想:减治(decrease and conquer),注意不是分治(divided and conquer),二者稍有区别。简单来讲就是将问题划分为一个个简单的小问题,减而治之,逐个求解,最终就能得到整个...

Housz的博客 2917

数据获取竟如此简单——全球SRTM 90m DEM V4.1数据

SRTM(Shuttle Radar Topography Mission)是由NASA联合国际合作伙伴开展的雷达地形测绘项目,通过航天飞机搭载的合成孔径雷达系统,于2000年通过发射并接收地表反射的雷达信号,获取全球三维地形数据,这一任务填补了高精度全球地形数据的空白。而本文通过十余行的python代码,就更简单、方便地获取这些数据。

m0_38065162的博客 1400

学习笔记:二维凸包-Andrew算法

感受到了,被几何搞得晕头转向的感觉 凸包应该算是计算几何中比较基础和常规的算法了。 顺着我的思路来,也许自己日后更好复习。 前置芝士 首先你需要一堆关于平面向量的芝士 斜率总要会吧 首先我们来看一个简单的问题: 一个平面上给你\(n\)个点,计算把\(n\)个点围起来的最小长度。 这是一个很经典的凸包问题。 那么什么是凸包呢? 大概就是题目中所讲述的那样,把给定点包围在内部的最小凸多边形。 怎么求...

weixin_30793643的博客 210

Python多进程实战:用BaoStock高效下载股票历史数据的5个优化技巧

本文详细介绍了使用Python多进程技术通过BaoStock高效下载股票历史数据的5个优化技巧。从理解BaoStock的数据获取机制到进程池配置、智能任务分片、异常处理及性能监控,帮助开发者显著提升数据下载效率,特别适合量化交易领域的数据采集需求。

weixin_30369041的博客 458

手把手教你用FPGA实现SerDes高速接口设计(附避坑指南)

本文是一份详尽的FPGA SerDes高速接口设计实战指南。文章深入剖析了SerDes硬核(如GTX/GTH)的时钟管理、发送端均衡、接收端CDR与均衡等核心模块,并提供了Verilog代码示例。重点分享了信号完整性分析、眼图调试与误码率测试等实战经验,附有自定义高速视频流接口的完整实现案例与避坑指南,帮助工程师从“会用”到“懂”且能独立驾驭高速接口设计。

ik678901234的博客 1146

凸包算法总结

一、定义: 凸包是一个相对于点集的概念,对于一个已经确定的点集,凸包就是由其中某些点构成的一个子集,这个子集中的点构成一个凸多边形,该多边形完全包围点集中所有点。 关于凸包有一个形象的比喻:把点集中各点看作钉子,拿一个橡皮筋套住所有的钉子,最终橡皮筋就是一个凸包,使橡皮筋绷紧的钉子就是凸包中的顶点。 二、求法: 目前比较常见的两种求法分别为Graham扫描法和Andrew算法,由于两个算法都需要对点进行排序,因此它们的时间复杂度均为O(nlogn)...

Cloth的博客 6706

Windows系统监控实战:Grafana+Prometheus+node_exporter配置全攻略

本文提供了一套完整的Windows系统监控解决方案,详细介绍了如何使用Grafana、Prometheus和node_exporter(Windows版为windows_exporter)构建可视化监控平台。从环境准备、组件安装配置,到数据可视化与常见问题排查,手把手指导您实现从数据采集到仪表盘展示的全过程,帮助您从被动救火转向主动预警,有效保障Windows服务器稳定运行。

assembly8low的博客 248

凸包算法详解

一些废话:写这篇博客是因为在听算法网课老师讲分治的时候提到过分治法求凸包的问题,当时没怎么听懂也没太在意这个(因为老师只是提了一嘴,没有细讲),结果好巧不巧,第二天力扣的每日一题就是凸包问题,题目在这:力扣 然后就想着好好学一下凸包算法,但因为我比较懒。。。立了计划后给这篇博客起了个头就没管了,直到几乎20天后,力扣的每日一题又又又有一题可以用凸包做,题目:力扣 所以我特意抽出一个下午好好看了一下各种凸包算法,写下了这篇博客。 注:一下算法均围绕力扣题目 587.安装栅栏 来讨论 前置知识: 设平

m0_54123999的博客 5139

ISO 21434汽车网络安全标准深度解读系列(十):标准实施总结与展望

ISO21434标准深度解读系列总结篇系统回顾了汽车网络安全标准的核心内容与实施要点。文章梳理了10篇系列文章的结构体系,提炼出标准的三大核心价值:系统性方法(全生命周期覆盖、多层次管理)、风险导向理念(威胁驱动、动态管理)和供应链协同机制。总结了实施经验中的关键要素,包括高层承诺、专业团队建设,并提出了分阶段实施路径建议。同时分析了当前面临的技术挑战(系统复杂性、新兴技术)和管理挑战(文化转变、资源投入)。最后展望了AI应用、零信任架构等技术发展趋势,以及标准未来的演进方向,为企业实施提供战略与执行层面的

VehSwHwDeveloper的博客 559

YOLO26改进策略【Neck】| CVPR 2024 MFM(Modulation Fusion Module,调制融合模块):动态特征加权融合,突出关键特征抑制冗余

本文主要利用DCMPNet中的 MFM 模块优化 YOLO26 的目标检测网络模型。模块通过动态调制特征融合过程,实现了对多尺度、跨层级特征的智能聚合。将其应用于的改进过程中,针对目标检测中边界特征与语义信息的互补性需求,缓解网络中浅层细节与深层语义融合不足的问题。Depth Information Assisted Collaborative Mutual Promotion Network for Single Image Dehazing在图像去雾网络中,不同层级和类型的特征包含着互补的信息(如浅层的

Limiiiing的博客 224

图形几何算法 -- 凸包算法

凸包是一个点集所包围的最小的凸多边形。可以想象用一根绳子围绕着一群钉子,绳子所形成的轮廓便是这些钉子的凸包。在计算几何中,凸包得到了广泛的应用,涉及领域包括模式识别、图像处理和优化问题等。

qq_32813921的博客 3250

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

凸包(Convex Hull)问题算法详解

参考:https://blog.youkuaiyun.com/Zhang_Chen_/article/details/102417129 前言: 首先,什么是凸包? 假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”。如下图: 然后,什么是凸包问题? 我们把这些点放在二维坐标系里面,那么每个点都能用 (x,y) 来表示。 现给出点的数目13,和各个点的坐标。求构成凸包的点? 概述: 凸包(Convex Hull)是一.

lemonxiaoxiao的博客 3万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

凸包 graham 算法

<!-- p {margin-bottom:0.21cm} --> 向量: 1.向量的内积(数量积,点乘): 公式:a· b = |a| * |b| cos=a.x* b.y + b.x * a.y 2.向量的外积(向量积,差乘): 公式

JAVASUI的专栏 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

CGAL笔记之凸包算法—3D凸包

CGAL笔记之凸包算法—3D凸包

younggung的博客 2662

凸包算法 Matlab实现

凸包算法 Matlab实现 内容参考 [https://blog.youkuaiyun.com/viafcccy/article/details/87483567](https://blog.youkuaiyun.com/viafcccy/article/details/87483567 n_points = 25; % total number of points points_source = generateRan...

west_gege的博客 6854

凸包——Andrew算法

凸包——Graham-Scan算法 Andrew算法 (复杂度nlogn) Andrew算法是一种基于水平序的算法,是Graham-Scan算法的一种变体,性能也更优, 只不过是扫描之前做的处理不同. 1:将所有的点按x坐标从小到大排序,横坐标相同则按y坐标从小到大排. 2:将p[1]和p[2]加入凸包,然后从p[3]开始判断,判断方式与Graham-Scan算法中一致. 3:将所有的点扫描一...

0ng的博客 4059

凸包问题的分治算法_凸包问题——快速凸包算法

快速凸包算法也可以看成是增量算法的一种变种,与随机增量算法相比,它们的不同就在于每次迭代从面的外部点集中选择的点不同。随机增量算法从外部点集中随机的选择一个点,但是快速凸包算法是选择距离最远的一个点,著名的开源代码Qhull[1]、 CGAL[2]都有快速凸包算法的C++实现。本篇文章介绍三维的快速凸包算法的原理和实现。基本思想在介绍快速三维凸包算法前,先介绍算法中会频繁使用到的两个基本的几何操作...

weixin_31880681的博客 1080

分治算法求解凸包问题

课堂记录,分治法解决凸包问题。

恭仔的博客 1万+
上一篇: POJ Beauty Contest 2187 (凸包)
下一篇: POJ The Embarrassed Cryptographer 2635 (数论)
K_y
K_y
博客等级 码龄10年 4粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值