算法5B-----凸包2
r.graham scan(葛立桓)
- 1972
- 波音公司
- 数字情种 P .Erados
- 金芳蓉
graham scan : pre sorting
-
polar angle : 极坐标系,3、4、5、6、6、7、8分别与极坐标系构成的极角,进行排序
-
但是极角并不需要逐一算出来排序,实际是在判断谁在谁之前
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BALBlKmp-1602548490796)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201013063404056.png)]
-
采用Toleft(1,5,7)方法,溢出的可能性是更小的
scan
数据结构是两个栈,u是s的栈顶,v是s的次栈顶,w是t的栈顶
- while (!T.empty())
- toLeft(U,V,W) ? // 向左拐弯的
- s.push(T.pop()):
- s.pop();
example
- 如果是环形凸包,一系列二节棍连接起来了
- 最后存储的就是那一系列的点
更详细的解释
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QU9sIAeD-1602548490797)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201013064416577.png)]
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-om6Aqpgc-1602548490798)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201013064545257.png)]
- toLeft(3,4,5) 是右拐的,会把s中的栈顶4pop掉,删除掉
- 4号点被1,3,5包含在里面,这种点会被封杀掉
-
考虑6号点时,5号点又被封杀
-
考虑8号点时,7号点被封杀
-
T栈空了,即结束,s栈中的元素就是结果,结果也是封闭的
复杂度
-
退出的点绝对不会回去
-
大概是线性的
-
内部端点不会有交线,是一种平面图planar graph
-
欧拉 v-e+f-c = 1
-
e = O(n)
-
f = O(n)
-
pre sorting是不能去掉的,时间复杂度的大头是O(nlogn),但是是算法的下界
-
为什么不能去掉,可能会构成螺旋线,
新的解法
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EbacfIek-1602548490800)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201013071403831.png)]
- 找出左边的极点,右边的极点
- 做个假想的实验,相对于y轴负无穷远,就是一系列的平行线,此时比较的就是每个点的x轴坐标,就得到了upper hull上凸包
- 反过来,正无穷,就是lower hull下凸包
guarding the great wall
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dLro2VB3-1602548490801)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201013072518704.png)]
- 进入S栈,并且在栈顶以下待过,即非栈顶位置
- 这样的点就可以作为烽火台的位置,
- 需要注意的是最终结果的点并不是构成凸包的点,最终的凸包是x、j、k,而k点不是,因为k点处在栈顶,而中间的A、B、G、H又是属于的,因为曾经是作为toLeft进入过s栈的,并且在进入s栈后,又有另一个元素进来,将它压入了栈顶之下
art gallery
- 监控覆盖整个画廊,同时监控点最少
art gallery theorem
- v. chvatal 1975
- n/3 向下取整
- 每一个齿尖都需要一个哨兵
fisk’s proof
- 三角剖分
- triangulation
- 内部三角形的中点的连线(连接对偶的点),dual graph 对偶
- 一般情况下,得到的dual graph是二叉树
- 用三染色法,每次三角面片上的点的颜色是不一样的
- 三角面片反转时,可能会出现两种可能
- 经过三染色后,任意一种颜色的顶点都可以选为哨兵
polygon taiangulation
- ?三角剖分总是存在的吗
ear
-
empty + convex = ear
-
dirty
-
empty + reflex = mouth
-
ear - cutting
-
数学归纳
-
任何多边形至少有一个耳朵
-
怎么找到耳朵
monotone chain/polygon
- 单调链/多边形
triangulating a monotone polygon : 1A (same side + reflex)
- sweepline 扫描线算法,每个点作为一个事件处理一下
- 所有的点都在同一侧,又是reflex,此时s.push
- 此时没有耳朵,注意考虑的是局部
1B(same side + convex)
- 扫描线,扫到栈顶、次栈顶和新扫描的点,构成一个三角形
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ZmQA6qn-1602548490801)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201013080043005.png)]
2 (opposite side)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wOyz6j1s-1602548490802)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201013081244397.png)]
demo
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZAn27JiR-1602548490803)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201013081414417.png)]
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YDReyOyL-1602548490803)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201013081535526.png)]
monotone decomposition
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5e6AOTM-1602548490804)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201013081921109.png)]
- stalacTite 钟乳石
- stalagMite 石笋