-
YAML 元数据 已设置 tags: [KACTL, 几何, 核心实体]。
-
核心概述 将点 r 在以线段 p0-p1 到 q0-q1 的成对对应下做一次“平移+旋转+等比缩放”的二维线性变换(含刚体与相似的统一表达)。
-
原文引述
Apply the linear transformation (translation, rotation and scaling) which takes line p0-p1 to line q0-q1 to point r. Status: not tested
- 展开阐述
-
定义与背景
- 目标:构造唯一的二维仿射变换 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
-
核心流程与要点(复数视角)
- 方向与尺度提取
- 源方向:dp,目标方向:dq
- 旋转角 θ 与尺度 s 由 dq = s·R(θ)·dp 给出,其中
- cos θ = (dp·dq)/(|dp||dq|),sin θ = (dp×dq)/(|dp||dq|)
- s = |dq|/|dp|
- 复乘实现
- 令 v = r − p0,把 v 看作复数 v_x + i v_y
- 令 num = (dp × dq) + i (dp · dq)(注意实现中把实部/虚部的对应可能相反,但总体等价)
- v’ = v ⊗ num / |dp|² 完成“旋转+缩放”
- r’ = q0 + v’
- 返回 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|²,有助排查方向反转或比例异常
- 关联节点