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

  2. 核心概述 二维点/向量的统一抽象,提供加减、数乘、点积/叉积、旋转、单位化等基础算子,作为所有平面几何模块的共同基石。

  3. 原文引述

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

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

    • Point 同时表示“点”(位置)与“向量”(位移),在计算几何中二者以同一代数结构处理。
    • 常用坐标类型:
      • long long:离散/整数几何,方向判定与相等性稳健;需注意中间量溢出;
      • double/long double:连续几何/需要浮点运算,精度由 eps 控制。
    • 语义约定:本文所有“向量运算”均以原点为默认参考;涉及线段/直线时,显式以差向量构造。
  • 数据成员与基本接口(据实现)

    • 成员: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 构成三角形面积。
    • 旋转与法向:
    • 单位化与零向量:
      • 对 |v|≈0 的向量 unit() 未定义或数值不稳定;工程上以 eps 判零并分支。
    • 角度:
      • angle() 以原点为参照;若需绕点 c 旋转/取角,应先平移为 p−c 再使用。
  • 复杂度与边界条件(数值、溢出、精度)

    • 时间:所有基本操作 O(1)。
    • 整数几何:
      • cross/dot 可能产生“三乘”或“平方和”,坐标范围大时用内置 128 位或长浮点过渡;
      • 比较与相等可直接使用 ==,避免误差。
    • 浮点几何:
      • 统一 eps(如 1e−9)做“近零/近等”判定;避免不同模块阈值不一致;
      • 旋转与单位化对数值敏感,尽量用 long double 保持精度。
    • 单位一致性:保证输入在统一坐标系/量纲下;混用像素/米等会导致结果不可解释。
  • 变体/扩展与协同

  • 正确性要点与不变式

    • 代数一致性:加减与数乘满足交换/结合/分配等线性空间公理;dot/cross 与旋转、长度关系遵循标准向量恒等式。
    • 几何一致性:通过差向量构造关系,避免“坐标系原点不同”造成的偏移错误。
    • eps 策略:所有涉及比较的上层算法应从一个统一来源取得 eps,以保证跨模块一致。
  • 与相邻技术的对比与取舍

    • 以复数表示 2D 向量亦可实现旋转(复乘)等操作;Point 类直观,且与整型坐标/模板泛化更兼容。
    • 矩阵/仿射框架适合批量线性变换(见 031-几何-线性变换);基础几何原语仍建议以 Point 表达。
  1. 关联节点