个人笔记|GIS的ear clipping算法

对论文Triangulation by Ear Clipping 的理解
不涉及带孔洞的多边形及多边形迭代
问就是功能不需要

声明:在本学习笔记的写作过程中,没有一只猫猫受到实际伤害。
(包括赛博猫猫在内)

引入

计算机图形学的多边形分解问题

简单多边形定义

定义一个简单多边形为由从V_0V_{n-1}n个点组成的有序序列。两相邻顶点之间以边<V_i,V_{i+1}>,0\leq i\leq n-2相连,且起点和终点之间以边<V_{n-1},V_0>相连。简单多边形的每个顶点有且仅有两条边,简单多边形的任意两条边仅在顶点处相交。简单多边形和复杂多边形的对比如图所示

简单与复杂多边形对比

左侧多边形为简单多边形。中间的多边形的顶点1有两条以上边,不为简单多边形。右侧多边形中连接顶点1和顶点4的边与其他边在非顶点处相交,该多边形不为简单多边形。

在一个简单多边形中,当遍历边缘时,多边形内部的有限区域总处于遍历方向同一侧。假设以逆时针方向遍历例图中的简单多边形边缘,则多边形内部区域始终处于遍历方向左侧。

多边形三角化算法

将简单多边形分解为多个三角形的过程叫做多边形三角化。对具有n个顶点的任意多边形进行三角化分解都会得到n-2个三角形。在诸多算法中复杂度为O(n^2)的ear clipping算法算是最简单又好用的一个,其他复杂度更低的算法也存在,不过会比ear clipping更难实现。

Ear Clipping算法

下文用猫耳朵指代ear 用咔耳朵算法指代ear clipping)

我觉得论文作者也会赞同的 除了猫奴还有谁会看到三角形就想到尖尖耳朵呢)

定义

猫猫耳朵

多边形的一只猫猫耳朵是由三个相邻顶点V_{i_0},V_{i_1},V_{i_2}构成的三角形,其中V_{i_1} 是三角形凸出的顶点,在该顶点处三角形的内角角度小于\pi。作一条连接点V_{i_0},V_{i_2}的辅助线,该线段完全位于多边形内部。这只猫猫耳朵只含有构成耳朵的三个顶点,不包含多边形的其他顶点。在计算机几何学术语里把连接点V_{i_0},V_{i_2}的辅助线叫做多边形的一条对角线,把顶点V_{i_1}叫做耳朵尖(猫猫的耳朵根根和耳朵尖尖,懂得都懂)。一个三角形就是一只猫猫耳朵,三角形的任意一个顶点都可以是耳朵尖尖。

有四条边及以上的多边形拥有至少两只不重叠的耳朵,这就提供给我们一个递归实现多边形三角化的思路。若在含有n\geq 4个顶点的多边形内确定并移除一个三角形,移除后的多边形具有n-1个顶点。重复该过程,即是复杂度为O(n^3)的三角化算法。

咔耳朵算法

好消息:咔耳朵算法的复杂度可以降到O(n^2)

坏消息:难的步骤要来了

step1

首先,将多边形以双链表形式存储,以便快速咔掉耳朵尖尖。这个步骤的复杂度是O(n)

step2

其次,对顶点进行迭代,分出各个不重叠的猫猫耳朵。对于每个顶点V_i和该顶点对应的三角形<V_{i-1}, V_i, V_{i+1}>,测试多边形的其他顶点是否位于该三角形中。该索引对n取模,所以V_n = V_0V_{-1} = V_{n-1}。如果三角形内不包含多边形的其他顶点 ,我们就喜提了一只猫猫耳朵!如果三角形内至少含有多边形的一个顶点,它就不是猫猫耳朵。在三角形包容测试中效率更高的三角化方法是只考虑反射点。反射点指由两条边构成的角度大于\pi的内部角的顶点。多边形的数据结构包含四个同时共用一个存储数组的双链表,而非动态分配和释放内存的标准列表数据结构。使用循环链表存储多边形的所有顶点,线性表存储凸顶点,另一个线性表存储反射点,另一个循环链表存储耳朵尖尖。

step3

当完成对存储反射点和耳朵尖尖的数据列表初始化后,就可以一只接一只地咔掉猫猫耳朵了!若V_i是已经被咔掉的猫猫耳朵,那么与其相邻的顶点V_{i-1}和顶点V_{i+1}的边的参数随之变化。若一相邻顶点是凸出点,则其仍是凸出点。若一相邻顶点是耳朵,在移除V_i后它可能就不再是耳朵了。若为反射点,则可能变为凸出点或耳朵。在移除V_i后,若存在一凸出的相邻顶点,则必须通过遍历反射点和测试三角形内是否包含点来验证该相邻顶点是否为耳朵。整个过程的复杂度是O(n^2)

算法示例

以第一张图的简单多边形为例

初始的简单多边形

凸出顶点的初始列表为C = \{0,1,3,4,6,9\}

反射顶点的初始列表为R = \{2,5,7,8\}

耳朵尖尖的初始列表为E = \{3,4,6,9\}(再复习一遍,耳朵尖尖=这个点是凸出点+和这个点相邻的两个点的连线完全在多边形内部)

凸出点 C = \{0,1,3,4,6,9\}
反射点 R = \{2,5,7,8\}
耳朵尖尖 E = \{3,4,6,9\}
三角形 暂无

① 把耳朵尖尖3对应的猫猫耳朵咔掉,那么三角化咔出来的第一个三角形就是T_0 = <2,3,4>

咔掉第一个三角形

V_3相邻的顶点V_2初始时是反射点,咔掉T_0后仍是反射点。与V_3相邻的顶点V_4初始时是耳朵尖尖,咔掉T_0后仍是耳朵尖尖。可知反射点列表R维持原状,但耳朵尖尖列表变为E = \{4,6,9\}

凸出点 C = \{0,1,4,6,9\}
反射点 R = \{2,5,7,8\}
耳朵尖尖 E = \{4,6,9\}
三角形 T_0=<2,3,4>

② 然后把顶点4对应的耳朵咔掉,可得三角化后的又一个三角形T_1 = <2, 4, 5>

咔掉第二个三角形

V_4相邻的顶点V_2初始时是反射点,咔掉T_0后仍是反射点。与V_4相邻的顶点V_5初始时是反射点,咔掉T_1后变成了凸出点,经过测试后确定为耳朵尖尖,故从反射点列表中移除V_5,反射点列表变为R = \{2,7,8\}。但耳朵尖尖列表变为E = \{4,6,9\}

凸出点 C = \{0,1,5,6,9\}
反射点 R = \{2,7,8\}
耳朵尖尖 E = \{4,6,9\}
三角形 T_0=<2,3,4>,T_1=<2,4,5>

如此重复直到将多边形全部三角化,得到三角形
T_0=<2,3,4>,T_1=<2,4,5>,T_2=<2,5,6>,T_3=<2,6,7>,T_4=<8,9,0>,T_5=<8,0,1>,T_6=<1,2,7>,T_7=<7,8,1>

分解后的多边形

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容