CCG 00-03:角度与三角函数——共形几何在保持什么

本课只解决一个问题

怎样用数字描述“转了多少”,并从三条边算出三角形的角?

共形映射的核心是局部保持角度。若角度和三角函数没有真正掌握,后面的“保角”只会变成一句口号。

1. 角度测量的是旋转量

一整圈可以分成360∘360^\circ,也可以记为2π2\pi 弧度。因此

180∘=π,90∘=π2.180^\circ=\pi,\qquad 90^\circ=\frac\pi2.

微积分默认使用弧度,因为只有弧度下才有简洁公式

ddxsin⁡x=cos⁡x.\frac{d}{dx}\sin x=\cos x.

角度不是边长。把一个三角形整体放大两倍,边长改变,角度不变。

2. 弧度从哪里来

半径为rr 的圆上,圆心角θ\theta 对应弧长ss。弧度定义为

θ=sr.\theta=\frac{s}{r}.

整圆的弧长是2πr2\pi r,所以整圈角度为2πr/r=2π2\pi r/r=2\pi。

这个定义没有单位依赖:圆放大后ss 和rr 同时放大,比值不变。

3. 单位圆定义正弦和余弦

在半径为11 的圆上,从点(1,0)(1,0) 逆时针转过角θ\theta,到达点

(cos⁡θ,sin⁡θ).(\cos\theta,\sin\theta).

因此cos⁡θ\cos\theta 是横坐标,sin⁡θ\sin\theta 是纵坐标。由圆方程x2+y2=1x^2+y^2=1,立刻得到

cos⁡2θ+sin⁡2θ=1.\cos^2\theta+\sin^2\theta=1.

几个必须熟悉的值:

θ\theta00π/2\pi/2π\pi3π/23\pi/2
cos⁡θ\cos\theta1100−1-100
sin⁡θ\sin\theta001100−1-1

4. 正切表示斜率

当cos⁡θ≠0\cos\theta\ne0 时,定义

tan⁡θ=sin⁡θcos⁡θ.\tan\theta=\frac{\sin\theta}{\cos\theta}.

从原点指向(cos⁡θ,sin⁡θ)(\cos\theta,\sin\theta) 的直线斜率正是tan⁡θ\tan\theta。这把“旋转角”与“直线有多斜”联系起来。

5. 点积怎样给出夹角

两个非零向量a,ba,b 的夹角θ\theta 满足

cos⁡θ=a⋅b∥a∥∥b∥.\cos\theta=\frac{a\cdot b}{\|a\|\|b\|}.

这条公式的意义先于计算:

  • cos⁡θ=1\cos\theta=1:同方向;
  • cos⁡θ=0\cos\theta=0:垂直;
  • cos⁡θ=−1\cos\theta=-1:反方向。

下一课会从余弦定理推导它。

6. 余弦定理:从三条边恢复角度

三角形三边长度分别为a,b,ca,b,c,角γ\gamma 位于边a,ba,b 之间,且对着边cc。余弦定理为

c2=a2+b2−2abcos⁡γ.c^2=a^2+b^2-2ab\cos\gamma.

移项后

cos⁡γ=a2+b2−c22ab,\cos\gamma=\frac{a^2+b^2-c^2}{2ab},

所以

γ=arccos⁡(a2+b2−c22ab).\gamma=\arccos\left(\frac{a^2+b^2-c^2}{2ab}\right).

这就是离散几何从网格边长恢复三角形内角的基本公式。

7. 手算例子

边长为a=3,b=4,c=5a=3,b=4,c=5:

cos⁡γ=32+42−522⋅3⋅4=9+16−2524=0.\cos\gamma =\frac{3^2+4^2-5^2}{2\cdot3\cdot4} =\frac{9+16-25}{24}=0.

所以γ=π/2\gamma=\pi/2,这是直角三角形。

再看等边三角形a=b=c=1a=b=c=1:

cos⁡γ=1+1−12=12,\cos\gamma=\frac{1+1-1}{2}=\frac12,

故γ=π/3=60∘\gamma=\pi/3=60^\circ。

8. 三角形不等式不是可选条件

三个正数能成为三角形边长,当且仅当

a+b>c,b+c>a,c+a>b.a+b>c,\qquad b+c>a,\qquad c+a>b.

例如1,2,41,2,4 不能组成三角形,因为1+2<41+2<4。数值算法更新边长后必须检查这些不等式,否则角度公式会失去几何意义。

9. 角度为什么是共形量

若所有长度同时乘以λ>0\lambda>0,余弦定理中的分子和分母都乘以λ2\lambda^2,比值不变:

(λa)2+(λb)2−(λc)22(λa)(λb)=a2+b2−c22ab.\frac{(\lambda a)^2+(\lambda b)^2-(\lambda c)^2} {2(\lambda a)(\lambda b)} =\frac{a^2+b^2-c^2}{2ab}.

所以统一缩放保持角度。共形映射在每个足够小的邻域里就像“旋转加统一缩放”,因此局部角度不变。

10. 常见误区

  1. 计算器可能处于角度制,而公式和代码通常使用弧度制。
  2. cos⁡−1x\cos^{-1}x 在这里表示arccos⁡x\arccos x,不是1/cos⁡x1/\cos x。
  3. 浮点误差可能让理论上属于[−1,1][-1,1] 的余弦值略微越界,代码中应裁剪。
  4. 只保持一个三角形的三个角,并不自动保证整个网格没有翻转。

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))          # 1.570796... = pi/2
print(np.degrees(angle_from_sides(1, 1, 1)))  # 60.0

12. 自测与答案

题 1。60∘60^\circ 等于多少弧度?

答案。60/180⋅π=π/360/180\cdot\pi=\pi/3。

题 2。 边长2,2,22,2,2 的三角形整体放大为10,10,1010,10,10,角度是否改变?

答案。 不改变,三个角仍为60∘60^\circ。

题 3。2,3,52,3,5 能否构成非退化三角形?

答案。 不能,因为2+3=52+3=5,三点落在一条直线上,面积为零。

前后课程

上一课:函数与坐标 | 下一课:向量、长度与内积