凸包详解

article/2025/7/5 9:44:10

首先讲解一下凸包的概念

用比较抽象的说就是:

在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。X的凸包可以用X内所有点

(X1,...Xn)的凸组合来构造.

简单来说:

给你一个点集Q,你可以把Q中的每个点想象成一块木板上的铁钉,而点集Q的凸包就是包围了所有铁钉的一条拉紧

了橡皮绳所构成的形状;

如图:

求凸包可以用Craham扫描法,它用了一种叫"旋转扫除"的技术;

在讲解这个算法之前,我先来介绍几个计算几何概念;

—————————————————————————————————————————

叉积:(在这里只讨论在二维平面的时候)

在二维平面中存在向量p1和p2,他们的叉积等于由向量p1和向量p2构成的平行四边形的面积。

 

若p1为(x1,y1),p2为(x2,y2);那么p1 * p2 = x1 * y2 - x2 * y1;(注意顺序不能变);

叉积的性质:

1:得到两个向量之间的顺逆关系:

若p1 * p2 >0,则p1在p2的顺时针方向;

若p1 * p2 <0,  则p1在p2的逆时针方向;

若p1 * p2 = 0, 则p1和p2共线(有可能同向,有可能反向);

如上图,p1 * p2 > 0,则p1在p2的顺时针时针方向;

 

2:确定一个角的转向:

 

如图有两角<p0p1p2和角<p0p1p2;

为了好区分我们把第一个角叫做<a,第二个角叫<b;

为了判断角的转向,我们需要判断向量p0p1在p0p2的逆时针方向还是顺时针方向(如图)

如果p0p1在p0p2的顺时针方向,则角是向左转,如<a;

如果p0p1在p0p2的逆时针方向,则角是向右装,   如<b;

总结一下就是对于角<p0p1p2,如果p0p1 * p0p2 < 0,则该角向左转;

                                              如果p0p1 * p0p2 > 0,则该角向右转;

注意p0必须在最下面(也就是p0的y坐标必须是三个点中最小的)

 

基于这个基本的规律我们就能求出一个点集的凸包

以下是求凸包的过程。

————————————————————————————————————

观察凸包我们能发现凸包上的每一个点与它相邻点构成的角都是向左转的;

我们把相邻的左转角连成的不封闭图形叫做凸壳(如下图)

图一,图二是凸壳,图三不是凸壳。

可以看出求凸包的过程就是一个不断维护凸壳的过程。

我们可以借助栈这个结构来维护凸壳。

第一步我们要对这些点按极角的大小进行排序

        我们首先选择最左下的那个点作为原点(参照点),之后按极角大小排序,(小的在前)

        如果极角相等的话就按距离远近排序,(近的在前);

二步用栈维护这个凸壳,直到形成一个封闭图形为止

代码如下:

#include<stdio.h>
#include<algorithm>
#include<math.h> 
using namespace std;
const int INF = 50005;struct node 
{double x,y;
};node data[INF];node res[INF];				//数组模拟栈(这里如果用stl自带的栈会比较麻烦) double Graham(node* data,node* res, int n);double cross(node a, node b, node mark);  //求向量mark->a, 向量mark-> b的叉积;double dis(node a, node b);    //求a,b两点距离;long long  dis1(node a, node b); bool cmp(node a,node b)
{double ans = cross(a,b,data[0]);if(ans > 0 || (ans == 0 && dis(a,data[0]) < dis(b,data[0]))) return true;return false;
}/*
8
0 0
2 0
4 0
4 2
4 4
2 4
0 4
0 24
0 1
0 2
0 3
0 4*/int main()
{int n;scanf("%d", &n);				//点集的大小for(int i = 0; i < n; i++)scanf("%lf %lf",&data[i].x,&data[i].y);int len = Graham(data,res,n);	//凸包的大小(也就是凸包所包含点的数目) long long  max = -1;for(int i = 0; i <len; i++){printf("%lf %lf\n",res[i].x,res[i].y) ;		//输出凸包 }return 0;
}double Graham(node* data,node* res, int n)
{//求出最左下的那个点(原点或参照点),并将此点和data[0]交换一下-------------------------int t = 0;for(int i = 1; i <n; i++){if(data[t].y > data[i].y || (data[t].y == data[i].y) && data[t].x > data[i].x)t = i;} node temp = data[t];data[t] = data[0];data[0] = temp;//将除了data[0]之外的点按与data[0]的极角从小到大排序-----------------------/*	如果用注释的部分来排序会很慢,所以用快排 for(int i = 1; i < n; i++){int t = i;for(int j =i+1; j < n; j++){double flag = cross(data[t],data[j],data[0]);if(flag < 0 || ( flag == 0 && dis(data[t],data[0]) > dis(data[j], data[0]) ) )t = j;}node temp1 = data[t];data[t] = data[i];data[i] = temp1;} */sort(data + 1,data + n,cmp);//初始化栈res----------------------------------------------------------------res[0] = data[0];int top = 0;//利用栈不断维护凸壳---------------------------------------------------------- for(int i = 1; i < n; i++){while(top > 0 && cross(res[top-1], data[i] ,res[top]) >= 0)				//找出所有右转的点,然后弹出栈 top--;res[++top] = data[i];}return top + 1;}
double cross(node a, node b, node mark)
{return (a.x - mark.x) * (b.y - mark.y) - (b.x - mark.x) * (a.y - mark.y);
} double dis(node a, node b)
{return sqrt( (a.x -b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) );
} 

 

 

 

 

 

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/omRhZeA3.shtml

相关文章

凸包 —— 五种解法

欢迎访问https://blog.csdn.net/lxt_Lucia&#xff5e;&#xff5e; 宇宙第一小仙女\(^o^)/&#xff5e;&#xff5e;萌量爆表求带飞≡Σ((( つ^o^)つ~ dalao们点个关注呗&#xff5e;&#xff5e; 关于凸包&#xff0c;之前一直漏掉了这一个&#xff0c;上周末组队赛&#xf…

Python凸包

文章目录 ConvexHullQG三维情况ConvexHull属性 ConvexHull ConvexHull是spatial中的一个类&#xff0c;主要功能是找到一组点的边缘&#xff0c;并做一个凸包。其必要的初始化参数为一个点集&#xff0c;点集格式为 n m n\times m nm维度的数组&#xff0c;n为点集中点的个数…

30-凸包(Convex Hull)

文章目录 凸包&#xff08;convex hull&#xff09;凸包&#xff08;convex hull&#xff09;Graham扫描算法API使用步骤&#xff1a;Code效果 凸包&#xff08;convex hull&#xff09; 1、凸包概念&#xff1b; 2、API说明&#xff1b; 3、代码演示&#xff1b; convex &…

凸包(convex hull),凸包络面(convex envelope), 凸低估计量(convex underestimator), 图上方(epigraph),

凸分析中经常见到这些概念&#xff0c;目前这方面的中文资料似乎不太多&#xff0c;决定写篇博客总结一下。 文章目录 1. 凸包 convex hull2. 图上方 epigraph3. 凸低估计量 convex underestimator4. 凸包络面 convex envelope 1. 凸包 convex hull 凸包在文献中比较常见些&a…

凸包

一、引言 凸包&#xff08;Convex Hull&#xff09;是一个计算几何&#xff08;图形学&#xff09;中的概念。 在一个实数向量空间V中&#xff0c;对于给定集合X&#xff0c;所有包含X的凸集的交集S被称为X的凸包。X的凸包可以用X内所有点(X1&#xff0c;...Xn)的凸组合来构造…

凸包, 概念

catalog 凸包算法1 O(n * m)算法2 O(n * logN) Andrew安德鲁算法凸包模板 凸包 通常上讲 平面上有很多的点, 用一个 皮筋 圈住 这所有的点, 此时这个 皮筋, 就是 这些点的 凸包 数学上讲 性质1: 凸包上, 任何一条边 他所在的直线 即为L, 则所有的点 都在直线L 的 同一侧 比…

小白兔视频格式转换器下载

1、小白兔视频格式转换器 www.xxxbbbttt.com 上传你的视频&#xff08;腾讯qlv&#xff0c;爱奇艺qsv、优酷kux&#xff09;都可以。 2、点击转换按钮&#xff0c;转换好后&#xff0c;我们把转换的视频下载到电脑里&#xff0c;就可以看到视频已经是MP4格式了。

推荐一款能够将爱奇艺qsv、腾讯qlv、优酷kux完美转换成mp4的三合一全能格式转换器

爱奇艺视频、腾讯视频、优酷视频相信很多人都在使用其中的一款或者几款软件吧&#xff0c;这三大视频网站已经主导国内视频行业&#xff0c;都是购买视频版权。因此&#xff0c;为了保护视频版权&#xff0c;就将缓存视频的格式设置成专属的qsv、qlv、kux&#xff0c;这三种视频…

kux格式怎么转换成mp4?简单快速的视频转换技巧分享

现在生活压力越来越大,过完一天忙碌的工作回到家里开始煲剧是很多人的最爱。说到看视频,资源基本都被「三巨头」——腾讯视频、爱奇艺、优酷所覆盖,而有些朋友喜欢将视频下载下来看。可是却发现,下载的视频格式是kux、qsv、qlv,普通视频播放器根本打不开,这是怎么一回事呢…

怎么使用视频转换器把kux格式转换mp4

在周末或者平时闲暇的时间&#xff0c;很多人可能就是在家里看下视频吧&#xff1f;而且最好的方式&#xff0c;还是下载到本地上来观看&#xff0c;想要啥时候看就啥时候看&#xff0c;想要看哪个地方的就看哪个地方的。但是吧&#xff0c;有人发现了&#xff0c;自己下载的视…

上网成瘾改变大脑结构:语言功能受影响,让人话都说不利索

万博 发自 凹非寺量子位 | 公众号 QbitAI 经常不受控制地拿着手机或平板&#xff0c;漫无目的的刷微博&#xff0c;逛淘宝…… 如果有&#xff0c;那就需要注意了&#xff0c;这种无法自控的上网成瘾&#xff0c;是一种被叫做互联网使用障碍&#xff08;IUD&#xff09;的健康问…

数据统计分析的16个基础概念

来源&#xff1a;EasyShu 本文约11000字&#xff0c;建议阅读20分钟本文介绍了数据统计分析的16个基本概念。 一、描述统计 描述统计是通过图表或数学方法&#xff0c;对数据资料进行整理、分析&#xff0c;并对数据的分布状态、数字特征和随机变量之间关系进行估计和描述的方法…

睡眠剥夺后皮层微结构的广泛变化

大脑皮层的微观结构受到昼夜节律和睡眠剥夺的影响&#xff0c;但这些影响的确切基础尚不清楚。t1加权和t2加权磁共振图像之间的比率(T1w/T2w比率)与髓磷脂水平和树突密度有关&#xff0c;这可能为研究睡眠剥夺大脑的皮质内微观结构提供新的见解。在这里&#xff0c;我们检测了4…

常用的数据分析方法汇总

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 一、描述统计 描述统计是通过图表或数学方法&#xff0c;对数据资料进行整理、分析&#xff0c;并对数据的分布状态、数字特征和随机变量之间关系进行估计和描述的方法…

论文阅读:FLGCNN: A novel fully convolutional neural network for end-to-endmonaural speech enhancement

论文题目&#xff1a;FLGCNN: A novel fully convolutional neural network for end-to-end monaural speech enhancement with utterance-based objective functions 一种新颖的全卷积神经网络&#xff0c;用于具有基于话语的目标函数…

民安汇智量表科普!满意度调查量表怎么选?

满意度量表是进行满意度调查的主要工具和手段。目前的满意度量表因其适用的对象、范围和特点各异&#xff0c;存在着多种类型差异。每个量表都有自己的特点&#xff0c;没有一个量表能用于所有的客户满意度评价&#xff0c;哪怕是在同一期满意度调查&#xff0c;都会因地制宜&a…

一文介绍各种量表类型!

量表是一种测量工具&#xff0c;通常用来测量人们的主观态度、意见或价值观念。我们经常会在问卷中使用量表对调查对象进行测量&#xff0c;最常见到的就是李克特量表&#xff0c;关于量表还有很多的种类&#xff0c;这里具体介绍几种&#xff1a; 一. 李克特量表&#xff08;…

数据分析之数据预处理、分析建模、可视化

大纲 思维导图1. 数据分析概述1.1 简介1.2 发展历程1.3 应用领域1.4 开发流程 2. 数据类型2.1 结构化与非结构化数据2.2 定性与定量数据2.3 截面数据与时间序列数据 3. 数据来源4. 数据预处理方法4.1 数据清洗4.2 数据集成4.3 数据规约4.4 数据变换 5. 数据分析模型5.1 对比分析…

amos里CFA可行性辨别结果怎么看_论文用问卷调查法,数据分析怎么做?

论文问卷数据的分析,看起来简单,好像每个人都会做。但是做起来还真的有点难度。很多初次使用问卷调查方法的人大多以为,问卷数据分析嘛,无外乎对单选题做做频率分析,看看选择不同的选项的人占比有多少。对于评分题目,看看均值是多少,不同性别,年龄段的人群均值是多少。…

『统计学』常用的数据分析方法都在这了!Part.2

阿平 | 作者 知乎 | 来源 1 相关分析 研究现象之间是否存在某种依存关系&#xff0c;对具体有依存关系的现象探讨相关方向及相关程度。 单相关&#xff1a;两个因素之间的相关关系叫单相关&#xff0c;即研究时只涉及一个自变量和一个因变量复相关 &#xff1a;三个或三个以上因…