倾斜角与斜率
一条直线的「倾斜程度」需要一个可比较的量。倾斜角是它的角度写法:直线向上的方向与 轴正方向所成的角,取值范围 。斜率是它的比值写法:倾斜角的正切。两种写法各有所长,也各有一处失效。
1 · 倾斜角的取值范围
直线与 轴的夹角本可以有两个(互补的一对),课本约定取「向上方向与 轴正方向」那一个,范围随之锁定在 。右端开区间是必要的: 与 描述同一批水平直线,两端都闭会让同一条线有两个倾斜角。
平面上每条直线都有倾斜角,包括竖直线()。这是倾斜角相对斜率的优势:它没有例外。
2 · 斜率与两点式
。 时正切无定义,竖直线因此没有斜率——不是斜率为无穷,而是这个量不存在。
过两点 与 的直线,若 ,斜率为
分母为零正对应竖直线。这个式子与两点的次序无关:交换 与 ,分子分母同时变号。
3 · 两者不是线性关系
倾斜角均匀增大时,斜率并不均匀增大。 到 之间斜率从 长到 , 到 只走了 却从 长到 ,而 处已是 。实测几档: 对应 , 对应 , 对应 。角度每向 靠近一个数量级,斜率就放大一个数量级。
之后斜率变为负值并从很大的负数往 回升: 对应 , 对应 , 对应 。斜率的符号只区分「钝角还是锐角」,绝对值才反映陡缓。
4 · 「斜率不存在」在浮点里没有标记
数值实现上有一处陷阱:Math.tan(Math.PI / 2) 不返回 Infinity,而是返回
。原因是
本身不能被双精度精确表示,Math.PI / 2 是一个与它相差约
的数,正切在那里是有限值。「斜率是否存在」这件事在浮点数里没有任何标记可查——拿到的只是一个很大的数。
core/geom.ts 因此不靠斜率判断竖直:直线一律以一般式
存储,slopeOf 在
时返回 null,判据是系数而不是数值的大小。同理,两点式的分母为零由「横坐标是否相等」判定,不由
的量级判定。
与真正的竖直线在图上无法区分,但在后续计算里会一路带着这个巨大的数,最终把交点坐标推到无意义的量级。
注 · slopeOf 里另有一处只在回显时才看得见的细节:水平线的
,算出的
是
。-0 与 0 在数值上相等,String(-0) 却是 "-0",读数面板上会印出「斜率 -0」。故这一函数把
归成
再返回。
5 · 参考文献
- Slope. Wikipedia. 斜率的定义、两点公式与倾斜角的关系。https://en.wikipedia.org/wiki/Slope
- Angle of inclination. Encyclopedia of Mathematics. 倾斜角的取值约定。https://encyclopediaofmath.org/wiki/Angle
- IEEE 754. Wikipedia. 双精度的表示范围,以及 无法精确表示的后果。https://en.wikipedia.org/wiki/IEEE_754