-
YAML 元数据 已设置 tags: [KACTL, 几何, 核心实体]。
-
核心概述 三维点/向量的统一抽象,提供加减、数乘、点积、叉积、罗德里格斯旋转、单位化与方位/极角等操作,是空间几何判定与构造(法向、共线/共面、体积)的基础。
-
原文引述
Description: Class to handle points in 3D space. T can be e.g. double or long long. Status: tested, except for phi and theta
- 展开阐述
-
定义与背景
- Point3D
同时表示“空间点”(位置)与“向量”(位移),以统一代数结构支撑 3D 计算几何。 - 常用类型:
- long long:离散/整数几何,方向与相等稳健;需关注中间量溢出;
- double/long double:连续几何/需要旋转与单位化时使用,以 eps 控制比较。
- 典型适用场景:法向计算、共线/共面判定、直线/平面角度、刚体旋转、体积与几何优化(如 017-几何-三维凸包、046-几何-多面体体积)。
- Point3D
-
数据成员与基础接口(据实现)
- 成员:T x, y, z。
- 比较:
- operator<:按 (x,y,z) 词典序;用于排序/哈希键;
- operator==:坐标逐分量相等(浮点需配合 eps)。
- 算术:
- 向量加减:p±q;
- 数乘/数除:p*k、p/k(k 为标量)。
- 几何原语:
- 点积 dot(q) = xq.x + yq.y + z*q.z(长度、投影、夹角余弦);
- 叉积 cross(q) = (yq.z−zq.y, zq.x−xq.z, xq.y−yq.x),与两向量张成的有向面积相关;
- 长度:dist2() = x²+y²+z²,dist() = sqrt(dist2())。
- 空间操作:
- phi():平面投影到 xy 平面的方位角 atan2(y, x);
- theta():与 z 轴的极角 atan2(sqrt(x²+y²), z);
- unit():单位向量 v/|v|;
- normal(p):与自身和 p 都垂直的单位法向 cross(p).unit();
- rotate(angle, axis):绕单位轴 axis 逆时针旋转 angle(罗德里格斯公式)。
-
核心流程/要点(空间判定与构造)
- 共线与共面
- 共线:|u×v| ≈ 0(两向量平行/同向/反向);
- 共面:混合积(标量三重积)零判:mix(u, v, w) = u·(v×w) ≈ 0。
- 法向与平面
- 已知平面内两非平行向量 a, b,平面法向 n = a×b;单位法向 n̂ = n.unit();
- 点到平面距离:|n·(p−p0)|/|n|;符号由法向方向决定。
- 旋转(Rodrigues)
- 设轴为单位向量 k,角度 θ,向量 v 旋转后
- v’ = v cosθ + (k×v) sinθ + k(k·v)(1−cosθ)
- 数值实现应保证 axis 预单位化,并对 |axis|≈0 早退。
- 设轴为单位向量 k,角度 θ,向量 v 旋转后
- 直线与角度
- 两向量夹角:cosθ = (u·v)/(|u||v|),注意对 |u|≈0 或 |v|≈0 的处理;
- 平行判定:|u×v| ≤ eps;垂直判定:|u·v| ≤ eps。
- 体积与方向
- 有向平行六面体体积:V = u·(v×w);四面体体积 = |V|/6;
- 符号决定“右手系朝向”,用于一致性校验与面朝向判断(如 3D 凸包的内外法向)。
- 共线与共面
-
复杂度与边界条件(数值、溢出、精度)
- 时间:上述操作均为 O(1)。
- 整数几何:
- 叉积/混合积涉及“三乘/四乘”与加法,64 位可能溢出;建议 __int128/内建 128 位过渡或转用 long double 比较;
- 方向与相等可直接按整等式判定(无舍入误差)。
- 浮点几何:
- 统一 eps(如 1e−9 或随量级设定相对阈值)用于零判与相等;
- 旋转与单位化对数值敏感,axis 需单位化;对极小角度用泰勒近似可提升稳健性;
- phi/theta 在近极区(|z|≈|v| 或 |x|,|y|≈0)数值不稳定,应允许返回近似值并在上游容错。
- 坐标尺度与单位:保持单位一致(米/毫米),避免在体积/角度混合运算中放大误差。
-
变体/扩展与协同
- 提供 mix(u,v,w) 封装标量三重积,简化共面/体积计算;
- 增加 proj/comp:向量在给定方向上的投影与分量;
- 与其他模块协同:
- 046-几何-多面体体积:直接使用混合积/面分解;
- 017-几何-三维凸包:法向、面朝外性与共面/共线判定;
- 032-几何-点线距离 的 3D 版使用 |(p−a)×(b−a)|/|b−a|。
-
正确性要点与不变式
- 线性代数一致性:dot/cross/mix 满足标准恒等式(如 u·(v×w) = v·(w×u) = w·(u×v));
- 方向不变式:右手定则决定叉积方向,保持面法向与体积符号一致;
- 归一化前置:涉及角度/旋转/投影的计算需对用于尺度的向量做单位化,避免量纲混淆。
-
与相邻技术的对比与取舍
- 四元数旋转 vs. 罗德里格斯:四元数数值更稳健、可组合,但实现更重;Rodrigues 简洁、与向量原语一致;
- 矩阵形式适合批量/级联变换;Point3D 原语便于内联几何推导。
- 关联节点