计算几何笔记
老生常谈
注意精度;
二分控制次数。
凸包
三维凸包
三维凸包本质上和二维凸包一样,是一个包裹了所有关键点的最小凸多面体。
增量法
我们先考虑三维凸包的存储:
首先,在没有共面点的情况下,可以用一堆三角形来存储;若有共面,则加入扰动。
其次,每个三角形的三条边都有方向,边会按照 a-b,b-c,c-a 的顺序来存储,取决于 a、b、c 的顺序。
第三,对于每条边,它必然被两个三角形包含,而且两个三角形中这条边的方向恰好相反。
于是,我们每次加入一个点的时候,枚举每个面,判断一下这个点在哪些面的上方,然后对这些面的每一条边都打上带方向的标记,而当一条边被两个方向都标记的时候,说明相邻的两个面都被看到了,这条边也就没用了,只有一个方向被标记的边就会是新的凸包上的边。然后注意一下新加入的边的顺序。
不难发现面数总共是 \(O(n)\) 级别的,总复杂度 \(O(n^2)\)。
更高明的做法
不会。