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

  2. 核心概述 将点 r 在以线段 p0-p1 到 q0-q1 的成对对应下做一次“平移+旋转+等比缩放”的二维线性变换(含刚体与相似的统一表达)。

  3. 原文引述

Apply the linear transformation (translation, rotation and scaling) which takes line p0-p1 to line q0-q1 to point r. Status: not tested

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

    • 目标:构造唯一的二维仿射变换 T,使得 T(p0)=q0,且 T(p1) 位于以 q0 为起点、方向与 q1−q0 相同的射线上,并满足长度按比例缩放与方向旋转保持一致,从而把直线 p0-p1 映射为 q0-q1。
    • 语义:这是一类特殊的仿射变换,可分解为“以 p0 为参考将向量 r−p0 先旋转缩放到与 q1−q0 同向且按比例,然后整体平移到 q0”。
  • 接口/字段说明(据实现约定)

    • 函数签名:P linearTransformation(const P& p0, const P& p1, const P& q0, const P& q1, const P& r)
    • 类型约定:P=Point;支持向量运算、点积 dot、叉积 cross、平方长度 dist2 等。
    • 几何量:
      • dp = p1 − p0,dq = q1 − q0:源与目标方向向量
      • 比例与旋转通过复数乘法等价实现:对 v = r − p0 进行“以 num = (dp × dq, dp · dq) 为复数”的复乘,再以 |dp|² 为分母归一
      • 平移:最后加上 q0
  • 核心流程与要点(复数视角)

    1. 方向与尺度提取
      • 源方向:dp,目标方向:dq
      • 旋转角 θ 与尺度 s 由 dq = s·R(θ)·dp 给出,其中
        • cos θ = (dp·dq)/(|dp||dq|),sin θ = (dp×dq)/(|dp||dq|)
        • s = |dq|/|dp|
    2. 复乘实现
      • 令 v = r − p0,把 v 看作复数 v_x + i v_y
      • 令 num = (dp × dq) + i (dp · dq)(注意实现中把实部/虚部的对应可能相反,但总体等价)
      • v’ = v ⊗ num / |dp|² 完成“旋转+缩放”
      • r’ = q0 + v’
    3. 返回 r’
  • 复杂度与边界条件

    • 时间复杂度:O(1)
    • 退化情形:
      • |dp|² = 0(p0==p1)无定义,分母为 0;应在调用侧规避
      • 若 |dq| = 0,则所有点被压缩到 q0(纯退化缩放)
    • 数值与精度:
      • 使用 double;叉积/点积在中间步骤涉及乘法,输入坐标过大时需注意精度
      • 对非常小的 |dp| 需要阈值判断以避免数值爆炸
  • 变体与扩展

    • 仅刚体变换(纯旋转+平移):约束 s=1,可将 dq 归一到 |dq|=|dp|
    • 仅旋转或仅缩放:分别固定比例或角度
    • 三点确定一般仿射:若需剪切/非相似变换,可改为以三对点确定 2×2 仿射矩阵与平移项
    • 三维推广:可用四元数/旋转矩阵实现最小旋转配准,线段配准需额外约束
  • 正确性要点与直觉

    • 以“源基向量 dp”对齐到“目标基向量 dq”,任何 r−p0 都能在该基下做相同的线性变换
    • 使用复数乘法同时编码旋转与缩放,不引入数值不稳定的三角函数反求
  • 与相邻技术的对比和取舍

    • 039-几何-点:作为基本向量代数实体的操作对象
    • 034-几何-直线相交:线的代数表示常与线性变换配合,用于坐标系切换后再求交
    • 若需要矩阵形态或批量应用,可将该过程改写为 2×2 矩阵 + 平移向量的形式,并对多点统一左乘
  • 工程实践注意

    • 统一坐标单位与量纲,避免混用角度/弧度或不同尺度
    • 对近退化的 dp、dq 做 eps 判定与分支处理
    • 在可视化/调试中打印中间的 dp、dq、num 与 |dp|²,有助排查方向反转或比例异常
  1. 关联节点