数学 / 直线与圆 · 从方程到位置关系 / 倾斜角与斜率 待审核 1 / 6
α ∈ [0°, 180°) · k = tan α

倾斜角与斜率

一条直线的「倾斜程度」需要一个可比较的量。倾斜角是它的角度写法:直线向上的方向与 xx 轴正方向所成的角,取值范围 [0°,180°)[0°, 180°)斜率是它的比值写法:倾斜角的正切。两种写法各有所长,也各有一处失效。

1 · 倾斜角的取值范围

直线与 xx 轴的夹角本可以有两个(互补的一对),课本约定取「向上方向与 xx 轴正方向」那一个,范围随之锁定在 [0°,180°)[0°, 180°)。右端开区间是必要的:180°180°0° 描述同一批水平直线,两端都闭会让同一条线有两个倾斜角。

平面上每条直线都有倾斜角,包括竖直线(90°90°)。这是倾斜角相对斜率的优势:它没有例外。

2 · 斜率与两点式

k=tanαk = \tan \alphaα=90°\alpha = 90° 时正切无定义,竖直线因此没有斜率——不是斜率为无穷,而是这个量不存在。

过两点 P1(x1,y1)P_1(x_1, y_1)P2(x2,y2)P_2(x_2, y_2) 的直线,若 x1x2x_1 \ne x_2,斜率为

k=y2y1x2x1k = \frac{y_2 - y_1}{x_2 - x_1}

分母为零正对应竖直线。这个式子与两点的次序无关:交换 P1P_1P2P_2,分子分母同时变号。

图 2-1 · 倾斜角与斜率的对应。可拖动倾斜角观察斜率如何变化,把角推到 90°90° 附近看斜率的量级,右侧表列出几个特殊角的斜率。

3 · 两者不是线性关系

倾斜角均匀增大时,斜率并不均匀增大。0°45°45° 之间斜率从 00 长到 1145°45°60°60° 只走了 15°15° 却从 11 长到 31.732\sqrt{3} \approx 1.732,而 89°89° 处已是 57.2957.29。实测几档:89.9°89.9° 对应 572.96572.9689.99°89.99° 对应 5729.585729.5889.99999°89.99999° 对应 5.73×1065.73 \times 10^6。角度每向 90°90° 靠近一个数量级,斜率就放大一个数量级。

90°90° 之后斜率变为负值并从很大的负数往 00 回升:91°91° 对应 57.29-57.29135°135° 对应 1-1179°179° 对应 0.017-0.017。斜率的符号只区分「钝角还是锐角」,绝对值才反映陡缓。

4 · 「斜率不存在」在浮点里没有标记

数值实现上有一处陷阱:Math.tan(Math.PI / 2) 不返回 Infinity,而是返回 1.6331×10161.6331 \times 10^{16}。原因是 π2\frac{\pi}{2} 本身不能被双精度精确表示,Math.PI / 2 是一个与它相差约 6×10176 \times 10^{-17} 的数,正切在那里是有限值。「斜率是否存在」这件事在浮点数里没有任何标记可查——拿到的只是一个很大的数。

core/geom.ts 因此不靠斜率判断竖直:直线一律以一般式 Ax+By+C=0Ax + By + C = 0 存储,slopeOfB=0B = 0 时返回 null,判据是系数而不是数值的大小。同理,两点式的分母为零由「横坐标是否相等」判定,不由 kk 的量级判定。1.6×10161.6 \times 10^{16} 与真正的竖直线在图上无法区分,但在后续计算里会一路带着这个巨大的数,最终把交点坐标推到无意义的量级。

注 · slopeOf 里另有一处只在回显时才看得见的细节:水平线的 A=0A = 0,算出的 kk0-0-00 在数值上相等,String(-0) 却是 "-0",读数面板上会印出「斜率 -0」。故这一函数把 0-0 归成 00 再返回。

5 · 参考文献

  1. Slope. Wikipedia. 斜率的定义、两点公式与倾斜角的关系。https://en.wikipedia.org/wiki/Slope
  2. Angle of inclination. Encyclopedia of Mathematics. 倾斜角的取值约定。https://encyclopediaofmath.org/wiki/Angle
  3. IEEE 754. Wikipedia. 双精度的表示范围,以及 π2\frac{\pi}{2} 无法精确表示的后果。https://en.wikipedia.org/wiki/IEEE_754