1. YAML 元数据 已设置 tags: [KACTL, 几何, 核心实体]。

  2. 核心概述 三维点/向量的统一抽象,提供加减、数乘、点积、叉积、罗德里格斯旋转、单位化与方位/极角等操作,是空间几何判定与构造(法向、共线/共面、体积)的基础。

  3. 原文引述

Description: Class to handle points in 3D space. T can be e.g. double or long long. Status: tested, except for phi and theta

  1. 展开阐述
  • 定义与背景

    • Point3D 同时表示“空间点”(位置)与“向量”(位移),以统一代数结构支撑 3D 计算几何。
    • 常用类型:
      • long long:离散/整数几何,方向与相等稳健;需关注中间量溢出;
      • double/long double:连续几何/需要旋转与单位化时使用,以 eps 控制比较。
    • 典型适用场景:法向计算、共线/共面判定、直线/平面角度、刚体旋转、体积与几何优化(如 017-几何-三维凸包046-几何-多面体体积)。
  • 数据成员与基础接口(据实现)

    • 成员: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(罗德里格斯公式)。
  • 核心流程/要点(空间判定与构造)

    1. 共线与共面
      • 共线:|u×v| ≈ 0(两向量平行/同向/反向);
      • 共面:混合积(标量三重积)零判:mix(u, v, w) = u·(v×w) ≈ 0。
    2. 法向与平面
      • 已知平面内两非平行向量 a, b,平面法向 n = a×b;单位法向 n̂ = n.unit();
      • 点到平面距离:|n·(p−p0)|/|n|;符号由法向方向决定。
    3. 旋转(Rodrigues)
      • 设轴为单位向量 k,角度 θ,向量 v 旋转后
        • v’ = v cosθ + (k×v) sinθ + k(k·v)(1−cosθ)
      • 数值实现应保证 axis 预单位化,并对 |axis|≈0 早退。
    4. 直线与角度
      • 两向量夹角:cosθ = (u·v)/(|u||v|),注意对 |u|≈0 或 |v|≈0 的处理;
      • 平行判定:|u×v| ≤ eps;垂直判定:|u·v| ≤ eps。
    5. 体积与方向
      • 有向平行六面体体积: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:向量在给定方向上的投影与分量;
    • 与其他模块协同:
  • 正确性要点与不变式

    • 线性代数一致性:dot/cross/mix 满足标准恒等式(如 u·(v×w) = v·(w×u) = w·(u×v));
    • 方向不变式:右手定则决定叉积方向,保持面法向与体积符号一致;
    • 归一化前置:涉及角度/旋转/投影的计算需对用于尺度的向量做单位化,避免量纲混淆。
  • 与相邻技术的对比与取舍

    • 四元数旋转 vs. 罗德里格斯:四元数数值更稳健、可组合,但实现更重;Rodrigues 简洁、与向量原语一致;
    • 矩阵形式适合批量/级联变换;Point3D 原语便于内联几何推导。
  1. 关联节点