本课只解决一个问题
怎样用数字描述“转了多少”,并从三条边算出三角形的角?
共形映射的核心是局部保持角度。若角度和三角函数没有真正掌握,后面的“保角”只会变成一句口号。
1. 角度测量的是旋转量
一整圈可以分成360∘,也可以记为2π 弧度。因此
180∘=π,90∘=2π.
微积分默认使用弧度,因为只有弧度下才有简洁公式
dxdsinx=cosx.
角度不是边长。把一个三角形整体放大两倍,边长改变,角度不变。
2. 弧度从哪里来
半径为r 的圆上,圆心角θ 对应弧长s。弧度定义为
θ=rs.
整圆的弧长是2πr,所以整圈角度为2πr/r=2π。
这个定义没有单位依赖:圆放大后s 和r 同时放大,比值不变。
3. 单位圆定义正弦和余弦
在半径为1 的圆上,从点(1,0) 逆时针转过角θ,到达点
(cosθ,sinθ).
因此cosθ 是横坐标,sinθ 是纵坐标。由圆方程x2+y2=1,立刻得到
cos2θ+sin2θ=1.
几个必须熟悉的值:
| θ | 0 | π/2 | π | 3π/2 |
|---|
| cosθ | 1 | 0 | −1 | 0 |
| sinθ | 0 | 1 | 0 | −1 |
4. 正切表示斜率
当cosθ=0 时,定义
tanθ=cosθsinθ.
从原点指向(cosθ,sinθ) 的直线斜率正是tanθ。这把“旋转角”与“直线有多斜”联系起来。
5. 点积怎样给出夹角
两个非零向量a,b 的夹角θ 满足
cosθ=∥a∥∥b∥a⋅b.
这条公式的意义先于计算:
- cosθ=1:同方向;
- cosθ=0:垂直;
- cosθ=−1:反方向。
下一课会从余弦定理推导它。
6. 余弦定理:从三条边恢复角度
三角形三边长度分别为a,b,c,角γ 位于边a,b 之间,且对着边c。余弦定理为
c2=a2+b2−2abcosγ.
移项后
cosγ=2aba2+b2−c2,
所以
γ=arccos(2aba2+b2−c2).
这就是离散几何从网格边长恢复三角形内角的基本公式。
7. 手算例子
边长为a=3,b=4,c=5:
cosγ=2⋅3⋅432+42−52=249+16−25=0.
所以γ=π/2,这是直角三角形。
再看等边三角形a=b=c=1:
cosγ=21+1−1=21,
故γ=π/3=60∘。
8. 三角形不等式不是可选条件
三个正数能成为三角形边长,当且仅当
a+b>c,b+c>a,c+a>b.
例如1,2,4 不能组成三角形,因为1+2<4。数值算法更新边长后必须检查这些不等式,否则角度公式会失去几何意义。
9. 角度为什么是共形量
若所有长度同时乘以λ>0,余弦定理中的分子和分母都乘以λ2,比值不变:
2(λa)(λb)(λa)2+(λb)2−(λc)2=2aba2+b2−c2.
所以统一缩放保持角度。共形映射在每个足够小的邻域里就像“旋转加统一缩放”,因此局部角度不变。
10. 常见误区
- 计算器可能处于角度制,而公式和代码通常使用弧度制。
- cos−1x 在这里表示arccosx,不是1/cosx。
- 浮点误差可能让理论上属于[−1,1] 的余弦值略微越界,代码中应裁剪。
- 只保持一个三角形的三个角,并不自动保证整个网格没有翻转。
11. 最小代码实验
import numpy as np
def angle_from_sides(a, b, c):
cosine = (a*a + b*b - c*c) / (2*a*b)
cosine = np.clip(cosine, -1.0, 1.0)
return np.arccos(cosine)
print(angle_from_sides(3, 4, 5))
print(np.degrees(angle_from_sides(1, 1, 1)))
12. 自测与答案
题 1。60∘ 等于多少弧度?
答案。60/180⋅π=π/3。
题 2。 边长2,2,2 的三角形整体放大为10,10,10,角度是否改变?
答案。 不改变,三个角仍为60∘。
题 3。2,3,5 能否构成非退化三角形?
答案。 不能,因为2+3=5,三点落在一条直线上,面积为零。
前后课程
上一课:函数与坐标 | 下一课:向量、长度与内积