OI Wiki 坐标系与角度体系全解析:从任意角、弧度制到直角坐标、极坐标及三维坐标系的相互转换
2026/9/13 12:14:12 网站建设 项目流程

OI Wiki 坐标系与角度体系全解析:从任意角、弧度制到直角坐标、极坐标及三维坐标系的相互转换

【免费下载链接】OI-wiki:star2: Wiki of OI / ICPC for everyone. (某大型游戏线上攻略,内含炫酷算术魔法)项目地址: https://gitcode.com/GitHub_Trending/oi/OI-wiki

本文以 OI Wiki 的 docs/math/coordinate.md 为主体,系统梳理竞赛数学与计算几何中不可或缺的坐标系与角度基础:从角的动态定义引出任意角概念,再到弧度制及其与角度的换算,进而依次展开平面直角坐标系、平面极坐标系、空间直角坐标系、空间柱坐标系与空间球坐标系,并给出各坐标系间的完整互化公式。读完本文,你将掌握角度与弧度的换算、atan2函数的精确定义与使用场景、二维与三维坐标系的建系方法,以及五大坐标系之间的双向转换公式,为学习计算几何(如极角排序、凸包、半平面交)、复数运算与三维几何打下坚实底座。

角的定义:从静态到动态,突破 $[0, 360^\circ]$ 的局限

静态定义的局限

在小学或初中阶段,角被定义为:具有公共端点的两条射线组成的图形,即角的静态定义。

但该定义将角度限制在了 $[0, 360^\circ]$,这给深入研究带来了一定困难,同时无法解释一些实际问题,例如:旋转 $720^\circ$ 是什么意思?

动态定义与任意角

高中数学引入了角的动态定义:平面内一条射线绕其端点从一个位置旋转到另一个位置形成的图形叫做角。其中:

  • 开始的位置称为始边,结束的位置称为终边
  • 逆时针方向旋转形成的角叫做正角,其角度为正;
  • 顺时针方向旋转形成的角叫做负角,其角度为负;
  • 终边相对于始边没有做任何旋转的角叫做零角,其角度为 $0^\circ$。

这样就把角的概念推向了任意角,旋转多少周都可以被准确描述——这正是解决"旋转 $720^\circ$"这类问题的基础。

???+ note "注意" 零角始边和终边重合,但始边和终边重合的角并不都是零角,如以 $360^\circ$ 为倍数的角。

弧度制:减少系数、贴近数学与编程的角的度量

弧度的定义

实际应用中经常有角度到各种参数的转换,而使用弧度制描述角可以减少系数的使用。弧度制的定义如下:

把长度等于半径长的弧所对的圆心角称为 $1$ 弧度的角,用符号 $\text{rad}$ 表示,读作:弧度。

根据前面的规定,正角的弧度为正,负角的弧度为负,零角的弧度为 $0$。如果半径为 $r$ 的圆的圆心角 $\alpha$ 所对弧长为 $l$,则:

$$ |\alpha|=\dfrac{l}{r} $$

利用这个公式还可以写出弧长和扇形面积公式。于是,$360^\circ$ 角的弧度为 $2\pi$,有了对应关系之后就可以进行角度值和弧度制的转化:

$$ k \operatorname{rad} = \frac{\pi}{180^\circ} n^\circ $$

即 $1\operatorname{rad}=\dfrac{180^\circ}{\pi}$,$1^\circ=\dfrac{\pi}{180}\operatorname{rad}$,这是竞赛与计算几何代码中反复使用的换算基准。

终边相同的角

考虑一个角,将其终边再旋转一周甚至多周,始边位置不动,那么终边位置永远是相同的,称这些角为终边位置相同的角。与角 $\alpha$ 终边位置相同的角的集合为:

$$ {\varphi \mid \varphi = \alpha + 2k\pi,\ k \in \mathbf{Z}} $$

可以理解为:给这个角的边不停加转一圈,终边位置不变。这一性质直接解释了极坐标表示的多值性(见下文),也与复数辐角的周期性表述完全一致。

两个值得注意的数学约定

???+ note "$\pi$ 和 $\tau$ 两个数学常数" 目前西方数学界有一些观点认为,「真正的圆周率」应为 $2\pi$,将这个值记为希腊字母 $\tau$。新圆周率的支持者们选择在 6 月 28 日庆祝「真正的」圆周率日。比如在弧度制下,一个周角是 $2\pi$,直接对 $2\pi$ 进行等分可以得到周角的等分;又例如在复变函数中频繁出现 $2\pi$ 的组合,等等。

为了迎合中国各地区约定俗成的习惯,在 **OI Wiki**,采用参数 $\pi$ 表示圆周率。

???+ note "编程中圆周率的习惯写法" 在 C/C++ 语言中,一般取 $\pi$ 为acos(-1),只有这个值是最接近 $\pi$ 的浮点数。使用acos(-1)或者4 * atan(1)写出来的 $\pi$ 是 $3.14159265358979310000$。

采用其他值,例如 `acos(-1.0/2.0)`、`acos(1.0/2.0)`、`asin(1.0/2.0)` 等等,写出来的 $\pi$ 是 $3.14159265358979360000$,这就不是最接近 $\pi$ 的浮点数了。如果你背得下来,也可以直接写 $3.1415926535897932$。

这一写法在 OI Wiki 的计算几何代码中处处可见:由于所有几何算法最终都依赖浮点运算,π 的精度会直接传导到角度换算与三角计算中,因此统一使用acos(-1)是仓库中约定俗成且精度最优的做法。

平面直角坐标系:二维定位的基石

建系规则与象限划分

在同一个平面上互相垂直且有公共原点的两条数轴构成平面直角坐标系(Rectangular Coordinates)。通常,两条数轴分别置于水平位置与垂直位置,取向右与向上的方向分别为两条数轴的正方向。水平的数轴叫做 $x$ 轴(x-axis)或横轴,垂直的数轴叫做 $y$ 轴(y-axis)或纵轴,$x$ 轴、$y$ 轴统称为坐标轴,它们的公共原点 $O$ 称为平面直角坐标系的原点(origin),以点 $O$ 为原点的平面直角坐标系记作平面直角坐标系 $xOy$。

$x$ 轴、$y$ 轴将坐标平面分成了四个象限(quadrant):右上方的部分叫做第一象限,其他三个部分按逆时针方向依次叫做第二象限、第三象限和第四象限。象限以数轴为界,横轴、纵轴上的点及原点不在任何一个象限内。一般情况下,$x$ 轴、$y$ 轴取相同的单位长度,但在特殊情况下也可以取不同的单位长度。

坐标与点的——对应

在平面直角坐标系中,对于平面上的任意一点,都有唯一的一个有序数对(即点的坐标(coordinates))与它对应;反过来,对于任意一个有序数对,都有平面上唯一的一点与它对应。

对于平面内任意一点 $C$,过点 $C$ 分别向 $x$ 轴、$y$ 轴作垂线,垂足在 $x$ 轴、$y$ 轴上的对应点 $a, b$ 分别叫做点 $C$ 的横坐标、纵坐标,有序数对(ordered pair)$(a, b)$ 叫做点 $C$ 的直角坐标。一个点在不同的象限或坐标轴上,其坐标都不一样。

平面极坐标系:以距离和方向描述位置

建系的三要素

考虑实际情况,比如航海,说「点 $B$ 在点 $A$ 的北偏东 $30^\circ$ 方向上,距离为 $100$ 米」,而不是「以 $A$ 为原点建立平面直角坐标系,$B(50,50\sqrt 3)$」。极坐标系正是对这种"方向 + 距离"直觉的形式化:

  1. 在平面上选一定点 $O$,称为极点
  2. 自极点引出一条射线 $Ox$,称为极轴
  3. 选择一个单位长度(在数学问题中通常为 $1$)、一个角度单位(通常为弧度)及其正方向(通常为逆时针方向)。

这样就建立了极坐标系

极径、极角与极坐标

设 $A$ 为平面上一点:

  • 极点 $O$ 与 $A$ 之间的距离 $|OA|$ 称为极径,记为 $\rho$;
  • 以极轴为始边、$OA$ 为终边的角 $\angle xOA$ 称为极角,记为 $\varphi$。

那么有序数对 $(\rho,\varphi)$ 即为 $A$ 的极坐标

由终边相同的角的定义可知,$(\rho,\varphi)$ 与 $(\rho,\varphi + 2k\pi)\ (k\in \mathbf{Z})$ 其实表示的是同一个点。特别地,极点的极坐标为 $(0,\varphi)\ (\varphi \in \mathbf{R})$,于是平面内的点的极坐标表示有无数多种。

如果规定 $\rho \ge 0,\ 0 \le \varphi < 2\pi$,那么除极点外,其他平面内的点可以用唯一有序数对 $(\rho,\varphi)$ 表示,而极坐标 $(\rho,\varphi)$ 表示的点是唯一确定的。这为编程实现中"极角排序"提供了规范化前提:只要把角度归约到 $[0,2\pi)$(或 $(-\pi,\pi]$),即可得到统一的排序键。

平面直角坐标系与极坐标系的相互转换

有时候研究极坐标系下的图形有些不方便,要想转到直角坐标系下研究,有互化公式。点 $A(\rho,\varphi)$ 的直角坐标 $(x,y)$ 可以如下表示:

$$ \begin{aligned} x &= \rho \cos \varphi \ y &= \rho \sin \varphi \end{aligned} $$

进而可知:

$$ \begin{aligned} \rho^2 &= x^2 + y^2\ \tan \varphi &= \frac{y}{x}\ \ \ \ (x\not =0) \end{aligned} $$

于是有 $\rho = \sqrt{x^2+y^2}$。但具有相同 $\dfrac{y}{x}$ 的 $\tan\varphi$ 有两个可能的 $\varphi$ 的值,此时还需要根据 $x, y$ 的值来确定方向。具体地,定义函数:

$$ \operatorname{atan2}(y, x) = \begin{cases} \arctan(\frac{y}{x}) & \text{if } x > 0 \ \arctan(\frac{y}{x}) + \pi & \text{if } y \ge 0, x < 0 \ \arctan(\frac{y}{x}) - \pi & \text{if } y < 0, x < 0 \ \pi/2 & \text{if } y > 0, x = 0 \ -\pi/2 & \text{if } y < 0, x = 0 \ \text{any} & \text{if } y = 0, x = 0 \end{cases} $$

则 $\varphi = \operatorname{atan2}(y, x)$。注意上述函数的值域为 $(-\pi, \pi]$。

在 C/C++ 语言的<math.h><cmath>库里定义了该函数,调用atan2(y, x)即可(注意参数顺序是先 $y$ 后 $x$)。

仓库中的atan2实战:极角排序

atan2正是 OI Wiki 计算几何章节中"极角排序"的标准实现手段:

  • 在 凸包(Graham 扫描法) 中,先选出纵坐标最小的点 $P_1$ 作为极点,然后用atan2(p[i].y - p[1].y, p[i].x - p[1].x)计算其余各点相对于 $P_1$ 的极角并作为排序关键字(见 docs/geometry/convex-hull.md 中 Graham 扫描法部分,对应代码为p[i].ang = atan2(...)),排序时若极角相等则按距离升序排列,从而得到 $O(n\log n)$ 的凸包算法;
  • 在 半平面交(S&I 算法) 中,同样以向量为自变量调用atan2((x.b - x.a).y, (x.b - x.a).x)求每条边向量的极角,并以返回值为关键字排序得到新的边(向量)集;排序遇到共线向量时再按左右关系取舍(见 docs/geometry/half-plane.md 中"极角排序"一节);
  • 在 二维计算几何基础 的"极角序"一节中,一般先枚举一个极点,计算出其他点的极坐标,在极坐标系下按极角的顺序解决问题。

可以推断,atan2之所以被如此广泛地使用,正是因为分段函数形式完整处理了四个象限与坐标轴上的情况,规避了 $\arctan(y/x)$ 仅返回 $(-\pi/2, \pi/2)$、无法区分反向向量的缺陷。

空间直角坐标系:右手系下的三维定位

建系方法

使用如下方法建立空间直角坐标系:

  1. 在空间内选定一点 $O$;
  2. 过点 $O$ 作三条互相垂直的数轴 $\overrightarrow{Ox}, \overrightarrow{Oy}, \overrightarrow{Oz}$,分别称作 $x$ 轴(横轴)、$y$ 轴(纵轴)、$z$ 轴(竖轴),统称为坐标轴;它们的正方向符合右手规则,即以右手握住 $z$ 轴,当右手的四个手指从 $x$ 轴的正向以角度转向 $y$ 轴正向时,大拇指的指向就是 $z$ 轴的正向;
  3. 设定各轴上的长度单位,通常都设为 $1$。

这样就构成了一个空间直角坐标系,称为空间直角坐标系 $O-xyz$,定点 $O$ 称为该坐标系的原点。

任意两条坐标轴确定一个平面,这样可确定三个互相垂直的平面,统称为坐标面。其中 $x$ 轴与 $y$ 轴所确定的坐标面称为 $xOy$ 面,类似地有 $yOz$ 面和 $zOx$ 面。三个坐标面把空间分成八个部分,每一部分称为一个卦限

空间点的坐标描述

取定空间直角坐标系 $O-xyz$ 后,就可以建立空间的点与三元组之间的一一对应关系。

设点 $M$ 为空间的一点,过点 $M$ 分别作垂直于 $x$ 轴、$y$ 轴和 $z$ 轴的平面。设三个平面与 $x$ 轴、$y$ 轴和 $z$ 轴的交点依次为 $P, Q, R$,点 $P, Q, R$ 分别称为点 $M$ 在 $x$ 轴、$y$ 轴和 $z$ 轴上的投影。又设点 $P, Q, R$ 在 $x$ 轴、$y$ 轴和 $z$ 轴上的坐标依次为 $x, y, z$,于是点 $M$ 确定了一个三元组 $(x, y, z)$。

反之,如果给定一个三元组 $(x, y, z)$,可以在 $x$ 轴上取坐标为 $x$ 的点 $P$,在 $y$ 轴上取坐标为 $y$ 的点 $Q$,在 $z$ 轴上取坐标为 $z$ 的点 $R$,然后过点 $P, Q, R$ 分别作垂直于 $x$ 轴、$y$ 轴和 $z$ 轴的三个平面,它们相交于空间的一点 $M$,点 $M$ 就是由三元组 $(x, y, z)$ 所确定的点。这样一来,空间的点 $M$ 与三元组 $(x, y, z)$ 之间就建立了一一对应的关系。把三元组 $(x, y, z)$ 称为点 $M$ 的坐标,记作 $M(x, y, z)$,其中 $x$ 称为横坐标、$y$ 称为纵坐标、$z$ 称为竖坐标。

仓库中的三维点实现

OI Wiki 的三维几何代码以结构体直接封装空间直角坐标。例如 三维凸包代码 docs/geometry/code/3d/3d_1.cpp 中定义:

struct Node { double x, y, z; double len() { return sqrt(x * x + y * y + z * z); } // 即 r = sqrt(x^2+y^2+z^2) // 向量差、叉乘(返回新向量)、点乘等运算重载 };

其中len()sqrt(x*x + y*y + z*z)计算向量模长,正是下文球坐标转换公式中 $r = \sqrt{x^2+y^2+z^2}$ 的代码形态。

空间柱坐标系:极坐标的三维延拓

空间柱坐标系是将极坐标扩展为三维的方式:从应用于平面工作中的极坐标系开始,然后过极点 $O$ 添加垂直于该平面的 $z$ 轴,方向朝上。

为了找到由柱坐标 $(\rho, \varphi, z)$ 所描述的点,可以首先在极坐标系下处理 $\rho$ 和 $\varphi$,然后根据 $z$ 坐标沿着 $z$ 轴「向上」或「向下」移动。

柱坐标系与空间直角坐标系的相互转换

两坐标系下 $z$ 的值是相同的。$(x,y)$ 与 $(\rho, \varphi)$ 的相互转换参见上文 平面直角坐标系与极坐标系的相互转换,即:

$$ x=\rho\cos\varphi,\quad y=\rho\sin\varphi,\quad \rho=\sqrt{x^2+y^2},\quad \varphi=\operatorname{atan2}(y,x) $$

也就是说,柱坐标本质上是"平面极坐标 + 高度 $z$"的叠加,因此平面互化的全部结论(包括 $\operatorname{atan2}$ 的方向判定)都可以直接复用。

空间球坐标系:天顶角与方位角

建系过程

球坐标可以通过以下方法确定:

  1. 站在原点,面向水平极轴的方向;垂直轴的指向是从脚指向头部;
  2. 手臂向上,指向垂直极轴方向;
  3. 逆时针旋转角度 $\varphi$;
  4. 将手臂向下旋转角度 $\vartheta$,手臂指向 $\varphi$ 和 $\vartheta$ 指定的方向;
  5. 沿着该方向从原点移位距离 $r$。

这样即可到达球坐标 $(r,\vartheta,\varphi)$ 所描述的点。其中 $\vartheta$ 称为天顶角,$\varphi$ 称为方位角

???+ warning "Warning" 由于诸多原因,有的地方使用 $\phi$ 表示天顶角,用 $\theta$ 表示方位角。阅读文章遇到球坐标系时请务必注意这一点。同时,在写文章时,如果用到了球坐标系,建议提前声明清楚使用什么符号表示天顶角和方位角。

柱坐标系与球坐标系的相互转换

两坐标系下 $\varphi$ 的值是相同的。

从柱坐标系到球坐标系:

$$ \begin{aligned} r &= \sqrt{\rho^2 + z^2} \ \vartheta &= \begin{cases} \arctan\left(\frac{\rho}{z}\right) & \text{if }z > 0 \ \pi/2 & \text{if }z = 0, \rho \not= 0 \ \arctan\left(\frac{\rho}{z}\right) + \pi & \text{if }z < 0 \ \end{cases} \end{aligned} $$

注意对于柱坐标系下的点 $(0,0,0)$,其球坐标的 $\vartheta$ 不明确。

从球坐标系到柱坐标系:

$$ \begin{aligned} \rho &= r \sin \vartheta \ z &= r \cos \vartheta \end{aligned} $$

空间直角坐标系与球坐标系的相互转换

可以结合上文 平面直角坐标系与极坐标系的相互转换 和上文 柱坐标系与球坐标系的相互转换 一起使用,或直接使用下面的公式:

从空间直角坐标系到球坐标系:

$$ \begin{aligned} r &= \sqrt{x^2 + y^2 + z^2} \ \vartheta &= \arccos\left(\frac{z}{\sqrt{x^2 + y^2 + z^2}}\right) \ \varphi &= \operatorname{atan2}(y, x) \end{aligned} $$

其中 $\operatorname{atan2}$ 的定义见 平面直角坐标系与极坐标系的相互转换。注意对于空间直角坐标系下的点 $(0,0,0)$,其球坐标的 $\vartheta$ 和 $\varphi$ 取值不明确。

从球坐标系到空间直角坐标系:

$$ \begin{aligned} x &= r \sin \vartheta \cos \varphi \ y &= r \sin \vartheta \sin \varphi \ z &= r \cos \vartheta \end{aligned} $$

坐标系与角度体系在 OI Wiki 其他章节中的延伸

上述坐标系与角度知识并非孤立的理论,而是 OI Wiki 多个核心模块的共同基础:

  • 复数与极坐标的呼应:docs/math/complex.md 的"辐角和辐角主值"一节指出,表示复数 $z$ 的位置可以借助极坐标 $(r, \theta)$ 确定,$r$ 即复数的模,$\tan\theta=\frac{y}{x}$ 对应的 $\theta=\arg z$ 称为辐角;任意非零复数有无穷多个辐角,而辐角主值 $\operatorname{Arg} z$ 满足 $-\pi < \operatorname{Arg} z \le \pi$,这与"终边相同的角"集合 ${\alpha+2k\pi}$ 以及 $\operatorname{atan2}$ 的值域 $(-\pi,\pi]$ 三者表述完全同构。在极坐标视角下,复数乘法"模相乘、辐角相加",除法"模相除、辐角相减",这正源于极坐标系下角度天然具备的周期性;
  • 二维计算几何:docs/geometry/2d.md 明确要求读者先阅读本文的极坐标系部分,并将点区分为"直角坐标存储"与"极坐标(极径 + 极角)存储"两种方式;在极坐标系中表示线较为困难,因此直线相关讨论仅在直角坐标系中进行;
  • 凸包与半平面交:如前文所述,凸包 的 Graham 扫描与 半平面交 的 S&I 算法都以 $\operatorname{atan2}$ 计算极角并排序作为算法核心步骤;
  • 三维计算几何:三维凸包代码 docs/geometry/code/3d/3d_1.cpp 直接以空间直角坐标 $(x,y,z)$ 存储点,并以 $r=\sqrt{x^2+y^2+z^2}$ 计算模长,是球坐标公式 $r=\sqrt{x^2+y^2+z^2}$ 的工程化体现。

小结与速查表

本文以角的动态定义打开"任意角"的大门,以弧度制统一了数学表达与编程实现中的角度量度,随后依次建立了平面直角坐标系、平面极坐标系、空间直角坐标系、空间柱坐标系与空间球坐标系,并给出全部互化公式。核心结论可归纳为下表:

转换关系公式要点注意事项
角度 ↔ 弧度$1^\circ=\dfrac{\pi}{180}\operatorname{rad}$,$1\operatorname{rad}=\dfrac{180^\circ}{\pi}$C/C++ 中用acos(-1)取最精确的 $\pi$
极坐标 → 直角坐标$x=\rho\cos\varphi,\ y=\rho\sin\varphi$$\varphi$ 通常取弧度
直角坐标 → 极坐标$\rho=\sqrt{x^2+y^2}$,$\varphi=\operatorname{atan2}(y,x)$$\operatorname{atan2}$ 值域 $(-\pi,\pi]$,极点坐标不唯一
柱坐标 ↔ 直角坐标$z$ 不变,$(x,y)\leftrightarrow(\rho,\varphi)$ 同平面互化复用平面极坐标公式
柱坐标 → 球坐标$r=\sqrt{\rho^2+z^2}$,$\vartheta$ 按 $z$ 的符号分段$(0,0,0)$ 处 $\vartheta$ 不明确
球坐标 → 柱坐标$\rho=r\sin\vartheta,\ z=r\cos\vartheta$$\varphi$ 不变
直角坐标 → 球坐标$r=\sqrt{x^2+y^2+z^2}$,$\vartheta=\arccos\frac{z}{r}$,$\varphi=\operatorname{atan2}(y,x)$$(0,0,0)$ 处 $\vartheta,\varphi$ 不明确
球坐标 → 直角坐标$x=r\sin\vartheta\cos\varphi$,$y=r\sin\vartheta\sin\varphi$,$z=r\cos\vartheta$注意天顶角/方位角符号约定因文献而异

在竞赛与算法实现中,记住三条实战准则即可覆盖绝大多数场景:弧度制贯穿所有三角函数调用;方向判定一律使用 $\operatorname{atan2}(y,x)$ 而非 $\arctan(y/x)$;三维坐标转换先确定 $\rho=\sqrt{x^2+y^2}$ 或 $r=\sqrt{x^2+y^2+z^2}$ 等中间量,再逐级推导。

【免费下载链接】OI-wiki:star2: Wiki of OI / ICPC for everyone. (某大型游戏线上攻略,内含炫酷算术魔法)项目地址: https://gitcode.com/GitHub_Trending/oi/OI-wiki

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询