多边形三角化Earcut分析,以mapbox EarCut源码举例

news2024/11/28 9:27:05

多边形三角化,简单来说,就是给定一圈有序的多边形点生成三角面片,EarCut的原理描述网络上有很多(如https://blog.csdn.net/qq_24459491/article/details/102976671),就不细说了。但是有的时候看是一回事,源码写是另一回事,实践才是学习的最好方法,所以本文对mapbox 开源的Earcut算法进行剖析(github地址:https://github.com/mapbox/earcut)。

首先说一下Ear在程序中的判断依据:Ear点是多边形中的凸点并且它和它相邻的两个顶点组成的三角形内部不包括包括多边形的其他顶点。Mapbox中定义如下:

其中305行就是在判断顶点是否为凸点,这是通过与其相邻顶点的法线方向来判断。这里多边形顶点顺序是顺时针,所以判断法线方向为负就是凸点(对于二维多边形来说,两条边的叉积就是两条边组成的平行四边形的有向面积)。

310到313行就是在遍历多边形的顶点,判断是否有其他顶点在三角形内。Earcut算法的复杂度为n*n,平方就是从这儿来的。

判断顶点是否在三角形内部的原理就很简单了,mapbox三角形按逆时针排列,所以判断依次两两顶点与该点组成的三角形是否法线均为正。

如果三角形顺序随机,判断三个三角形的法线是否一致也可。

由上面看到,判断Ear, 要判断顶点为凸点的前提是要知道多边形是按逆时针还是顺时针排列,mapbox以格林公式来判断多边形的时针顺序。

还有一种方式是通过多边形叉积求有向面积的方式:

 这里有向面积是该顶点和下一个顶点,原点组成的三角形面积和。

有了顶点顺序,就可以判断Ear,然后就可以选择三角面的三个顶点了,即Ear和它的相邻两个顶点。然后删除Ear,剩余多边形继续相同操作,直至小于3个点。

其中283行fileterPoints用于删除共线和重复点。

另外,我们可以看到,249行怎么还有indexCurve,isEar也有不同的判断函数isEarHashed?这是因为mapbox还对Earcut进行了效率优化,是否使用效率优化MapBox是通过判断顶点的个数是否大于80个。

那哪里还有优化空间?在判断isEar的时候,mapbox遍历了所有顶点来判断是否有顶点在三角形内,其实三角形box范围内搜索就足够了,那么怎么来缩小这个搜索范围,毕竟是个二维数据,mapbox应用了z-order算法将二维数据映射到一维的方式,然后排序缩小了顶点的搜索范围。

z-order是一种莫顿码编码(Morton Code)方式, 将两个十进制转换成二进制,然后位数两两交叉,就得到了二进制的莫顿码(莫顿码也支持3维,计算方式类似)。

Mapbox计算方式如下:

其中minX是所有顶点的最小x值,minY是所有顶点的最小Y值。inv_size用于将坐标值转为整数用于z_order计算(最大为15位)

这里z_order计算用得是Magic Bits方法,可能不好理解,用另一种FOR_LOOP方法就好理解了。

CHAR_BIT =8位

有了zorder,链表按Morton 排序,然后替换掉isEar里面遍历所有顶点的部分就是isEarHashed。

 

Mapbox EarCut还包括了对洞的处理,需要进一步剖析。

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

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

相关文章

Ae 效果详解:Mocha AE

Ae菜单:效果/Boris FX Mocha/Mocha AE Effects/Boris FX Mocha/Mocha AE Ae菜单:动画/Track in Boris FX Mocha Animation/Track in Boris FX Mocha Mocha Pro 是一款强大的平面跟踪软件。既可作为独立软件运行,也提供了 Ae 的插件版本&#…

1.4C++运算符重载作函数

C运算符重载函数作为类成员函数 作为类成员函数时,运算符重载函数使用类的成员变量作为操作数。 写个 demo: 运算符重载函数作为类成员函数时,需要注意:运算符重载函数必须是类的成员函数,不能是普通函数或者全局函…

MIT6.024学习笔记(二)——图论(1)

学习不是为了竞争和战胜他人,而是为了更好地了解自己和世界。 - 达赖喇嘛 文章目录 图的相关概念涂色问题基础涂色方法(贪婪算法)证明 二分图匹配问题应用:稳定婚烟问题算法性质及其证明 图的相关概念 图的定义:一组&…

We need you | 隐语开源共建计划第一期任务等你认领

作为隐私计算开源界的一颗新星,隐语一直致力于推动隐私计算行业的发展,同时也在不断发展和完善中。通过开放、透明和共享的方式,协同行业优秀人才协同合作,推动隐私计算领域蓬勃发展,这是隐语开源的意义。因此&#xf…

FPGA多路视频叠加融合 HLS算法实现 提供2套工程源码和技术支持

目录 1、前言2、视频叠加模块的功能和性能3、HLS视频叠加融合设计4、vivado工程1--单路同源视频的缩放叠加详细设计方案vivado工程详解SDK工程详解 5、vivado工程2--两路非同源视频的缩放叠加详细设计方案vivado工程详解SDK工程详解 6、上板调试验证7、福利:工程代码…

MySQL底层数据结构

1、引入 一个sql语句在mysql中究竟是如何运行的?又应该通过怎样的方式去查找我们要找的数据?这里就涉及到几种存储数据的算法; 可以做索引的数据结构有数组、链表、二叉搜索树和B树(B-树、B树)。 2、各种数据结构 …

flutter多版本切换

方式一:符号连接(软链接) 注:无需修改环境变量,也不用重启AndroidStudio mac具体flutter版本切换操作步骤: 1、项目clean然后切换自己需要的分支 2、删除文件夹flutter目录文件(这里的flutter是原来的符号连接&…

若依集成分库分表(一)

1.本次需求为同库分表 1.1 引入pom依赖 <!-- sharding-jdbc分库分表 --> <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-core</artifactId><version>4.1.1</version> </dependenc…

Linux内核中内存管理相关配置项的详细解析2

接前一篇文章&#xff1a;Linux内核中内存管理相关配置项的详细解析1 3. Default compressor&#xff08;默认压缩器&#xff09; 此项展开后如下图所示&#xff1a; 此项的内核源码详细解释为&#xff1a; Selects the default compression algorithm for the compressed cac…

谷歌发布一个免费的生成式人工智能课程

在过去几周&#xff0c;我们看到的都是AI将如何改变生活&#xff0c;无论是ChatGPT的文本生成&#xff0c;还是SD&#xff0c;Midjourney 的图像生成&#xff0c;这些AI的特点就是都是生成式的AI。而几天前&#xff0c;谷歌推出了一个生成式人工智能学习课程&#xff0c;课程涵…

美团太细了:Springcloud 微服务优雅停机,如何实现?

说在前面 关于Spring Boot、Spring Cloud应用的优雅停机&#xff0c;平时经常会被问到&#xff0c;这也是实际应用过程中&#xff0c;必须要掌握的点。 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如美团、拼多多、极兔、有赞、希音的…

深度学习应用篇-计算机视觉-语义分割综述[5]:FCN、SegNet、Deeplab等分割算法、常用二维三维半立体数据集汇总、前景展望等

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

【新版】系统架构设计师 - 软件可靠性分析与设计

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 软件可靠性分析与设计考点摘要可靠性相关基本概念软件可靠性分析可靠性指标串联系统&#xff08;可靠性&#xff09;并联系统&#xff08;可靠性&#xff09;混合系统&#xff08;可靠性&#xff…

(转载)从0开始学matlab—总结

1.编程实例 下面的例子将向大家介绍如何用 MATLAB 解决问题。 例1 温度转换程序 问题&#xff1a; 设计一个 MATLAB 程序&#xff0c;读取一个华氏温度的输入&#xff0c;输出开尔文温度。 答案&#xff1a; 华氏温度和开尔文温度的转换关系式可在物理学课本中找到。其关系式…

压力测试分为稳定性测试和破坏性测试

压力测试分为稳定性测试和破坏性测试 压力测试是一种对软件系统进行负载测试的常见手段&#xff0c;可以评估其在不同负载条件下的稳定性、性能和可靠性等指标。常见的压力测试分为两种类型&#xff1a;稳定性测试和破坏性测试。 1. 稳定性测试 稳定性测试也称为基准测试&#…

shell脚本基础3——正则表达式

文章目录 一、基本了解二、基本正则表达式2.1 字符匹配2.2 位置锚定2.3 匹配次数2.4 分组 三、扩展正则表达式3.1 字符匹配3.2 位置锚定3.3 匹配次数3.4 分组3.5 或者 一、基本了解 正则表达式分2种&#xff1a;基本正则表达式和扩展正则表达式。grep 、sed命令使用正则较多&am…

软考A计划-系统架构师-官方考试指定教程-(9/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

spiderflow的初步使用

1、简介 spider-flow 是一个爬虫平台&#xff0c;以图形化方式定义爬虫流程&#xff0c;无需代码即可实现一个爬虫 官网地址&#xff1a;https://www.spiderflow.org/ 2、spiderflow的初步使用 2.1拉取&#xff0c;配置和启动 从gitee上拉取 执行db里面的sql 里面会有6张表 …

为什么说高性能计算工程师越老越吃香?还难以被AI替代?

一般越老越吃香的岗位或者行业&#xff0c;一定是拥有无法或者难以轻易被替代的经验。 这些经验一般是靠时间、靠思维、靠试错不断积累起来的。然而AIGC来了&#xff0c;好像宣布AI会取代所有人一样&#xff0c;如经验丰富的律师、医生、教师等等&#xff0c;尤其是贡献了AIGC…

java ssm贸易平台-物流管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm贸易平台-物流管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…