-
YAML 元数据 已设置 tags: [KACTL, 几何, 核心实体]。
-
核心概述 二维点/向量的统一抽象,提供加减、数乘、点积/叉积、旋转、单位化等基础算子,作为所有平面几何模块的共同基石。
-
原文引述
Description: Class to handle points in the plane. T can be e.g. double or long long. (Avoid int.) Status: Works fine, used a lot
- 展开阐述
-
定义与背景
- Point
同时表示“点”(位置)与“向量”(位移),在计算几何中二者以同一代数结构处理。 - 常用坐标类型:
- long long:离散/整数几何,方向判定与相等性稳健;需注意中间量溢出;
- double/long double:连续几何/需要浮点运算,精度由 eps 控制。
- 语义约定:本文所有“向量运算”均以原点为默认参考;涉及线段/直线时,显式以差向量构造。
- Point
-
数据成员与基本接口(据实现)
- 成员:T x, y。
- 比较:
- operator<:按 (x,y) 词典序;用于排序/集合键;
- operator:按 (xx && y==y) 判断(整数稳健,浮点需配合 eps 做近等)。
- 算术:
- 加减:p±q 分别为向量/点的逐分量加减;
- 标量乘除:p*k、p/k(k 为同类型或可转换的标量)。
- 几何原语:
- dot(q) = xq.x + yq.y
- cross(q) = xq.y − yq.x
- cross(a,b) = (a−this).cross(b−this)(三点有向面积的 2 倍)
- dist2() = x² + y²;dist() = sqrt(dist2())。
- 向量操作:
- angle() = atan2(y, x) ∈ [−π, π]
- unit():单位化向量 v/|v|
- perp():顺时针旋转 90°,(-y, x)
- normal():perp().unit()(单位法向)
- rotate(a):绕原点逆时针旋转角 a(弧度)
-
核心流程/要点(算子语义与一致性)
- 点/向量统一:几何关系通过差向量表达,例如直线方向 v = b−a,线段交/点线距离均以 v 与其他向量的 dot/cross 组合给出。
- 方向与面积:
- cross(u, v) 的符号决定“u 到 v 的有向转角”正负;|cross|/2 等于由 u、v 构成三角形面积。
- 旋转与法向:
- perp 相当于与 v 正交的法向,长度等于 |v|;与投影/反射等模块搭配常见(见 035-几何-线的投影与反射)。
- 单位化与零向量:
- 对 |v|≈0 的向量 unit() 未定义或数值不稳定;工程上以 eps 判零并分支。
- 角度:
- angle() 以原点为参照;若需绕点 c 旋转/取角,应先平移为 p−c 再使用。
-
复杂度与边界条件(数值、溢出、精度)
- 时间:所有基本操作 O(1)。
- 整数几何:
- cross/dot 可能产生“三乘”或“平方和”,坐标范围大时用内置 128 位或长浮点过渡;
- 比较与相等可直接使用 ==,避免误差。
- 浮点几何:
- 统一 eps(如 1e−9)做“近零/近等”判定;避免不同模块阈值不一致;
- 旋转与单位化对数值敏感,尽量用 long double 保持精度。
- 单位一致性:保证输入在统一坐标系/量纲下;混用像素/米等会导致结果不可解释。
-
变体/扩展与协同
- 极坐标接口:可在此类上扩展 toPolar()/fromPolar(r, θ) 便于与角/半径问题互转。
- 与整数格点运算:可增加整除/约分获得方向的最简整向量(如用于哈希)。
- 与其他模块协作:
- 032-几何-点线距离、034-几何-直线相交、035-几何-线的投影与反射、048-几何-线段相交 均复用 dot/cross。
- 与 025-几何-凸包、028-几何-凸包直径 等要求严格方向判定的算法共享符号语义。
-
正确性要点与不变式
- 代数一致性:加减与数乘满足交换/结合/分配等线性空间公理;dot/cross 与旋转、长度关系遵循标准向量恒等式。
- 几何一致性:通过差向量构造关系,避免“坐标系原点不同”造成的偏移错误。
- eps 策略:所有涉及比较的上层算法应从一个统一来源取得 eps,以保证跨模块一致。
-
与相邻技术的对比与取舍
- 以复数表示 2D 向量亦可实现旋转(复乘)等操作;Point 类直观,且与整型坐标/模板泛化更兼容。
- 矩阵/仿射框架适合批量线性变换(见 031-几何-线性变换);基础几何原语仍建议以 Point 表达。
- 关联节点