第 7 章 极坐标系 (Polar Coordinate Systems)

      +

      核心结论

      • 2D 极坐标 = (距离 r, 角度 θ);与笛卡尔的互转靠 sin / cos;本质上描述"方向 + 距离",与向量语义天然契合。

      • 别名 (aliasing):同一空间有无穷多极坐标表达;canonical 形式r ≥ 0θ ∈ (-180°, +180°]r=0 ⇒ θ=0)保证每个点只有唯一表达。

      • 3D 极坐标分两种柱坐标 (r, θ, z)——加线性距离;球坐标 (r, θ, φ)——加角度。

      • heading / pitch 约定 (本书):h = 偏航(绕 y 轴,0° 朝 +z)、p = 俯仰(绕右臂轴,0° 水平,正值向下);与左手系 + 航空 / 游戏惯例对齐。

      • 球坐标别名 + 万向锁 (Gimbal lock):pitch = ±90° 时 heading 无意义(奇异点);游戏相机与四元数旨在规避。

      • 极坐标描述向量:与位置完全相同的算法,只是"从原点出发"换成"按给定方向走给定长度";物理书常用此约定描述力 / 位移。

      本章主旨

      本章补充笛卡尔之外的另一种坐标系——极坐标 / 柱坐标 / 球坐标。它们对"方向 + 距离"问题(雷达、相机朝向、地理定位、物理力)天然友好。理解别名 / canonical 形式是处理实际工程问题的前提(如相机控制、AI 追踪、空间索引)。第 8 章讲旋转表示时会再次碰到球坐标的万向锁问题。

      一、核心概念

      本章围绕 6 个核心概念展开:从 2D 极坐标出发,澄清别名与 canonical 形式,扩展到 3D 柱 / 球坐标,定义本书 heading / pitch 约定,最后给出极坐标描述向量的等价方法。

      概念 定义 + 重要性 实现提示

      2D 极坐标

      (r, θ):r = 距原点距离,θ = 与极轴(通常 +x)的夹角。描述"方向 + 距离",比笛卡尔更直观。

      §7.1.1;atan2(y, x) 给 θ、hypot(x, y) 给 r。注意 atan2 自动选象限。

      别名与 canonical 形式

      同一空间有无穷多极坐标表达((-r, θ+180°) = (r, θ) 等)。canonical 形式(r≥0, θ∈(-180°,180°])保证唯一性。

      §7.1.2;列表 7.1 C 代码给出了"to canonical"的算法。3D 球坐标需更复杂(heading + pitch)。

      柱坐标 (cylindrical)

      2D 极坐标 + 线性 z 轴:P = (r, θ, z);与笛卡尔的转换简单(z 直接、xy 走 §7.1.3 公式)。

      §7.3.1;柱形环境 / 圆柱体建模时自然。

      球坐标 (spherical)

      2D 极坐标 + 第二角度:P = (r, θ, φ)(数学界)或 (r, h, p)(本书)。最常见的 3D 极坐标。

      §7.3.2-§7.3.3;§7.3.5 转换公式。球坐标用在雷达、地理(lat/long)、相机空间。

      heading / pitch 约定 (本书)

      h = 水平偏航(绕 y 轴,0° 朝 +z,"北");p = 俯仰(绕右臂轴,0° 水平,正值向下)。匹配左手系 + 航空惯例。

      §7.3.3;§7.3.4 canonical 形式:r≥0、h∈(-180°,180°]、p∈[-90°,+90°];万向锁时 h=0。

      极坐标描述向量

      同一对 (r, θ) 可描述点(位移从原点出发)或向量(按方向走 r);算法只差"是否回到原点"。

      §7.4;物理书常用此约定描述力 / 速度 / 位移向量。

      二、详细笔记

      2.1 2D 极坐标 (2D Polar Space)

      What:用一对值 (r, θ) 描述 2D 平面上的点或向量:r = 距原点的距离,θ = 与极轴(通常 +x 方向)的夹角。

      Why:天然描述"距离 + 方向"的问题(雷达、相机视野、追逐目标);与日常用语"向东 10 公里"自然对应。

      How

      定位算法("两步走"):

      1. 从原点出发,面朝极轴方向;

      2. 逆时针旋转 θ(负值顺时针);

      3. 沿当前方向走 r 单位。

      笛卡尔 ↔ 极坐标互转(式 7-1,§7.1.3):

      \[x = r \cos\theta,\quad y = r \sin\theta\]
      \[r = \sqrt{x^2 + y^2},\quad \theta = \text{atan2}(y, x)\]

      atan2(y, x)atan(y/x) 鲁棒——自动处理象限。

      角度单位

      书中文本常用度(°),但代码侧必须用弧度(rad)。deg2rad = π/180rad2deg = 180/πatan2<cmath> 中返回弧度。

      When:雷达;枪口 / 炮塔朝向;AI 视锥检测;地理定位(极地投影)。

      Example:极坐标 (5, 30°) = 笛卡尔 (5cos30°, 5sin30°) ≈ (4.33, 2.5)

      2.2 别名与 Canonical 形式 (Aliasing & Canonical Form)

      What:同一空间点有无穷多极坐标表达;canonical 形式("标准型")保证唯一性。

      Why:相机控制、空间索引、几何查询都需要"同一点 = 同坐标"才能正确比较;别名会导致"`θ = 720°` 与 θ = 0° 被认为不同"的 bug。

      How

      别名规则(§7.1.2):

      \[(r, \theta) \equiv ((-1)^k r,\ \theta + k \cdot 180°),\quad k \in \mathbb{Z}\]

      常见特例:(-r, θ + 180°) ≡ (r, θ)(r, θ + 360°k) ≡ (r, θ)

      2D Canonical 形式约束:

      • r ≥ 0(不测负距离)。

      • θ ∈ (-180°, +180°](半开区间,+180° 用于"西"方向)。

      • r = 0 ⇒ θ = 0(原点处角度无意义,强制设为 0)。

      Canonical 转换算法(列表 7.1):

      1. r = 0 ⇒ θ = 0

      2. r < 0 ⇒ r := -r; θ := θ + 180°

      3. θ ≤ -180° ⇒ θ := θ + 360° 循环到范围内。

      4. θ > +180° ⇒ θ := θ - 360° 循环到范围内。

      π 的浮点不精确

      M_PI 是最接近 π 的 float,不严格等于 π。Canonical 算法可能产出 θ = -π(理论上不在区间内)。实际工程中视为可接受——进一步检查 fabs(θ) > PI 即可。

      When:AI 路径点比较;相机角度插值(避免"转 720° 回到原位");几何哈希。

      Example(-5, 30°) 的 canonical 形式是 (5, 210°) ⇒ 经过 θ > 180° 减 360° ⇒ (5, -150°)

      2.3 3D 极坐标:柱与球 (Cylindrical & Spherical)

      What:3D 极坐标分两种——柱坐标 (r, θ, z)(加线性 z 轴)和球坐标 (r, θ, φ)(加第二角度)。

      Why:柱坐标自然描述柱形物体;球坐标自然描述"方向 + 距离"问题(雷达、相机、地理)。

      How

      柱坐标(§7.3.1):在 2D 极坐标基础上加 z 轴(与 xy 平面垂直);

      \[x = r \cos\theta,\quad y = r \sin\theta,\quad z = z\]
      \[r = \sqrt{x^2 + y^2},\quad \theta = \text{atan2}(y, x),\quad z = z\]

      球坐标(数学界,§7.3.2):(r, θ, φ),θ = 与 +x 轴的水平夹角(azimuth),φ = 与 +z 轴的垂直夹角(zenith,0° = 北极);

      \[x = r \sin\phi\cos\theta,\quad y = r \sin\phi\sin\theta,\quad z = r\cos\phi\]
      \[r = \sqrt{x^2 + y^2 + z^2},\quad \theta = \text{atan2}(y, x),\quad \phi = \arccos(z / r)\]
      数学界球坐标的缺陷(§7.3.3)
      • θ = 0° 朝 +x("东"),与日常"北"不一致。

      • φ = 0° 朝 +z("上"),但 2D 极坐标在 φ = 90° 处——3D 默认方向与 2D 默认方向不同。

      • 右手系,与本书左手系相反。

      本书改用 heading / pitch 约定解决这些问题(§7.3.3)。

      When:柱坐标用于柱形几何(管道、圆柱);球坐标用于雷达、地理、相机空间;高度场(游戏引擎常用"高度 + 球坐标"组合)。

      Example:球坐标 (5, 45°, 90°)(数学界)= (5sin90°cos45°, 5sin90°sin45°, 5cos90°) = (3.54, 3.54, 0)——xy 平面上的点。

      2.4 heading / pitch 约定 (Heading / Pitch Convention)

      What:本书定义的球坐标约定——h = heading(水平偏航)、p = pitch(垂直俯仰);匹配左手系 + 航空惯例。

      Why:跨引擎 / 跨物理引擎 / 跨论文时约定不一致会引发"+x 是前还是右"的方向混淆;heading / pitch 与 Unity / Unreal / 飞行模拟器惯例一致。

      How

      约定(§7.3.3):

      • h (heading):绕 +y 轴(垂直轴)旋转,0° 朝 +z("北" / "前"),顺时针为正(左手系)。

      • p (pitch):绕右臂轴(即"右"向量)旋转,0° 水平,正值 向下(左手系一致)。

      • r:径向距离,r ≥ 0。

      转换公式(式 7-3):

      \[x = r \cos p \sin h,\quad y = -r \sin p,\quad z = r \cos p \cos h\]
      \[r = \sqrt{x^2 + y^2 + z^2},\quad h = \text{atan2}(x, z),\quad p = \arcsin(-y / r)\]
      pitch 正值向下的"反直觉"

      直觉上"抬头"应该是正 pitch,但本书用正向下的定义——这与左手系下"绕右臂顺时针"的正向一致。带来的好处:相机 / 飞行控制中"鼠标前推 = 视角下俯"自然对应 pitch 增加。

      When:相机控制(FPS、飞行模拟);AI 视锥;物理引擎中的刚体朝向更新。

      Example:heading / pitch = (45°, -30°) = "朝东北方看,向上 30°" = 笛卡尔方向约 (0.61, 0.50, 0.61)(标准化)。

      2.5 球坐标别名与万向锁 (Spherical Aliasing & Gimbal Lock)

      What:球坐标除 §2.2 的别名外还有 heading / pitch 互依 导致的额外别名与奇异点(万向锁)。

      Why:万向锁是 3D 旋转 / 相机控制最常踩的坑——一旦 pitch = ±90°,heading 完全无意义,相机姿态自由度从 3 降到 2,会出现"无法转到的方向"。

      How

      球坐标 canonical 形式(§7.3.4,本书约定):

      • r ≥ 0

      • h ∈ (-180°, +180°]

      • p ∈ [-90°, +90°]

      • r = 0 ⇒ h = p = 0

      • |p| = 90° ⇒ h = 0万向锁

      额外别名(数学意义上):

      \[(h, p) \equiv (h \pm 180°,\ 180° - p)\]

      例如"朝东转 90° 俯下 45°" ≡ "朝西转 90° 俯下 135°"(物体倒置但方向相同)。

      万向锁:p = ±90° 时方向"垂直"(朝正上 / 正下),heading 任意值都指向同一方向——此时 heading 无意义。

      万向锁的工程影响
      • 用欧拉角表示旋转时,遇到 pitch = ±90° 会失去一个自由度。

      • 解决方案:换用 四元数轴角(第 8 章);相机控制中限制 pitch ∈ (-89°, +89°)。

      • 调试时若相机"卡住转不到某个方向",第一怀疑就是万向锁。

      When:所有用欧拉角做相机 / 刚体朝向的系统;FPS 游戏镜头;飞行模拟器;机器人关节。

      Example:相机朝向 (h=0°, p=+90°) 时朝正上方看;(h=180°, p=+90°) 也朝正上方看——h 无效。

      2.6 极坐标描述向量 (Polar Vectors)

      What:同一对 (r, θ) 可描述点(位移从原点出发)或向量(按给定方向走 r);算法只差"是否回到原点"。

      Why:物理书描述力 / 速度 / 位移常用极坐标;向量库可以同时支持"点模式"与"向量模式"——底层数据相同。

      How

      向量极坐标解释(§7.4):

      • 与定位算法 几乎相同,但去掉"从原点出发"——直接按 (r, θ) 画一个有向线段。

      • 与点的极坐标转换公式 完全相同(§7.1.3 公式对点 / 向量均适用)。

      "向量是位置 + 极坐标 = 位移"

      向量 vs 点的根本区别(§2.2)是"无位置"vs"有位置"。但当你用极坐标描述时:(r,θ) 描述 从原点出发 走 r 到某点——这恰好是 位移向量 的定义。所以极坐标下"向量"和"点"是同一对象的两种视角,无需区分。

      When:物理引擎(力 / 速度 / 加速度用极坐标 / 球坐标描述);雷达(目标距离 + 方向);2D / 3D 子弹轨迹。

      Example:力 (F, θ) = (10N, 30°) = "10 牛顿,朝东北方向" = 向量 (8.66, 5, 0) 牛顿。

      三、关键图表

      视觉图表

      图 7-1
      Figure 1. 图 7-1:2D 极坐标空间
      图 7-2
      Figure 2. 图 7-2:用 2D 极坐标定位点
      图 7-3
      Figure 3. 图 7-3:典型点的 2D 极坐标示例
      图 7-4
      Figure 4. 图 7-4:2D 笛卡尔 ↔ 极坐标互转
      图 7-5
      Figure 5. 图 7-5:柱坐标
      图 7-6
      Figure 6. 图 7-6:球坐标(数学界约定)
      图 7-7
      Figure 7. 图 7-7:heading / pitch 约定(本书)
      图 7-8
      Figure 8. 图 7-8:球坐标 ↔ 3D 笛卡尔(数学界约定)

      非可视化条目

      非可视化条目(表 / 算法)
      编号 内容摘要

      式 7-1

      2D 极坐标 ↔ 笛卡尔:x = r cosθ, y = r sinθ;反之 r = √(x²+y²), θ = atan2(y, x)

      式 7-2

      3D 球坐标 ↔ 笛卡尔(数学界):x = r sinφ cosθ, y = r sinφ sinθ, z = r cosφ

      式 7-3

      球坐标 ↔ 笛卡尔(本书 heading / pitch 约定):x = r cos p sin h, y = -r sin p, z = r cos p cos h;反之 h = atan2(x, z), p = arcsin(-y/r)

      列表 7.1, 7.3, 7.4

      C 代码:2D 极坐标 → canonical、3D 球坐标 → canonical、笛卡尔 → 球坐标。

      表 7.1

      几种 spherical aliasing 类型(r 翻转 / 角度循环 / heading-pitch 互依)。

      核心公式对照表

      核心公式对照表
      互转方向 公式

      2D 极 → 笛

      \(x = r \cos\theta,\quad y = r \sin\theta\)

      2D 笛 → 极

      \(r = \sqrt{x^2 + y^2},\quad \theta = \text{atan2}(y, x)\)

      3D 球(数学界) → 笛

      \(x = r \sin\phi \cos\theta,\quad y = r \sin\phi \sin\theta,\quad z = r \cos\phi\)

      3D 球(本书) → 笛

      \(x = r \cos p \sin h,\quad y = -r \sin p,\quad z = r \cos p \cos h\)

      3D 笛 → 球(本书)

      \(r = \sqrt{x^2 + y^2 + z^2},\quad h = \text{atan2}(x, z),\quad p = \arcsin(-y/r)\)

      Aliasing 一般规则

      \((r, \theta) \equiv ((-1)^k r,\ \theta + k \cdot 180°)\)

      四、思维导图

      mindmap
        root((第 7 章 极坐标系))
          2D极坐标
            距离加角度
            atan2互转
            方向加距离语义
          别名canonical
            同一空间无穷表达
            r非负theta半开
            原点theta归零
          3D柱坐标
            极坐标加z轴
            柱形几何
          3D球坐标
            两个角度
            数学界约定
            headingpitch约定
          headingpitch
            左手系航空
            偏航绕y
            俯仰绕右臂
          别名万向锁
            pitch正负90奇异
            heading无效
            解决方案四元数
          极坐标向量
            与点同算法
            物理常用
            力速度描述

      五、重点与易错点

      1. 2D 极坐标的"别名" ≠"无解":任意 (r, θ) 都对应唯一点;但一个点有无穷多极坐标表达——务必先 canonical 化再比较。

      2. canonical 转换算法:先处理 r=0,再处理 r<0,最后循环 θ 到 (-180°, +180°];常见 bug 是忘了"半开区间"导致 +180°-180° 都存在。

      3. 柱坐标 vs 球坐标:柱 = 加线性 z;球 = 加角度。柱形物体用柱坐标,"方向 + 距离"问题用球坐标。

      4. heading / pitch 约定与数学界 (θ, φ) 不同:本书 h 是绕 y 轴、0° 朝 +z;p 0° 水平、正值向下。跨代码搬运时第一件事是验证约定。

      5. pitch 正值向下是"反直觉"但工程必要:与左手系 + 飞行控制 + "鼠标前推 = 视角下俯"自然对应;不要试图"修正"成正值向上。

      6. 万向锁 = 自由度丢失:pitch = ±90° 时 heading 无意义;相机控制中应限制 pitch ∈ (-89°, +89°)。

      7. heading / pitch 互依别名(h, p) ≡ (h ± 180°, 180° - p);调相机时若"转错方向"往往是别名 bug。

      8. 极坐标描述向量:与点完全相同的算法——(r, θ) 既可描述点也可描述向量;物理书描述力时常用此约定。

      9. π 的浮点不精确M_PI 不严格等于 π;canonical 算法可能产出 θ = -π(理论上不在区间),实际工程中可接受。

      10. 跨章衔接:第 8 章欧拉角 / 四元数会再次提到万向锁;第 10 章相机空间用球坐标描述 fov;第 11 章力学用极坐标描述向心力。

      11. 应用提示:地理坐标(lat / long)是球坐标;游戏雷达 / 视野锥用极坐标;FPS 相机用 heading / pitch + 限制 pitch 范围规避万向锁。