极坐标系与坐标的不唯一
平面上定位一个点有两条路:说它向右多少、向上多少,或说它离一个定点多远、朝哪个方向。前一条是直角坐标,后一条是极坐标。两套坐标描述的是同一个平面,差别在于哪一类曲线的方程写起来短,以及一个更根本的差别——直角坐标与点一一对应,极坐标不是。本页处理这套坐标的定义、互化公式,以及不唯一带来的两个实际后果。
1 · 极坐标系的构成
定义 1.1(极坐标系) 在平面内取一个定点 称为极点,自 引一条射线 称为极轴,再选定长度单位与角的正方向(通常取逆时针),即构成一个极坐标系。设 是平面上一点, 称为 的极径,以极轴为始边、射线 为终边的角 称为 的极角,有序数对 称为 的极坐标。
极点自身是个例外:它到自己的距离为零,而「射线 」根本不存在,所以极点没有极角。课本通常约定极点的极坐标是 且 任取,这条约定后面会派上用场。
角的单位取弧度还是度是排版问题,不是数学问题。本系列的读数一律用度,计算一律用弧度:Math.cos 这类函数只认弧度。
2 · 与直角坐标的互化
把直角坐标系的原点取作极点、 轴正半轴取作极轴,两套坐标由
联系起来。上面一行是单值的:给一对 ,落在哪个点没有商量余地。下面一行不是—— 取算术平方根还是它的相反数是个选择,而 在一圈内有两个解,正切的周期是 而不是 。所以「化回极坐标」这件事必须先约定取哪一个。
核心模块 polar.ts 取的约定是
且
,
由 Math.atan2(y, x) 给出再折算。这一步有三处实测值得记:
Math.atan2(0, 0)返回0。极点的极角本无定义,这个0是浮点约定而非数学结论,所以toPolar在极点处返回null,不让它流进后续的角度运算。-
负零把同一个方向劈成两个返回值:
Math.atan2(0, -1)是 而Math.atan2(-0, -1)是 。折算到 之后两者同落在 上,这条区间约定顺手把分歧吃掉了;若区间取 ,负零那一侧就会拿到差一整圈的极角。 -
小到次正规数(subnormal)区间时,方向本身开始失真。沿
弧度取点、逐档缩小
实测:
时误差为零(双精度最小正规数是
),
时
度,
时
度,到最小的次正规数
时
与
双双被舍成同一个值,
Math.atan2只剩 可给,偏差 度。方向的精度在这一档不再由角度决定,而由 决定。
最后这条在实际绘图里碰不到,画布上的坐标不会小到 。记下它是因为它点出了互化的一个结构性事实:极坐标把「位置」拆成了距离与方向两个量,而这两个量的精度并不独立。
3 · 一个点的无穷多组坐标
绕极点转一整圈回到原处,所以 加减 得到的是同一个点。这是第一套多余的表示。第二套来自允许 取负值:约定 表示「沿 的反方向量 」,于是
两套合起来,非极点的每个点有无穷多组极坐标,形如 与 。极点更极端: 对任意 都是它。
polar.ts 据此给出一个规范形(、、极点记作
),并把「两组坐标是不是同一个点」这个判据落到直角坐标上,那边是唯一的,可以当参照。
4 · 判点与求交的改写
坐标不唯一不是排版上的小麻烦,它直接废掉了两个最常用的操作。
第一个是判断一个点在不在曲线上。直角坐标下把
代进方程看等不等就完了;极坐标下代一组不等,只说明这一组不满足。心形线
与点
是个现成的例子:直接代得
,与
相差甚远,照这一步判就是「不在曲线上」。但
的规范形是
,而
,
确实在心形线上。实现里 onCurve 改为枚举各组表示逐个试;顺带一提,
算出来是 1.0000000000000004,判等只能带容差。
警示 · 「代进去不满足」在极坐标下推不出「不在曲线上」。要判否,须说明该点的每一组表示都不满足。
第二个是求两条曲线的交点。联立 解出的是「两条曲线在同一个 上取到同一个 」的那些点,而两条曲线完全可以在同一个点上各用各的坐标相遇。极点是这类漏解的高发处:心形线 在 处过极点,圆 在 处过极点,两个角不同,差 在 处等于 ,离零远得很。实测这一对:联立方程得两个交点 ,逐表示扫描得三个,多出来的那个就是极点。
把六组常见曲线对一起跑一遍,差距更清楚:
| 曲线对 | 联立方程 | 逐表示扫描 | 漏 |
|---|---|---|---|
| 与 | 2 | 3 | 极点 |
| 与 | 2 | 3 | 极点 |
| 与 | 1 | 2 | 极点 |
| 与 | 4 | 8 | 负极径那一半 |
| 与 | 6 | 6 | 无 |
| 与 | 1 | 2 | 极点 |
| 合计 | 16 | 24 | 8 |
漏掉的八个里,五个是极点,四个来自 取负的那些表示( 那一行一次漏四个)。 那一行不漏,因为奇数瓣玫瑰线在后半圈重描自身,负极径的解与已有的解重合。
求交的操作比直角坐标多一步:解完方程,还要单独问一句两条曲线各自过不过极点。
5 · 换坐标的判据
判据不是曲线的名字,而是「这条曲线的定义里出现的是距离和角,还是横纵坐标」。圆心在极点的圆、绕定点旋转的轨迹、按角度分布的花瓣,定义里天然带着 与 ,换过去方程就短。反过来,直线与抛物线在直角坐标下最简,硬写成极坐标只会多出一个分母。
有一类曲线两边都写得出但难度悬殊:四叶玫瑰线在极坐标下是 ,在直角坐标下要写成 ,一个六次方程。曲线还是那条曲线,换坐标只是换了一种记账方式。
6 · 参考文献
- Polar coordinate system. Wikipedia. 极坐标的定义、互化公式与表示不唯一。https://en.wikipedia.org/wiki/Polar_coordinate_system
- Polar curve. Wikipedia. 极坐标方程给出的曲线,以及求交时的极点问题。https://en.wikipedia.org/wiki/Polar_curve
- Math.atan2(). MDN. atan2 的返回区间与它在原点、负零上的取值。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atan2
- Subnormal number. Wikipedia. 次正规数的表示范围与它的精度损失。https://en.wikipedia.org/wiki/Subnormal_number