当前课程知识点:计算几何 > 01. Convex Hull > J. Graham Scan: Analysis > 01-J-04. Simplification
我们刚才介绍的Graham Scan算法
实际上不光可以
用来计算凸包
还可以用来做
很多很多很多事情
它就像一个母鸡一样
可以下出很多个小鸡
生出很多个新的算法
那么为此的话
我们也有必要对Graham Scan
来做一个进一步的推广
我们会发现
可以从很多角度对它进行简化
从而使得我们
做其它的推广的时候
更加地便利
甚至是直接就可以加以利用
我们来看一下
首先要解决的一个事情
就是在Graham Scan中
我们要做那个presorting
就是我们前面讲过的
无可厚非
我们甚至证明过
这一步是不能省掉的
万万不能省掉的
现在的问题是这个presorting
应该怎么做啊
其实在前面
我们已经给出了答案
我在这里再重复一遍
我们说你与其去算
各种各样的夹角
通过比如说三角函数
然后去求反的三角函数
真的求出这个角
并且进行这个大小的比较
不如改用一个更好的办法
因为前面那些方法
不仅计算量大
而且因为误差的缘故
非常地不可靠 不稳定
那么可靠的方法是什么呢
就是我们刚才所说的
你不妨就套用此前
你已经研究有素
写得非常成熟
包括别人已经
提供的现成的排序的算法
你要做的事情就是两点
把那些元素改变成点
再接下来把比较器
改为我们这里
所说的To-Left test就可以
就这样简单
好 经过了这样的
一个简化了以后
我们确实可以更加简明
更加高效地来完成presorting
但是也有的时候
在一些应用场合中
我们会发现这个presorting
刚才那种形式的
按照角度的presorting
有可能是多余的
比如说在很多场合下
我们处理的点集
可能天生的就已经
有某种次序了
最常见的形式
在笛卡尔坐标(系)里头
那就是有可能
这些点已经按照
比如像这里的x方向
或者旋转以后的y方向排好序了
在这种情况下
你会非常地难以割舍
你会觉得前人
包括你的同伴
已经对这个数据
做了这样的规整了
而我居然要把这些
现有的东西扔掉
然后重新按照角度
这样一个新的口径
来对它进行排序
难道这不是有一些
让你很纠结吗
如果是这样的话
那我们告诉你有个好消息
其实你不用那么纠结
实际上你完全可以
就利用这种现有的这种结果
直接的来做Graham Scan中
那个后续的
只需要线性时间的
那个狭义的Scan那个过程
为什么能这样做呢
包括具体地怎么做呢
其实这也是在计算几何中
很重要的一个方法论
也就是说你不要急于去
改变什么东西
比如说上手就写一大堆程序
或者做一大堆推导
不是这样的
首先要让你的心定下来
首先要打开你的眼睛去观察
而且这种观察
必须是透过这样的一个图景
看到更深邃的东西
这是一种能力
我们来看看在这个例子上讲
我们怎么来改变我们的视角
将这样的一种有序
重新的来理解呢
并且使得它能够跟我们
前面讲过的那种
常规的那种
常规的排序对上号呢
你不妨在此也停留一段
通过这样的一个图
作为启发来思考一下
你能不能想到
这样对应的方法
好了 现在我们来看看你的方法
是不是和我的方法是一样的
这个方法其实就是在眼睛上
在你的视线上
你的立足点上
你的观察点上做了一个调整
也就是说我们来想象一下
在地下一直通往地球的中心
甚至还要一直通下去
也就是我们常规说的
如果有一根垂直的y轴的话
负无穷远的那个位置上的
那个假想的点
这个点离我们非常非常地遥远
就像太阳离地球很遥远一样
所以当我们看它的时候
往往会发现
其实所有的点通往它的联线
已经几乎是平行的了
在数学上讲
其实它就是不折不扣地平行
而这种平行以后会怎么样呢
你就会发现
其实它就是按照我们刚才
x方向的这样的
一个排序的次序来排序的
也就是说
我们刚才这个输入的集合
如果是已经按照x方向
这样的水平的有序了的话
那么其实它也等效于
我们相对于刚才那个足够深的
无穷远的那个地方的
那个点作为中心而言的
极角排序
二者难道不是一码事吗
如果你能想清楚这一点
下面的事情就豁然开朗了
因为我们此前的那个排序
既然是如此
那么我们接下来就可以
从右到左来模拟
刚才的那种逆时针的
Graham Scan扫描
那么这里当然相关地
还有一个技术问题
就是刚才我们说的那个
To-Left测试
在这里头是什么呢
回去验证一下
其实不折不扣地
就对应于x坐标的比较
x坐标是否在左边
就意味着是to left
反之就是to right
二者又是一次巧合
好 按照刚才的那个思路
我们按照那样一个假想的
极角排序
从最初 其实在这里讲
其实就是从最右到次右
一直向左渐行渐远 直到最终
到最左的那个点
整个这个过程
我们可以完全套用Graham Scan
那个算法 那个循环
也就是说我们这样
会得到一个凸包
请注意这个凸包不同就在于
因为你这个地方开口
是在负无穷远
所以它实际上得到的
只是我们常规意义上
这个凸包的
上边的一半
也就是由它的最左点
必然是个极点了
以及它的最右点
当然也是一个极点了
分界的 上边的那一段
这样的一段
我们称它叫做upper hull
上凸
还缺什么呢 不要忘了
我们最开始说的事情
大事化小 小事化了
我们整个这个凸包的工作
我们在这里头又分成了两件小事
其实我们刚才已经解决了一个小事
就是构造出上凸包
而下凸包呢
表面看是一个小事
但实际上它的形式
和前面那个小事
是完全一样的
只不过是掉了一个个
对称而已
你应该能想象到什么方法
没错 这个时候你不妨假想地
在天上无穷远的那个位置上
也有一个点
这样的话所有这些点
关于x方向的逆序
就变成了对它而言的
CCW的角度序
你在从它的意义上讲的
第一个点
第二个点由
也就是我们说的从左到右
再做一次Graham Scan
你就会得到下边这个凸包
这个凸包
我们称之为lower hull
upper hull、lower hull
在最左点和最右点
这两个位置上缝合起来
然后呢
就得到了整个的Graham Scan(的结果)
-Before we start
--html
-Evaluation
--html
-Online Judge
--html
-Lecture notes
--html
-Discussion
--html
-A. History of This Course
--00-A. History of This Course
-B. What's Computational Geometry
--00-B. What's Computational Geometry
-B. What's Computational Geometry--作业
-C. How to Learn CG Better
--00-C. How to Learn CG Better
-C. How to Learn CG Better--作业
-D. Why English
-A. Convexity
-A. Convexity--作业
-B. Extreme Points
-B. Extreme Points--作业
-C. Extreme Edges
-C. Extreme Edges--作业
-D. Incremental Construction
--01-D-01. Decrease and Conquer
--01-D-02. In-Convex-Polygon Test
--01-D-03. Why Not Binary Search
-D. Incremental Construction--作业
-E. Jarvis March
--01-E-06. Lowest-Then-Leftmost
-E. Jarvis March--作业
-F. Lower Bound
--01-F-02. CAO Chong's Methodology
-F. Lower Bound--作业
-G. Graham Scan: Algorithm
-G. Graham Scan: Algorithm--作业
-H. Graham Scan: Example
-H. Graham Scan: Example--作业
-I. Graham Scan: Correctness
-I. Graham Scan: Correctness--作业
-J. Graham Scan: Analysis
-J. Graham Scan: Analysis--作业
-K. Divide-And-Conquer (1)
-K. Divide-And-Conquer (1)--作业
-L. Divide-And-Conquer (2)
--01-L-03. Topmost + Bottommost ?
--01-L-07. More Considerations
-L. Divide-And-Conquer (2)--作业
-M. Wrap-Up
-0. Introduction
-0. Introduction--作业
-A. Preliminary
-A. Preliminary--作业
-B. Interval Intersection Detection
-B. Interval Intersection Detection--作业
-C. Segment Intersection Reporting
-C. Segment Intersection Reporting--作业
-D. BO Algorithm: Strategy
--02-D-01. Proximity & Separability
--02-D-02. Comparability & Ordering
-D. BO Algorithm: Strategy--作业
-E. BO Algorithm: Implementation
--02-E-03. Events & Operations
-E. BO Algorithm: Implementation--作业
-F. BO Algorithm: Analysis
--02-F-04. Complexity of Event Queue
--02-F-05. Complexity of Status Structure
-F. BO Algorithm: Analysis--作业
-G. Convex Polygon Intersection Detection
--02-G-01. Problem Specification
--02-G-02. Monotone Partitioning
--02-G-04. Decrease-And-Conquer
-G. Convex Polygon Intersection Detection--作业
-H. Edge Chasing
--02-H-01. Eliminating Sickles
-H. Edge Chasing--作业
-I. Plane Sweeping
-I. Plane Sweeping--作业
-J. Halfplane Intersection Construction
-J. Halfplane Intersection Construction--作业
-0. Methodology
-0. Methodology--作业
-A. Art Gallery Problem
--03-A-02. Lower & Upper Bounds
--03-A-04. Approximation & Classification
-A. Art Gallery Problem--作业
-B. Art Gallery Theorem
--03-B-01. Necessity of floor(n/3)
--03-B-02. Sufficiency by Fan Decomposition
-B. Art Gallery Theorem--作业
-C. Fisk's Proof
--03-C-04. Pigeon-Hole Principle
-C. Fisk's Proof--作业
-D. Orthogonal Polygons
--03-D-01. Necessity of floor(n/4)
--03-D-02. Sufficiency by Convex Quadrilateralization
-D. Orthogonal Polygons--作业
-E. Triangulation
-E. Triangulation--作业
-F. Triangulating Monotone Polygons
--03-F-02. Monotonicity Testing
--03-F-04. Stack-Chain Consistency
-F. Triangulating Monotone Polygons--作业
-G. Monotone Decomposition
-G. Monotone Decomposition--作业
-I. Tetrahedralization
--03-I-01. Polyhedron Decomposition
--03-I-02. Schonhardt's Polyhedron
-I. Tetrahedralization--作业
-A. Introduction
--04-A-02. Dining Halls on Campus
--04-A-03. More Analogies & Applications
-A. Introduction--作业
-B. Terminologies
--04-B-02. Intersecting Halfspaces
--04-B-04. Planar Voronoi Diagram
-B. Terminologies--作业
-C. Properties
--04-C-03. Nearest = Concyclic
--04-C-04. Number of Nearest Sites = Degree
-C. Properties--作业
-D. Complexity
-D. Complexity--作业
-E. Representation
-E. Representation--作业
-F. DCEL
-F. DCEL--作业
-G. Hardness
--04-G-03. Voronoi Diagram In General Position
-G. Hardness--作业
-H. Sorted Sets
--04-H-01. Convex Hull Made Easier
--04-H-02. Convex Hull As A Combinatorial Structure
--04-H-03. Voronoi Diagram As A Geometric Structure
-H. Sorted Sets--作业
-I. VD_sorted
--04-I-06. Sorting Not Made Easier
-I. VD_sorted--作业
-J. Naive Construction
-J. Naive Construction--作业
-K. Incremental Construction
-K. Incremental Construction--作业
-L. Divide-And-Conquer
--04-L-09. Intersecting with Cells
-L. Divide-And-Conquer--作业
-M. Plane-Sweep
--04-M-09. Circle Event: What, When & Where
-M. Plane-Sweep--作业
-A. Point Set Triangulation
-A. Point Set Triangulation--作业
-B. Delaunay Triangulation
-B. Delaunay Triangulation--作业
-C. Properties
-C. Properties--作业
-D. Proximity Graph
--05-D-02. Relative Neighborhood Graph
-D. Proximity Graph--作业
-E. Euclidean Minimum Spanning Tree
-E. Euclidean Minimum Spanning Tree--作业
-F. Euclidean Traveling Salesman Problem
-G. Minimum Weighted Triangulation
-G. Minimum Weighted Triangulation--作业
-H. Construction
--05-H-03. Maximizing The Minimum Angle
--05-H-04. Evolution By Edge Flipping
-H. Construction--作业
-I. RIC With Example
-I. RIC With Example--作业
-J. Randomized Incremental Construction
--05-J-01. Recursive Implementation
--05-J-02. Iterative Implementation
-J. Randomized Incremental Construction--作业
-K. RIC Analysis
--05-K-04. Types Of Edge Change
--05-K-05. Number Of Edge Changes
--05-K-07. Number Of Rebucketings
--05-K-08. Probability For Rebucketing
--05-K-10. Further Consideration
-0. Online/Offline Algorithms
--06-0. Online/Offline Algorithms
-0. Online/Offline Algorithms--作业
-A. Introduction
--06-A-03. Assumptions For Clarity
--06-A-05. Performance Measurements
-A. Introduction--作业
-B. Slab Method
--06-B-02. Ordering Trapezoids
-B. Slab Method--作业
-C. Persistence
--06-C-01. Ephemeral Structure
--06-C-02. Persistent Structure
-C. Persistence--作业
-D. Path Copying
--06-D-03. Storage Optimization
-D. Path Copying--作业
-E. Node Copying
-E. Node Copying--作业
-F. Limited Node Copying
-G. Kirkpatrick Structure
--06-G-01. Optimal And Simpler
--06-G-06. The More The Better
--06-G-07. The Fewer The Better
--06-G-09. Existence Of Independent Subset
--06-G-10. Construction Of Independent Subset
-G. Kirkpatrick Structure--作业
-H. Trapezoidal Map
--06-H-03. Properties & Complexity
--06-H-04. Search Structure: Example
--06-H-05. Search Structure: Nodes
--06-H-06. Search Structure: Performance
-H. Trapezoidal Map--作业
-I. Constructing Trapezoidal Map
--06-I-04. Case 1: Two Endpoints
--06-I-05. Case 2: One Endpoint
--06-I-06. Case 3: No Endpoints
-J. Performance Of Trapezoidal Map
--06-J-03. Number Of Ray Trimmed
--06-J-04. Number Of Trapezoidals Created (1)
--06-J-05. Number Of Trapezoidals Created (2)
--06-J-06. Time For Point Location
--06-J-07. Size Of Search Structure
--06-J-08. Fixed Query Point + Randomly Created Maps
--06-J-10. Probability Of Enclosing Trapezoid Changed
-A. Range Query
--07-A-01. 1-Dimensional Range Query
-A. Range Query--作业
-B. BBST
--07-B-02. Lowest Common Ancestor
-B. BBST--作业
-C. kd-Tree: Structure
-C. kd-Tree: Structure--作业
-D. kd-Tree: Algorithm
-D. kd-Tree: Algorithm--作业
-E. kd-Tree: Performance
--07-E-01. Preprocessing Time + Storage
-E. kd-Tree: Performance--作业
-F. Range Tree: Structure
--07-F-03. x-Query * y-Queries
-F. Range Tree: Structure--作业
-G. Range Tree: Query
-G. Range Tree: Query--作业
-H. Range Tree: Performance
-H. Range Tree: Performance--作业
-I. Range Tree: Optimization
--07-I-04. Fractional Cascading
-A. Orthogonal Windowing Query
-A. Orthogonal Windowing Query--作业
-B. Stabbing Query
-C. Interval Tree: Construction
-C. Interval Tree: Construction--作业
-D. Interval Tree: Query
-D. Interval Tree: Query--作业
-E. Stabbing With A Segment
--08-E-03. Query Algorithm (1)
--08-E-04. Query Algorithm (2)
-F. Grounded Range Query
--08-F-03. 1D-GRQ Using Range Tree
--08-F-04. 1D-GRQ By Linear Scan
-G. 1D-GRQ Using Heap
-G. 1D-GRQ Using Heap--作业
-H. Priority Search Tree
--08-H-03. Sibling Partitioning
-H. Priority Search Tree--作业
-I. 2D-GRQ Using PST
-I. 2D-GRQ Using PST--作业
-J. Segment Tree
--08-J-01. General Windowing Query
--08-J-02. Elementary Interval
--08-J-06. Solving Stabbing Query
--08-J-11. Constructing A Segment Tree
--08-J-12. Inserting A Segment (1)
--08-J-13. Inserting A Segment (2)
--08-J-14. Inserting A Segment (3)
-K. Vertical Segment Stabbing Query