Skip to content

向量、点积与叉积 ​

先把向量(vector)想成一支具有长度和方向的箭头。同一个箭头可以平移到别处而不改变它表达的位移。点(point)则表示相对于原点的位置。它们可能都存为三个数字,却有不同的计算规则:两个点相减得到位移;点加位移得到新点。

三个数字首先需要三根轴 ​

在东、北、天坐标中,v = (3, 4, 0) m/s 表示每秒向东 3 m、向北 4 m。模长(magnitude)由勾股定理(Pythagorean theorem)得到:

‖v‖=vx2+vy2+vz2=5 m/s,v^=v‖v‖=(0.6,0.8,0)

单位向量(unit vector)只保存方向,模长为 1。归一化(normalization)是求这个单位向量的过程。零向量没有确定方向,因此不能直接除以零;应让业务决定返回空值、沿用旧方向还是重新播种。

记号 / 英文含义单位
v / vector三个轴上的分量取决于物理量,例如 m/s
|v| / magnitude向量长度与 v 相同
ê / unit vector只有方向的单位向量无量纲
a·b / dot product点积两个输入单位的乘积
a×b / cross product叉积两个输入单位的乘积

点积:在指定方向上有多少 ​

点积(dot product)将两个向量变成一个数:

a⋅b=axbx+ayby+azbz=‖a‖‖b‖cos⁡θ

如果 ê 是单位东向量 (1,0,0),那么 v·ê = 3 m/s 就是东向的有符号投影(signed projection)。点积为零表示垂直,为正表示夹角小于 90°,为负表示超过 90°。计算两条非零向量夹角时可使用 acos(dot / (lenA × lenB)),并将浮点结果夹到 [-1,1]。

叉积:得到垂直方向 ​

叉积(cross product)在三维中产生一条同时垂直于两个输入的向量,其方向遵守右手规则(right-hand rule)。交换输入顺序,结果反号。

a×b=(aybz−azbyazbx−axbzaxby−aybx)
ts
type V3 = readonly [number, number, number]
const dot = (a: V3, b: V3) => a[0]*b[0] + a[1]*b[1] + a[2]*b[2]
const cross = (a: V3, b: V3): V3 => [
  a[1]*b[2] - a[2]*b[1],
  a[2]*b[0] - a[0]*b[2],
  a[0]*b[1] - a[1]*b[0],
]
const east: V3 = [1, 0, 0]
const north: V3 = [0, 1, 0]
cross(east, north) // [0,0,1],ENU右手坐标中的天向
cross(north, east) // [0,0,-1]

若两个输入是三角形的边,则叉积的模长是对应平行四边形的面积,三角形面积为它的一半。把叉积归一化可得到面法线(surface normal);顶点绕序(winding order)颠倒会令法线反向,影响背面剔除与光照。共线边的叉积为零,不能生成稳定法线。

风速分量描述空气朝向哪里运动;气象风向通常描述风来自哪里。例如西风向东吹,东向速度为正。读数据时还需核对速度分量使用地理东/北方向,还是模型网格方向。

自检:三角形朝哪面 ​

设 A=(0,0,0)、B=(2,0,0)、C=(0,3,0),长度单位是米。计算 (B−A)×(C−A)、三角形面积及单位法线。

答案与理由

两条边为 (2,0,0) 与 (0,3,0),叉积为 (0,0,6) m²,面积为 6/2 = 3 m²,单位法线为 (0,0,1)。改用 (C−A)×(B−A) 会得到反方向;面积保持不变。

下一步:矩阵、基与坐标变换。回到主课:Geometry 的顶点与索引。

气象学 · 数学基础 · 地理可视化