拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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

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)$」。极坐标系正是对这种方向 距离直觉的形式化在平面上选一定点 $O$称为极点自极点引出一条射线 $Ox$称为极轴选择一个单位长度在数学问题中通常为 $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^2y^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)$ 的凸包算法在 半平面交SI 算法 中同样以向量为自变量调用atan2((x.b - x.a).y, (x.b - x.a).x)求每条边向量的极角并以返回值为关键字排序得到新的边向量集排序遇到共线向量时再按左右关系取舍见 docs/geometry/half-plane.md 中极角排序一节在 二维计算几何基础 的极角序一节中一般先枚举一个极点计算出其他点的极坐标在极坐标系下按极角的顺序解决问题。可以推断atan2之所以被如此广泛地使用正是因为分段函数形式完整处理了四个象限与坐标轴上的情况规避了 $\arctan(y/x)$ 仅返回 $(-\pi/2, \pi/2)$、无法区分反向向量的缺陷。空间直角坐标系右手系下的三维定位建系方法使用如下方法建立空间直角坐标系在空间内选定一点 $O$过点 $O$ 作三条互相垂直的数轴 $\overrightarrow{Ox}, \overrightarrow{Oy}, \overrightarrow{Oz}$分别称作 $x$ 轴横轴、$y$ 轴纵轴、$z$ 轴竖轴统称为坐标轴它们的正方向符合右手规则即以右手握住 $z$ 轴当右手的四个手指从 $x$ 轴的正向以角度转向 $y$ 轴正向时大拇指的指向就是 $z$ 轴的正向设定各轴上的长度单位通常都设为 $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^2y^2z^2) // 向量差、叉乘返回新向量、点乘等运算重载 };其中len()用sqrt(x*x y*y z*z)计算向量模长正是下文球坐标转换公式中 $r \sqrt{x^2y^2z^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^2y^2},\quad \varphi\operatorname{atan2}(y,x) $$也就是说柱坐标本质上是平面极坐标 高度 $z$的叠加因此平面互化的全部结论包括 $\operatorname{atan2}$ 的方向判定都可以直接复用。空间球坐标系天顶角与方位角建系过程球坐标可以通过以下方法确定站在原点面向水平极轴的方向垂直轴的指向是从脚指向头部手臂向上指向垂直极轴方向逆时针旋转角度 $\varphi$将手臂向下旋转角度 $\vartheta$手臂指向 $\varphi$ 和 $\vartheta$ 指定的方向沿着该方向从原点移位距离 $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$这与终边相同的角集合 ${\alpha2k\pi}$ 以及 $\operatorname{atan2}$ 的值域 $(-\pi,\pi]$ 三者表述完全同构。在极坐标视角下复数乘法模相乘、辐角相加除法模相除、辐角相减这正源于极坐标系下角度天然具备的周期性二维计算几何docs/geometry/2d.md 明确要求读者先阅读本文的极坐标系部分并将点区分为直角坐标存储与极坐标极径 极角存储两种方式在极坐标系中表示线较为困难因此直线相关讨论仅在直角坐标系中进行凸包与半平面交如前文所述凸包 的 Graham 扫描与 半平面交 的 SI 算法都以 $\operatorname{atan2}$ 计算极角并排序作为算法核心步骤三维计算几何三维凸包代码 docs/geometry/code/3d/3d_1.cpp 直接以空间直角坐标 $(x,y,z)$ 存储点并以 $r\sqrt{x^2y^2z^2}$ 计算模长是球坐标公式 $r\sqrt{x^2y^2z^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^2y^2}$$\varphi\operatorname{atan2}(y,x)$$\operatorname{atan2}$ 值域 $(-\pi,\pi]$极点坐标不唯一柱坐标 ↔ 直角坐标$z$ 不变$(x,y)\leftrightarrow(\rho,\varphi)$ 同平面互化复用平面极坐标公式柱坐标 → 球坐标$r\sqrt{\rho^2z^2}$$\vartheta$ 按 $z$ 的符号分段$(0,0,0)$ 处 $\vartheta$ 不明确球坐标 → 柱坐标$\rhor\sin\vartheta,\ zr\cos\vartheta$$\varphi$ 不变直角坐标 → 球坐标$r\sqrt{x^2y^2z^2}$$\vartheta\arccos\frac{z}{r}$$\varphi\operatorname{atan2}(y,x)$$(0,0,0)$ 处 $\vartheta,\varphi$ 不明确球坐标 → 直角坐标$xr\sin\vartheta\cos\varphi$$yr\sin\vartheta\sin\varphi$$zr\cos\vartheta$注意天顶角/方位角符号约定因文献而异在竞赛与算法实现中记住三条实战准则即可覆盖绝大多数场景弧度制贯穿所有三角函数调用方向判定一律使用 $\operatorname{atan2}(y,x)$ 而非 $\arctan(y/x)$三维坐标转换先确定 $\rho\sqrt{x^2y^2}$ 或 $r\sqrt{x^2y^2z^2}$ 等中间量再逐级推导。【免费下载链接】OI-wiki:star2: Wiki of OI / ICPC for everyone. 某大型游戏线上攻略内含炫酷算术魔法项目地址: https://gitcode.com/GitHub_Trending/oi/OI-wiki创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门