余弦定理与边角互化
勾股定理只对直角三角形成立。夹角一旦不是直角, 与 就不再相等,而差额是可以写出来的:它只依赖两条邻边与夹角。这条补上差额的等式就是余弦定理。
1 · 修正项的来历
把三角形摆进坐标系: 放在原点, 放在 ,则 的坐标是 。边 是 到 的距离,直接按两点距离公式展开:
前两项由平方关系合成 ,得到:
定理 1.1(余弦定理) 在任意三角形中 ,另两式由字母轮换给出。
坐标推导顺带交出了几何读法。过 向 作垂线,垂足 的横坐标恰是 ,这个量是 在 上的投影长。 为钝角时 为负,投影随之为负,垂足落到 的左侧、线段 之外;代数式里那个负号在图上就是这件事。
时 ,修正项整项消失,等式退回勾股定理。所以余弦定理与勾股定理是同一条等式的两个版本,后者只是 的特例。
2 · 由三边反解出的角
定理 1.1 移项即得 。这个方向比正弦定理干净:余弦在 上单调递减,一个余弦值对应唯一一个内角,不存在 给值求角与凑角的拆法 里讨论的那种二解。已知三边求角一律走余弦定理,正是为了避开那次分类讨论。
警示 · 分子
在三点接近共线时是两个相近数之差,商可以越出
,而 Math.acos 对越界输入返回 NaN。这不是假想的边界:随机生成大批细长三角形、每个取三个角,越界的商占一到两成——具体比例随「抽样有多退化」而变(两次不同的抽样分别得到
与
),故它不是一个可复现的常数,能钉住的是具体那一组:三边取 34153.558680933005、7.546010854644671、34161.10469178765 时商为 1.0000000000003217,单测里以逐位相等断言这个值与随后的 NaN。angleFromSides 因此先把商夹到
再交给 Math.acos。夹一下不能把精度找回来,只能保证返回的是
或
而不是 NaN——真正的精度损失早在「顶点坐标换算成边长」那一步就发生了,三角形面积与形状判定 §3 有同一现象的量化。
角度本身也在流失精度。顶点取
、、,
处的角接近
。把由坐标直接量出的夹角(走
与向量叉积)当参照,余弦定理反解出的角在
时相对偏差 4.32e-15,
时 3.04e-13,
时 1.41e-11,
时 6.83e-10。高度每缩小两个数量级,相对偏差涨约五十倍,而绝对误差始终不超过
度——只看绝对误差会以为一切正常。
3 · 两类已知条件
| 已知 | 步骤 | 要点 |
|---|---|---|
| 三边(SSS) | 三次反解或两次反解加内角和 | 先算最大边的对角,它是唯一可能的钝角 |
| 两边及夹角(SAS) | 一次正向算出第三边,再反解一个角 | 反解时优先算较小边的对角,避开钝角的符号判断 |
两条建议都为同一件事服务:把「可能是钝角」的那个角安排在能由符号自动定出的位置上,而不是靠事后检查。第三边算出后若改用正弦定理求余下的角,就又要面对 SSA 那种二解判别,得不偿失。
4 · 形状判定
三角形的钝直锐由最大角决定,而最大角必是最大边的对角。设三边排序后为 ,只需看 的符号:为正则是锐角三角形,为零是直角三角形,为负是钝角三角形。余下两角必为锐角,不必再验。
例 4.1 三边为 、、。最大边是 ,,故为钝角三角形,钝角是 的对角,,约 。三边为 、、 时同一式子得 ,直角。三边为 、、 时得 ,锐角。
容差按边长平方的相对量取,而不是取一个绝对值:classify 里判零用的是
。边长量级从米换成毫米,同一个三角形的形状结论不该跟着变,而绝对容差做不到这一点。
5 · 参考文献
- Law of cosines. Wikipedia. 余弦定理的多种证明、历史与它对勾股定理的推广。https://en.wikipedia.org/wiki/Law_of_cosines
- Law of Cosines. Wolfram MathWorld. 等价形式与由它派生的半角公式。https://mathworld.wolfram.com/LawofCosines.html
- Jamshīd al-Kāshī. Wikipedia. 余弦定理在三角学史上的定型者之一。https://en.wikipedia.org/wiki/Jamsh%C4%ABd_al-K%C4%81sh%C4%AB
- Loss of significance. Wikipedia. 相近数相减导致有效位抵消的一般机制。https://en.wikipedia.org/wiki/Loss_of_significance
- Solution of triangles. Wikipedia. SSS 与 SAS 两类已知条件的标准解法。https://en.wikipedia.org/wiki/Solution_of_triangles