计算三维点集凸包的所有面,要求无四点共面,所有面朝外,复杂度 O(n^2)。
Description: Computes all faces of the 3-dimension hull of a point set. No four points must be coplanar, or else random results will be returned. All faces will point outwards. Time: O(n^2) Status: tested on SPOJ CH3D
-
算法与实现(依据代码)
- 类型:P3 = Point3D
,F = {P3 q; int a,b,c;} 表示一个面(q 为法向量,a/b/c 为顶点索引)。 - 边对结构 PR:每条边最多被两个面使用(ins/rem/cnt)。
- 初始化:选取前4个点构建初始4个三角形面(通过枚举 i<j<k 并以第四个点调整法向)。
- 增量构建:对每个后续点 i(从第5个起):
- 删除所有”法向量指向新点”的面(即 f.q.dot(A[i]) > f.q.dot(A[f.a]) 的面),并从边对中移除对应边;
- 对剩余面的边界(E(a,b).cnt() != 2 的边),以新点 i 与该边构成新三角形面,并添加到 FS。
- 后处理:调整每个面的 b/c 顺序,使法向量 q 与实际几何方向一致(通过叉积与点积检查)。
- 类型:P3 = Point3D
-
关键约束
- 输入点集大小 ≥ 4,且任意四点不共面;否则结果未定义。
-
输出
- 返回 vector
,每个 F 代表一个朝外的三角形面。
- 返回 vector