凸包的学习之路

凸包的学习之路-CSDN博客

5.算法策略5:Graham Scan Algorithm

算法思路:

给定二维点集,求其凸包

1)presorting:

(1)先找到 ltl点 ,也就是y值最小的点,若是存在y值相等的点,再取x值最小的点。将该点压入到栈S中。

(2)再从 ltl点 出发,找到第二个特别的点,压入到S栈中。这个特别的点(暂时记作A)的特别之处在于点集中其他所有的点都在A和ltl的左侧(也就是 ToLeftTest(ltl,A,S) 为true)。

---------这时S栈中有两个元素

(3)将点集中剩余的其他点按照与 ltl-A 所成的角度排序,角度越大的,越早被压入T栈。这个找所成角度最大的那个点,把它压入栈中也比较动了动我的脑子。

---------这时T栈中按顺序放有点集中的其他元素

2)graham scan的核心算法

每次取S栈的次栈顶、栈顶 以及 T栈的栈顶 做 ToLeftTest。如果是true,代表T栈的栈顶元素要加入到S栈中来,否则当前S栈的栈顶元素将要被弹出,直到T栈变空为止。每次S栈的状态,都是当前scan到的凸包状态,然后也会有回退(backtrack)过程进行调整。

核心算法:

while(!T.empty())

        if(toLeftTest(S[S.top-1],S[S.top],T[T.top]){

                S.push(T.pop());

        }

        else{

                S.pop();

        }

理解起来还是可以的。

这里,邓俊辉老师的课程上没有提供presorting相关实现思路的代码(只是口头描述了一下),对我这种菜鸡造成了一定的困难。脑袋累累也许才能有所突破和进步,总是要有这么一个过程。数据结构也学过去好久了,但好在网上有构建栈、压入栈等的代码可以学习(不难)。总之,几番探索,搞定了S栈和T栈。真正的graham scan部分在实现上就那么几行代码(算法复杂度低)。

------------------------------------------------------------------------------------------------

 

 这里将已经压入栈中的元素对应的 index[i] 值标记为-1,index[i]值存入的是角度的cos值(除了压入栈中的元素对应存入的是-1),cos值的范围在-1-1之间的。

 这些都是写在类中的,在主函数中构建对象,然后用opencv将极边画出来看看。极点都在最终的S栈中。

结果如下:

(念叨念叨)不知道cv领域的未来,多学是没有坏处的,但方向不对也不行。每天像过流水账一样,我的青春小鸟一样不回来。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

thinkphp8 DB_PREFIX 属性

设计表的时候使用**_user, **就是前缀,DB_PREFIX就是默认把前缀给去掉 在config/database.php prefix,改成你的前缀,数据库的表重命名‘ltf_user’ 代码调用 $user Db::name("user")->select();return json($user);之前是使用…

css取消移动端长按元素背景色

在开发微信小程序的时候,发现有的元素长按之后,出现了讨厌人的背景色,这就很奇怪,就想把它去掉,所以这里教一下方法: 在所在元素添加css样式: // 取消长按的背景色-webkit-tap-highlight-color:…

解放双手!一键助你快速发圈、批量加好友,好用哭了!

朋友们,你们有没有经历过管理多个微信账号的繁琐和压力? 会不会因为忙不过来,忘记及时回复客户,错过了推广的时机? 别担心,现在有了微信管理系统,一切都变得简单轻松起来! 微信管…

03-瑞吉外卖关于菜品/套餐分类表的增删改查

新增菜品/套餐分类 页面原型 当我们在后台系统中添加菜品/套餐时,需要选择一个菜品/套餐分类,在移动端也会按照菜品分类和套餐分类来展示对应的菜品和套餐 第一步: 用户点击确定按钮执行submitForm函数发送Ajax请求,将新增菜品/套餐表单中输入的数据以json形式提交给服务端,…

Apache DolphinScheduler 3.0.0 升级到 3.1.8 教程

安装部署的流程可参考官网的文档 Version 3.1.8/部署指南/伪集群部署(Pseudo-Cluster) https://dolphinscheduler.apache.org/zh-cn/docs/3.1.8/guide/installation/pseudo-cluster 本文开始之前,我先补充说明一下升级 Apache DolphinScheduler 的几个关键点 元数…

低代码服务商,中小型数字化软件服务商的新出路

数字化时代大背景下,企业信息化向数字化转型成为所有企业发展的必由之路,企业在对业务模式、流程、组织形式、信息技术等方面进行重新定义时,软件必然参与价值创造的全过程,这势必驱使软件成为推动数字化转型的“引擎”&#xff0…

debian 12 配置

1. 修改apt源 修改apt源为http版本 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware # deb-src http://mirrors.tuna.tsinghua.edu.cn/d…

文化传承与数字技术的完美结合:十八数藏的新纪元

在这数字化的时代,十八数藏犹如一座连接过去与未来的桥梁,展现出文化传承与数字技术完美结合的新纪元。十八数藏以其独特的视角,将传统文化注入现代数字技术的脉络,呈现出一幅文化传承的全新画卷。 十八数藏的文化传承并不是简单的…

软件测评中心进行安全测试有哪些流程?安全测试报告如何收费?

在当今数字化时代,软件安全测试是每个软件开发团队都不能忽视的重要环节。安全测试是指对软件产品进行系统、全面的安全性评测与检测的过程。它旨在发现并修复软件中存在的漏洞和安全隐患,以确保软件能够在使用过程中保护用户的数据和隐私不被非法访问和…

深入了解Java 8 新特性:Stream流的实践应用(二)

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概8000多字,预计阅读时间长需要10分钟(不要害怕字数过多,其中有一大部分是示例代码,读起…

RAAGR2-Net:一种使用多个空间帧的并行处理的脑肿瘤分割网络

RAAGR2-Net: A brain tumor segmentation network using parallel processing of multiple spatial frames RAAGR2-Net:一种使用多个空间帧的并行处理的脑肿瘤分割网络背景贡献实验N4 bias-field-correction 数据预处理Z-score and re-sampling Z-score归一化&#…

redis高可用---持久化

redis高可用 在集群当中有一个非常重要的指标,提供正常服务的时间的百分比(365天) 99.9%,redis高可用含义更广泛,支持服务是指标之一,数据容量扩展,数局的安全性。(容量、安全性) redis中实现高…

数据仓库模式之详解 Inmon 和 Kimball

目录 一、前言 二、企业信息工厂(Inmon) 2.1 概念 2.2 主要组件 2.3 流程 三、多维数据仓库(Kimball) 3.1 概念 3.2 核心组件 3.3 流程 四、异同及用途对比 4.1 异同对比 4.2 特征比较 一、前言 大部分关于数据仓库构建…

小微初创企业,如何利用媒体宣传快速成长

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 对于小微初创企业来说,利用媒体宣传可以快速提升品牌知名度、扩大影响力,进而促进企业的成长。 1.确定宣传目标:是增加销售、提升品牌知名度、还是推…

JVM对象创建与内存分配

对象的创建 对象创建的主要流程: 类加载推荐博客:JVM类加载机制详解 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析…

Failed to load resource: net::ERR_UPLOAD_FILE_CHANGED 谷歌浏览器就会有这个问题 其他的浏览器没有

Failed to load resource: net::ERR_UPLOAD_FILE_CHANGED 10 10: Difficulties in file uploading through all browsers and applications

mac添加Chrome插件的方法

如果是.crx的插件 更改后缀crx为zip 后续步骤同下文.zip文件 如果是.zip的插件 使用终端进行解压 注意不要用解压工具解压,一定要用终端,命令行解压 // 进入到“插件名.zip”文件的目录下,输入下面命令: unzip 插件名.zip -…

「ResNet-18」70 个犬种的图片分类

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

LeetCode【45】跳跃游戏2

题目: 思路: 注意和跳跃游戏【55】不同的是,题目保证可以跳到nums[n-1];那么每次跳到最大即可 代码: public class LeetCode45 {public static int jump(int[] nums) {int jumps 0;int currentEnd 0;int farthest 0;for(int…

Android Serializable / Parcelable

Serializable 序列化,将对象转为二进制序列 Parcelable 不是序列化,属于进程间通信,不需要IO/操作,没有拷贝内存的操作, Object -> ShareMemory -> Object 不需要IO,使用内存共享等方式 Kotlin inline fun 内联函数 TCP协议将数据包拆分,进行发送,保证网络数据的可…