CCG 00-04:向量、长度与内积——把几何变成运算

本课只解决一个问题

怎样只用数字计算方向、长度、夹角、投影和三角形面积?

这些量以后会分别变成切向量、度量、共形条件和网格面积。

1. 点和向量不是同一种对象

点表示位置,向量表示位移。若

p=(1,2),q=(4,6),p=(1,2),\qquad q=(4,6),

那么从pp 指向qq 的向量是

v=q−p=(3,4).v=q-p=(3,4).

把向量加到点上得到新点:p+v=qp+v=q。两个点相加通常没有天然几何意义,但两个位移可以相加。

2. 向量加法与数乘

设a=(a1,a2)a=(a_1,a_2)、b=(b1,b2)b=(b_1,b_2):

a+b=(a1+b1,a2+b2),a+b=(a_1+b_1,a_2+b_2),

λa=(λa1,λa2).\lambda a=(\lambda a_1,\lambda a_2).

λ>1\lambda>1 拉长,0<λ<10<\lambda<1 缩短,λ<0\lambda<0 还会反向。

线段上从pp 到qq 的点可以写成

(1−t)p+tq,0≤t≤1.(1-t)p+tq,\qquad 0\le t\le1.

系数之和为11,所以它与坐标原点的选择无关。这类组合叫仿射组合。

3. 长度来自平方和

二维向量v=(v1,v2)v=(v_1,v_2) 的欧氏长度为

∥v∥=v12+v22.\|v\|=\sqrt{v_1^2+v_2^2}.

它就是勾股定理。上例v=(3,4)v=(3,4):

∥v∥=32+42=5.\|v\|=\sqrt{3^2+4^2}=5.

两点距离定义为位移长度:

d(p,q)=∥q−p∥.d(p,q)=\|q-p\|.

4. 内积同时编码长度和角度

定义

a⋅b=a1b1+a2b2.a\cdot b=a_1b_1+a_2b_2.

把向量与自身做内积:

a⋅a=a12+a22=∥a∥2.a\cdot a=a_1^2+a_2^2=\|a\|^2.

内积与夹角的关系是

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

从余弦定理推导

三角形三边可以取a,b,a−ba,b,a-b。余弦定理给出

∥a−b∥2=∥a∥2+∥b∥2−2∥a∥∥b∥cos⁡θ.\|a-b\|^2=\|a\|^2+\|b\|^2-2\|a\|\|b\|\cos\theta.

另一方面直接展开:

∥a−b∥2=(a−b)⋅(a−b)=a⋅a−2a⋅b+b⋅b=∥a∥2−2a⋅b+∥b∥2.\begin{aligned} \|a-b\|^2 &=(a-b)\cdot(a-b)\\ &=a\cdot a-2a\cdot b+b\cdot b\\ &=\|a\|^2-2a\cdot b+\|b\|^2. \end{aligned}

比较两式,得到内积公式。

5. 正交与投影

若a⋅b=0a\cdot b=0,且两者非零,则cos⁡θ=0\cos\theta=0,所以a,ba,b 垂直。

把vv 投影到非零方向aa 上:

proj⁡a(v)=v⋅aa⋅aa.\operatorname{proj}_a(v) =\frac{v\cdot a}{a\cdot a}a.

以v=(3,4)v=(3,4)、a=(1,0)a=(1,0) 为例:

proj⁡a(v)=3(1,0)=(3,0).\operatorname{proj}_a(v)=3(1,0)=(3,0).

余量(0,4)(0,4) 与aa 垂直。最小二乘法和切空间分解都在重复这一思想。

6. 三维叉积与面积

三维向量a,ba,b 的叉积a×ba\times b 同时垂直于二者,长度为

∥a×b∥=∥a∥∥b∥sin⁡θ.\|a\times b\|=\|a\|\|b\|\sin\theta.

这等于由a,ba,b 张成的平行四边形面积,所以三角形面积为

A=12∥a×b∥.A=\frac12\|a\times b\|.

三角网格中,取a=p1−p0a=p_1-p_0、b=p2−p0b=p_2-p_0 即可计算面法向与面积。

7. 手算例子

设a=(1,2)a=(1,2)、b=(2,−1)b=(2,-1):

a⋅b=1⋅2+2⋅(−1)=0.a\cdot b=1\cdot2+2\cdot(-1)=0.

所以它们垂直。长度都为5\sqrt5。虽然坐标看起来不“横平竖直”,内积仍能识别正交。

8. 共形映射为什么关心内积

若线性映射AA 把任意向量长度统一乘以λ\lambda,并保持夹角,那么

(Aa)⋅(Ab)=λ2(a⋅b).(Aa)\cdot(Ab)=\lambda^2(a\cdot b).

用矩阵写就是

ATA=λ2I.A^TA=\lambda^2I.

这将成为线性映射保角的精确判据。

9. 最小代码实验

import numpy as np

a = np.array([1.0, 2.0])
b = np.array([2.0, -1.0])

dot = a @ b
angle = np.arccos(np.clip(dot / (np.linalg.norm(a) * np.linalg.norm(b)), -1, 1))
print(dot)                 # 0.0
print(np.degrees(angle))   # 90.0

10. 常见误区

  1. 坐标是数组,不代表所有数组都可以当点和向量混用。
  2. a⋅ba\cdot b 是标量;a×ba\times b 在三维中是向量。
  3. 两个零向量的夹角没有定义,因为公式分母为零。
  4. 法向方向依赖三角形顶点顺序,交换两个顶点会反向。

11. 自测与答案

题 1。p=(1,1)p=(1,1)、q=(4,5)q=(4,5),求距离。

答案。q−p=(3,4)q-p=(3,4),距离为55。

题 2。(1,1)(1,1) 在(1,0)(1,0) 上的投影是什么?

答案。(1,0)(1,0)。

题 3。 为什么a⋅b=0a\cdot b=0 能说明非零向量垂直?

答案。 因为a⋅b=∥a∥∥b∥cos⁡θa\cdot b=\|a\|\|b\|\cos\theta,非零长度使cos⁡θ=0\cos\theta=0,故θ=π/2\theta=\pi/2。

前后课程

上一课:角度与三角函数 | 下一课:矩阵是线性映射