凸包的学习之路

学习视频选择的是:清华大学邓俊辉教授的《计算几何》课程

关于我为什么学习 凸包(Convex Hull)?

——在学习过程中遇到了凸包问题,凸包在CV领域的基础性,使我觉得深入了解凸包是必要的。此外,我发现了《计算几何》这一宝藏课程,对我目前涉足的领域犹如前进的灯塔。而凸包又正是《计算几何》的第一课。

菜鸡还是很菜,但进步空间大呀。

什么是凸包?(如果面试官问你这一问题,你该如何作答)

二维平面上有一个点集,点集中有若干个点,就好像将一些钉子钉在桌子上,现在手里有一个橡皮筋,用手拿着,将它套在这些钉子的外面。然后,松手,橡皮筋就会套在“最外面”的那些钉子上,会呈现出一个轮廓,这个轮廓构成的形状,就是凸包。

凸的概念,是几何中常见的概念。如何判定“凸”?如果轮廓内任意两点的连线都在轮廓区域内,那么这个形状就是凸的。

下面,要记录的几种【由平面中一组点集,生成凸包】的算法

在此之前,两个概念——极点(相当于“边界点”)、极边(相当于“边界”)

1.算法策略1: In-Triangle Test

原理:非极点一定在某一或某些三角形的内部,而极点不在任一三角形内部。

思路:(1)先将所有点都标记为极点;(2)对于每一个三角形(p,q,r),如果点s位于其内部,则将s标记为非极点。

四层循环:

for(int p=0;p<n;p++)

        for(int q=p+1;q<n;q++)

                for(int r=q+1;r<n;r++)

                        for(int s=0;s<n;s++){

                                if(s==p || s==q || s==r || !S[s].extreme ) continue;

                                if(Intriangle(S[p],S[q],S[r],S[s]) S[s].extreme = false;

                                }

下面的重点是:

InTriange()这个函数的实现,我首先想到的是向量的叉乘(多学一点是一点,总是没错的)。这里给出的是点的坐标,可将其转化为三个ToleftTest。沿三角形CW方向或者CCW方向,三角形内的点对于三条边的ToleftTest都会返回同一个值(同是ture,或者同是flase,视方向而定)。ToleftTest在后续其他凸包算法中也有着广泛的应用。

 

 OK,在学习了算法思想后,有种手痒的感觉,于是乎在Code::Blocks中实现了一下。

实现效果如下:

我使用了opencv将点绘制了一下,其中,红色点为极点,黄色点为非极点。

2.算法策略2:Extreme Edges

第一个算法根据极点的特性(不在点集中任三点构成的三角形中)来识别极点和非极点,下面这个算法策略则从极边入手。非极点与非极点之间肯定不存在极边,极点与非极点之间也肯定不存在极边,此外,极点与极点之间也不一定存在极边。那极边的特性是,除了构成该极边的两个极点之外,剩下所有的点都在该极边的一边。

amazing

思路:(1)定义极边EE为空集;(2)对于点集中任两点(p,q)构成的边,判断其他点是否都在该边的同一侧。如果是,那么将p,q标记为极点,将pq加入极边中。

解释一下这边具体的思路:对于p,q构成的边,先定义布尔类型LEmpty和REmpty为true,对其他点进行ToleftTest。如果pq是极边,那么其他点k会将LEmpty或者REmpty中的一个赋值为flase,另一个还是true。但如果pq不是极边,那么LEmpty和REmpty都会被重新赋值为flase,那么下面那个if(LEmpty || REmpty)不会执行。

实现效果如下:

 

还是用opencv绘制,这里不仅绘制了点,把极边也绘制上去了。

3. 算法策略3:decrease and conquer(减治法:减少、征服)

插入法排序:

5  1  4  2  3

(5)  1  4  2  3

(1  5) 4  2  3

(1  4  5 )2  3

(1  2  4  5 )3

(1  2  3  4  5)

策略:“减而治之,逐步蚕食”

这里凸包的构建也可以采取这一策略。先是任取三个点构成三角形作为凸包,然后从点集中取点,判断该点是否在多边形的内部/外部?如果是外部点,那就要思考插入的位置了。就这样,逐渐将剩下的点加入,最终构建好凸包。

思路:设置两个指针结构,一个就是指向点集,另一个指向极点集合(在不断变化中)。对于扫描到的点,依次连接它与极点集合的点(循环),判断其前驱和后继是否在一边,还是使用ToleftTest。如果是在一边(同为true或者同为flase),则要记录一下位置,方便后续插入;如果不在一边,就continue再判断下一个;要是都不在一边,那说明这是个内部点了。

 实现效果如下:

4.算法策略4: Jarcis March算法

凸包是首尾相连的凸多边形。根据这一特性,如果我们找到了一条极边(ki),那么就可以从这条极边出发缩小下一步查找极边的范围。如果是逆时针转的话,下一个极边从极点k出发,对其他点 l 进行搜索,如果新的 l 在kl的右侧,则更新极点。

那么如何确定最初的那个极点呢,这里采用Lowest-then-Leftmost策略,实际上是两条准则,先找最低的点(也就是y值最小的点),如果存在多个y值相同的点,那么在找那个最左的点(也就是x值最小的点)。其实这样找到的点是符合要求的,我主要是从直观感觉上来。找到这个点 ltl,下面再从它出发来寻找极边。就可以了。

 

 实现效果如下:

这篇就到这里了,思路明确了,其实代码实现就考验编程能力(当然还有很多)。课程中好像没有提供 算法策略3(减治法) 的具体实现代码,其他的都有那个最关键的思路的。我在代码实现的基础上,调用了opencv来进行了一下可视化,前提是要配好opencv的环境。OK啦,休息一下啦。

(念叨念叨)不念叨了。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

交换机基础知识之安全配置

交换机在网络基础设施中扮演着重要角色&#xff0c;它促进了设备之间数据包的流动。正因此&#xff0c;采取适当的安全措施来保护网络免受未经授权的访问和潜在攻击至关重要。本文将全面解读交换机基础安全配置知识&#xff0c;并提供实践方案&#xff0c;以保证安全的网络环境…

【Linux】-再谈动静态库-手把手教你自己制作一个动静态库

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

计算机缺失vcruntime140.dll如何修复?超简单的5个解决方法

在我们日常使用电脑的过程中&#xff0c;可能会遇到各种各样的问题和错误提示。其中&#xff0c;一个比较常见的错误提示就是“vcruntime140.dll丢失”。这个错误通常发生在我们尝试运行某个程序或应用时&#xff0c;系统无法找到或加载所需的vcruntime140.dll文件。 vcruntime…

Ubuntu安装mysql(解决ubuntu Access denied for user ‘root‘@‘localhost‘报错)

1、安装mysql sudo apt-get install mysql-server 上述命令会安装以下包&#xff1a; apparmor mysql-client-5.7 mysql-common mysql-server mysql-server-5.7 mysql-server-core-5.7 因此无需再安装mysql-client等。安装过程会提示设置mysql root用户的密码&#xff0c;设…

Java —— 继承

目录 1. 为什么需要继承 2. 继承概念 3. 继承的语法 4. 父类成员访问 4.1 子类中访问父类的成员变量 1. 子类和父类不存在同名成员变量 2. 子类和父类成员变量同名 4.2 子类中访问父类的成员方法 1. 成员方法名字不同 2. 成员方法名字相同 5. super关键字 6. 子类构…

Istio学习笔记-体验istio

参考Istio 入门(三)&#xff1a;体验 Istio、微服务部署、可观测性 - 痴者工良 - 博客园 (cnblogs.com) 在本章中&#xff0c;我们将会学习到如何部署一套微服务、如何使用 Istio 暴露服务到集群外&#xff0c;并且如何使用可观测性组件监测流量和系统指标。 本章教程示例使用…

【JAVA学习笔记】70 - 反射

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter23/src 反射 一、反射的引出 package com.yinhai.reflection.question;import com.yinhai.Cat;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IO…

全链路自动化测试

背景 从 SOA 架构到现在大行其道的微服务架构&#xff0c;系统越拆越小&#xff0c;整体架构的复杂度也是直线上升&#xff0c;我们一直老生常谈的微服务架构下的技术难点及解决方案也日渐成熟&#xff08;包括典型的数据一致性&#xff0c;系统调用带来的一致性问题&#xff0…

vue day1(主要是指令)

1、引包 或者&#xff1a;cdn网址 2、创建实例&#xff0c;初始化渲染 3、插值表达式 {{}} 表达式&#xff1a;可以被求值的代码 4、响应式数据&#xff1a;数据发生变化&#xff0c;视图自动更新&#xff08;底层是dom操作&#xff09; data中数据会被添加到实例上&#x…

微信自动添加好友

简要描述&#xff1a; 添加微信好友 请求URL&#xff1a; http://域名地址/addUser 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId…

易点易动固定资产管理系统:RFID技术助力快速盘点数万固定资产

在当今的企业管理中&#xff0c;高效和准确的固定资产盘点是至关重要的。传统的资产盘点方法通常耗时且易出错&#xff0c;这在快节奏的商业环境中是企业难以承受的。易点易动固定资产管理系统通过采用射频识别&#xff08;RFID&#xff09;技术&#xff0c;为企业提供了一种革…

竞赛 题目:基于python的验证码识别 - 机器视觉 验证码识别

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于pyt…

【教3妹学编辑-mysql】mybatis查询条件遇到的坑及解决方案

2哥 :3妹&#xff0c;今天怎么下班这么晚啊。 3妹&#xff1a;嗨&#xff0c;别提了&#xff0c;今天线上出bug了&#xff0c; 排查了好久。 2哥&#xff1a;啊&#xff0c;什么问题呀&#xff1f; 3妹&#xff1a;我们内部的一个管理系统报错了&#xff0c; 最近排查下来是myb…

Gempy 实现地理位置3D模型的展示以及导出

1. 首先安装python gempy 包 pip install gempy python 版本 3.10 这个很重要,版本不同可能会报错 2. gdal 可能会报错, 一下地址根据python版本下载,然后移入到python解释器环境中, Script文件中,然后cmd ,pip install 文件名安装即可 Releases cgohlke/geospatial-wheels …

NI和EttusResearchUSRP设备之间的区别

NI和EttusResearchUSRP设备之间的区别 概述 USRP&#xff08;通用软件无线电外设&#xff09;设备是业界领先的商软件定义无线电&#xff08;SDR&#xff09;。全球数以千计的工程师使用USRPSDR来快速设计、原型设计和部署无线系统。它们以两个不同的品牌进行营销和销售&…

【电源专题】低功耗设备如何解决POE协议要求的PD最小功耗?

要让PD正常工作起来除了需要与PSE握手协商外,还要求PD有一个最小功耗输出。 其原因是如果PD没有在一定时间内给出一个最小功耗,那么PSE将会认为PD设备断开而自动关闭,将功率分配给其他网口。对于不同的类别PD,其要求也不一样。如下所示为Type 1/2/2/4最小电流的要求:如类…

力扣 225. 用队列实现栈(C语言实现)

目录 1.解题思路2.代码实现 1.解题思路 这道题如果使用C会好写的多&#xff0c;因为可以使用C提供的队列来实现&#xff0c;但如果使用C语言则必须手写一个队列来实现&#xff0c;在这里我用了我前面文章中实现好的队列来解答&#xff0c;首先因为队列是先进先出&#xff0c;而…

您的计算机已被Mallox勒索病毒感染?恢复您的数据的方法在这里!

尊敬的读者&#xff1a; 随着科技的迅速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒是一种极具威胁性的恶意软件。在这些勒索病毒中&#xff0c;.mallox 勒索病毒尤为突出&#xff0c;它能够加密用户的数据文件&#xff0c;要求支付赎金才能解密。本文将介…

2021年03月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 花花幼儿园有三个班。根据下面三句话,请你猜一猜,哪个班级人数最多? (1)中班比小班少 (2)中班比大班少 (3)大班比小班多 A:小班 B:中班 C:大班 D:三个班级一样多 答案:C 根据(1)(2)可以知道中班人数最少,根…

功能测试自动化测试流程

1概述 本流程是描述软件功能自动化测试过程中的步骤、内容与方法&#xff0c;明确各阶段的职责、活动与产出物。 2流程活动图 3活动说明 3.1测试计划&#xff08;可选&#xff09; 与以前的测试计划过程一致&#xff0c;只是在原来的测试计划中&#xff0c;添加对项目…