凸包 +模板

[机器学习][三维重建] 凸包算法——Graham扫描 凸包的严格数学定义比较复杂,这里只针对二维情况,因此用通俗的话来解释二维凸包:给定二维平面上的点集,凸包就是能够围住这些点的最小的凸多边形。 Graham扫描法就是在给定点集的情况下,找到这么一个凸包的最常用的算法,时间复杂度是 O(nlogn)O(nlogn)O(nlogn),其中 nnn 是点集内点的总数。 算法步骤大致如下: 1.找到凸包最左下角的顶点作为起点 startstartstart,如上图中的 p0p_0p0​。寻找方法非常简单,找到点集中纵坐标最小的点,如果有多个点,再在其中找到横坐标 阅读详情

凸包有很多方法 而这里为只介绍Graham 扫描法
时间复杂度为 O(nlogn)
思路:Graham扫描的思想和Jarris步进法类似,也是先找到凸包上的一个点,然后从那个点开始按逆时针方向逐个找凸包上的点,但它不是利用夹角。
这里写图片描述
步骤:

  1. 把所有点放在二维坐标系中,则纵坐标最小的点一定是凸包上的点,如图中的P0。
  2. 把所有点的坐标平移一下,使 P0 作为原点,如上图。
  3. 计算各个点相对于 P0 的幅角 α ,按从小到大的顺序对各个点排序。当 α 相同时,距离 P0 比较近的排在前面。例如上图得到的结果为 P1,P2,P3,P4,P5,P6,P7,P8。我们由几何知识可以知道,结果中第一个点 P1 和最后一个点 P8 一定是凸包上的点。
    (以上是准备步骤,以下开始求凸包)
    以上,我们已经知道了凸包上的第一个点 P0 和第二个点 P1,我们把它们放在栈里面。现在从步骤3求得的那个结果里,把 P1 后面的那个点拿出来做当前点,即 P2 。接下来开始找第三个点:
  4. 连接P0和栈顶的那个点,得到直线 L 。看当前点是在直线 L 的右边还是左边。如果在直线的右边就执行步骤5;如果在直线上,或者在直线的左边就执行步骤6。
  5. 如果在右边,则栈顶的那个元素不是凸包上的点,把栈顶元素出栈。执行步骤4。
  6. 当前点是凸包上的点,把它压入栈,执行步骤7。
  7. 检查当前的点 P2 是不是步骤3那个结果的最后一个元素。是最后一个元素的话就结束。如果不是的话就把 P2 后面那个点做当前点,返回步骤4。
    最后,栈中的元素就是凸包上的点了。
    以下为用Graham扫描法动态求解的过程:
    这里写图片描述

模板(用数组模拟 毕竟数组要比栈好进行操作):

#include <bits/stdc++.h>

using namespace std;

const int N=1e4;
double xx,yy;
typedef struct P
{
    double x,y;
}P;
P p[N],s[N];


double compare(P a,P b,P c)  //叉积
{
    return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}

bool cmp(P a,P b)  //排序函数根据这个规则排序
{
    P c;
    c.x=xx;
    c.y=yy;
    if(compare(c,a,b)==0)
        return a.x<b.x;
    else
        return compare(c,a,b)>0;
}

double bian(P a,P b)  //求边的长度
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(b.y-a.y)*(b.y-a.y));
}

int main()
{
    int n;
    while(cin>>n&&n)
    {
        int k;
        int top=1;
        yy=1e9;
        for(int i=0;i<n;i++)
        {
            cin>>p[i].x>>p[i].y;
            if(yy>p[i].y)  //找y最小的点 将其作为极点
            {
                yy=p[i].y;
                xx=p[i].x;
                k=i;
            }
        }
        p[k]=p[0];
        sort(p+1,p+n,cmp);  //极角排序
        s[0].x=xx;
        s[0].y=yy;
        s[1]=p[1];
        for(int i=2;i<n;)
        {
            if(top&&(compare(s[top-1],s[top],p[i])<0))
                top--;
            else
                s[++top]=p[i++];
        }
       double ans1=0;
        for(int i=0;i<=top;i++)    //遍历求构成三角形最大的面积
            for(int j=i+1;j<=top;j++)
               for(int k=j+1;k<=top;k++)
               ans1=max(ans1,compare(s[j],s[k],s[i]));
        printf("%.2lf\n",0.5*ans1);
       /* double  ans[N];   // 求凸多边形周长
        s[++top]=s[0];
        for(int i=0; i<top; i++)
            ans[i]=bian(s[i],s[i+1]);
        double sum=0;
        for(int i=0; i<top; i++)
         {
            sum+=ans[i];
         }
         printf("%.2lf\n",sum);*/
}
    return 0;

}
平面(二维)凸包&&luoguP2742 【模板】二维凸包 凸包、Andew算法介绍及一个求凸包周长模板题的Code 阅读详情

相关推荐

关于并网继电器的继电器自检逻辑及实现方式

对于常规的光伏并网逆变器来说,继电器控制至关重要。继电器一般位于逆变电感后,共模电感前,用于将逆变电压与电网电压脱开,一般国外有双继电器的安规强制认证要求,国内目前只需要单继电器要求(后续应该会有双继电器要求,个人感觉)

weixin_29982209的博客 2612

opencv学习6:凸包算法详解及代码示例

简介 凸包(Convex Hull)是一个计算几何(图形学)中的概念。 在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。X的凸包可以用X内所有点(X1,...Xn)的线性组合来构造. 在二维欧几里得空间中,凸包可想象为一条刚好包著所有点的橡皮圈。 用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点。 ...

weixin_42713739的博客 1833

手把手教你搞定国民技术N32G031的Keil开发环境(附Pack包和JLink配置)

本文详细指导如何搭建国民技术N32G031的Keil开发环境,包括Keil MDK安装与激活、Pack包导入、JLink调试器配置等关键步骤。特别针对新手常见问题提供解决方案,帮助开发者快速上手N32G031系列MCU的开发工作。

cuangu9341的博客 421

凸包模板讲解

凸包模板Andrew算法处理方向顺序步骤代码(模板) Andrew算法 Andrew算法是Graham算法的变种。 其主要思想为把凸包上的点依次放入栈中, 如果发现形成了凹多边形(叉积为负值) 就删除一些点,使得又能够维持凸的形态。 这时就会发现,处理各个点需要按照x从左往右的顺序,排序即可 当然,这只是处理了下凸的一个凸壳,倒过来再刷一次,就得到了整个凸包 处理方向顺序 处理壳的方向为下半壳从左到右,上半壳从右到左。 步骤 1、先把点排序 x从小到大,x相等y从小到大 2、先把第一个点和第二个点加入栈中,

weixin_48673014的博客 538

隐藏技巧!用ArcGIS Pro像素编辑器实现PS级影像编辑(附地貌伪装案例)

本文深入探讨ArcGIS Pro像素编辑器的创意应用,从基础操作到高级影像处理实战,展示了其在城市规划、环境分析等领域的独特价值。通过详细的功能解析和地貌伪装等案例,帮助用户实现媲美专业图像处理软件的精细操作,提升GIS工作效率。

weixin_28520495的博客 335

时序基础模型Timer-S1:十亿参数如何革新时间序列预测

时间序列预测是数据分析与机器学习中的核心任务,旨在基于历史数据预测未来趋势。其原理在于捕捉数据中的趋势、周期性和季节性等时序依赖关系。这项技术的价值在于赋能业务决策,广泛应用于金融风控、能源管理、物联网监控和供应链优化等关键场景。传统方法依赖针对特定任务的专用模型,面临泛化能力弱和开发成本高的挑战。本文聚焦的时序基础模型,通过在海量跨领域数据上进行预训练,学习时序通用模式,并结合十亿级参数带来的强大容量,实现了性能的显著突破。这种范式转变,使得模型能够像“全科医生”一样,通过少量数据微调即可快速适应新任务,

weixin_29164843的博客 268

凸包模板

凸包 描述 给定n个二维平面上的点,求他们的凸包。 输入 第一行包含一个正整数n。 接下来n行,每行包含两个整数x,y,表示一个点的坐标。 输出 令所有在凸包极边上的点依次为p1,p2,…,pm(序号),其中m表示点的个数,请输出以下整数: (p1 × p2 × … × pm × m) mod (n + 1) 样例1输入 10 7 9 -8 -1 -3 -1 1 4 -3 9 6 -4 7 5 6...

weixin_43829465的博客 396

28、基于图像快速序列视觉呈现(RSVP)的脑机接口特征提取与分类算法综述

本文综述了基于图像快速序列视觉呈现(RSVP)的脑机接口(BCI)中的特征提取与分类算法。RSVP技术通过快速连续呈现图像序列,结合脑电图(EEG)信号分析,实现对目标图像的识别和标记。文章详细介绍了RSVP实验的设计、EEG数据的采集与预处理,并探讨了低信噪比、维度灾难、重叠epoch和不平衡数据集等挑战。针对特征提取,讨论了有监督空间滤波方法(如CSP、xDAWN、LDA波束形成器)的原理和应用。在分类策略部分,涵盖了线性分类技术(如LDA、BLR、LR、SVM)和非线性分类方法(如MLP、CNN)。文

hh234的博客 336

Graham扫描法求点集凸包的原理及代码实现

Graham扫描法求点集凸包的原理及代码实现

bwju的专栏 3245

华为OD机试 - 压缩日志查询(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。某设备需要记录每分钟检测到的指标值。为了节约存储空间,将连续相同指标值的记录合并。压缩之前:202411231000,11 202411231001,11 202411231002,12 202411231003,12 202411231004,

学Java,找哪吒 1878

怎样让你的论文看起来“像人写的”?只用三招直接去除AI味(附提示词)

当然如果你在实际使用中还有其他需求,比如降重润色、改写翻译等,也可以结合七哥的专业写作平台来辅助,这个高级学术平台已经内置了ChatGPT4o、ChatGPT4.1、Claude3.7、满血版DeepSeek-R1等AI大模型,帮你写文献综述、干课题申报、写论文等学术任务绝对每一点问题。比如我自己的一套学术写作平台,其中的“降重与润色”模块整合了多种GPTs应用,除了能帮助调整语言风格、避免雷同表达,还可以顺带降个重,对于提升学术文本的整体质量还是非常有用的。一、为什么用AI写出来的文章会有AI味?

智能AI让学术科研更容易 1682

[洛谷2742]凸包模板

洛谷2742 凸包模板 Code: #include&lt;bits/stdc++.h&gt; #define db double using namespace std; inline int read(){ int res=0,f=1;char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();} while...

romiqi 470

一文搞定 ST22 短转储 MEMORY_NO_MORE_PAGING:看懂 SAP Paging 机制,参数 rdisp/PG_SHM 与 rdisp/PG_MAXFS 怎么设才稳

SAP系统MEMORY_NO_MORE_PAGING错误通常源于Paging资源耗尽而非物理内存不足。关键排查点包括:通过ST22确认错误类型,ST02监控Paging使用情况,检查工作进程trace中的"no more free blocks"提示。解决方案建议将rdisp/PG_SHM和rdisp/PG_MAXFS设为相同值(如250000块≈2GB),使Paging完全在内存中运行。同时需优化易耗Paging的代码逻辑,如避免滥用EXTRACT命令和超大内存对象传输。典型案例如月末

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 331

凸包(Andrew算法模板)

凸包模板 [SHOI2012\] 信用卡凸包

ZZZS0516的博客 574

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

凸包Graham模板,凸包点的坐标,凸包周长面积

1 凸包Graham模板 作用:给出一些点,输出这些点里参与构成凸包的点的坐标 https://blog.youkuaiyun.com/zezzezzez/article/details/75039907 里面有这个模板原理的详细介绍 2 先求出凸包再求出其面积的题代码(包含Graham并求出了凸包的面积) http://www.cnblogs.com/ccccnzb/p/3902394.html ...

婳儿的博客 702

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

凸包模板:Andrew算法

【代码】凸包模板:Andrew算法。

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 237

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

POJ 3528 三维凸包模板

#include #include #include #include using namespace std; #define inf 0x7fffffff #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) #define eps 1e-7 #define MAXV 505 //三维点 struct pt { doubl

Christine的专栏 1180

OI模板 凸包

OI模板 凸包 凸包-Andrew const int N=1; const double eps=1e-8; int is0(double x){return (fabs(x)<eps?0:(x<0)?-1:1);} struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){} Point operator+(Point b){return Point(x+b.x,y+b.y);} Point op

im_zyINF的博客 206

【模板】凸包

开始挑起计几大梁了。 先开始学凸包,找了道凸包模板题。 poj1113 模板参考了kuangbin的。 1 /************************************************************************* 2 > File Name: hdu1348.cpp 3 # File Name: hdu13...

weixin_30952535的博客 75

凸包Graham模板

参考博客:http://blog.youkuaiyun.com/yangkunpengd/article/details/51336453 http://www.yalewoo.com/in_triangle_test.html 先说我对找凸包上的点时的理解: P,A,B三个点,通过叉乘可以得知P,A,B的位置关系 AB × AP = |AB| * |AP| * sin∠PAB. 方向是A到B,A到P

zezzezzez的博客 1973

三维凸包模板

三维凸包模板 #include #include #include #include #include #include using namespace std; const int MAXN=505; const double EPS=1e-8; struct Point { double x,y,z; Point(){} Point(doub

程序员的冷浪漫 1245

luoguP2742 【模板】二维凸包 / [USACO5.1]圈奶牛 二维凸包

luoguP2742 【模板】二维凸包 / [USACO5.1]圈奶牛 二维凸包 既好写,又好调 Code: #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #define maxn...

EM LGH 155

【凸包模板】POJ3348 Cows

【题目描述】 传送门 【代码】 凸包模板 #include<bits/stdc++.h> using namespace std; const int N=1e5+10; struct Point{ double x,y; }a[N],s[N]; int n,top=1; double ans=0,t; inline double check(Point a1,Point a...

qq_42754826的博客 167

凸包进阶旋转卡壳(模板题目集)

很明显从一开始,b+1的点一定是要大于b点(0),所以从一开始,b就被推到了i-j的上面,也就是左侧,,,很明显成为了正数;// 找到边 st[i]-st[i+1] 对应的最远点 st[j]//众所周知,叉乘是两向量的对应平行四边形的面积。

ysa051030的博客 830
上一篇: 极角排序(主要用于凸包问题)
下一篇: pick定理
Puppet__
博客等级 码龄9年 319粉丝 328原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值