计算几何 : 凸包学习笔记 --- Graham 扫描法

简介: 凸包 (只针对二维平面内的凸包) 一、定义 简单的说,在一个二维平面内有n个点的集合S,现在要你选择一个点集C,C中的点构成一个凸多边形G,使得S集合的所有点要么在G内,要么在G上,并且保证这个凸多边形的面积最小,我们要求的就是这个C集合。

 凸包

(只针对二维平面内的凸包)

一、定义

简单的说,在一个二维平面内有n个点的集合S,现在要你选择一个点集C,C中的点构成一个凸多边形G,使得S集合的所有点要么在G内,要么在G上,并且保证这个凸多边形的面积最小,我们要求的就是这个C集合。

二、算法

求凸包的算法很多,常用的有两种:

1.  Graham扫描法,运行时间为O(nlgn)

2.  Jarvis步进法,运行时间为O(nh),h为凸包中的顶点数。

这里主要讨论第一种算法:Graham扫描法

Graham扫描法

基本思想:使用一个栈来对所有点逐一判断,把不符合条件的点筛出去。

操作:输入集合Q中的每一个点都被压入栈一次,非CH(Q)(表示Q的凸包)中的顶点的点最终将被弹出堆栈,当算法终止时,堆栈S中仅包含CH(Q)中的顶点,其顺序为个各顶点在边界上出现的逆时针方向排列的顺序。

首先,找一个凸包上的点,把这个点放到第一个点的位置P0。然后把P1~Pm 按照P0Pi的方向排序,可以用矢量积(叉积)判定。

判定过程:

做好了预处理后开始对堆栈中的点<p3,p4,...,pm>中的每一个点进行迭代,在第7到8行的while循环把发现不是凸包中的顶点的点从堆栈中移去。(原理:沿逆时针方向通过凸包时,在每个顶点处应该向左转。因此,while循环每次发现在一个顶点处没有向左转时,就把该顶点从堆栈中弹出。)当算法向点pi推进、在已经弹出所有非左转的顶点后,就把pi压入堆栈中。

整个算法过程如图所示:

 

目录
相关文章
|
3月前
|
Python
python实现:旋转矩阵转换为四元数
python实现:旋转矩阵转换为四元数
90 0
|
6月前
|
机器学习/深度学习 算法 C#
C# | 凸包算法之Andrew‘s,获取围绕一组点的凸多边形的轮廓点
这篇关于凸包算法的文章,本文使用C#和Andrew’s算法来实现凸包算法。 首先消除两个最基本的问题: 什么是凸包呢? 凸包是一个包围一组点的凸多边形。凸多边形是指多边形中的每个内角都小于180度的多边形。 凸包算法有什么用呢? 凸包算法的作用是找到这个凸多边形,并且使用最少的点来绘制出它的轮廓。凸包算法在计算机图形学、计算几何和机器学习等领域中有着广泛的应用。
171 0
|
6月前
|
算法 测试技术 C#
【数学】【计算几何】1453. 圆形靶内的最大飞镖数量
【数学】【计算几何】1453. 圆形靶内的最大飞镖数量
|
算法
秒懂算法 | 计算几何:圆
计算几何的基础是点积和叉积,它们定义了向量的大小和方向的关系,是其他计算几何概念和算法的出发点。在点积和叉积的基础上,本篇重点介绍圆覆盖。 计算几何题目的代码大多繁琐冗长,因此掌握模板代码是学习计算几何的关键。本篇精心组织了经典的几何模板
18124 1
秒懂算法 | 计算几何:圆
|
前端开发 数据可视化 API
【数学篇】05 # 如何用向量和坐标系描述点和线段?
【数学篇】05 # 如何用向量和坐标系描述点和线段?
191 0
【数学篇】05 # 如何用向量和坐标系描述点和线段?
|
前端开发 数据可视化 图形学
【数学篇】09 # 如何用仿射变换对几何图形进行坐标变换?
【数学篇】09 # 如何用仿射变换对几何图形进行坐标变换?
154 0
【数学篇】09 # 如何用仿射变换对几何图形进行坐标变换?
|
图形学
【计算机图形学】期末复习part2:二维与三维图形变换
【计算机图形学】期末复习part2:二维与三维图形变换
171 0
【计算机图形学】期末复习part2:二维与三维图形变换
|
Python
LeetCode每日一题——883. 三维形体投影面积
在 n x n 的网格 grid 中,我们放置了一些与 x,y,z 三轴对齐的 1 x 1 x 1 立方体。
123 0
LeetCode每日一题——883. 三维形体投影面积
|
存储 算法
算法题每日一练---第41天:三角形最小路径和
给定一个三角形 triangle ,找出自顶向下的最小路径和。
97 0
算法题每日一练---第41天:三角形最小路径和