跳到主要内容

3.1 曲线

来源:Mario Botsch 等人的 Polygon Mesh Processing,第 3 章 Differential Geometry,3.1 小节 Curves。

第 3 章开始进入微分几何。书中先从平面曲线讲起,再推广到曲面和三角网格上的离散微分算子。

这一节的目标是建立几个基础概念:

  • 参数曲线。
  • 切向量。
  • 法向量。
  • 弧长。
  • 弧长参数化。
  • 曲率。
  • 密切圆。

本节核心

考虑一条嵌入在平面中的光滑曲线:

x:[a,b]R2\mathbf{x}:[a,b]\rightarrow\mathbb{R}^2

它可以写成:

x(u)=[x(u)y(u)]\mathbf{x}(u) = \begin{bmatrix} x(u)\\ y(u) \end{bmatrix}

其中 uu 是参数。

曲线是这个函数的像:

C={x(u)u[a,b]}C=\{\mathbf{x}(u)\mid u\in[a,b]\}

微分几何关心的不是某个具体参数 uu,而是曲线本身的几何性质,例如长度和曲率。

切向量

曲线在参数 uu 处的切向量是坐标函数的一阶导数:

x(u)=[x(u)y(u)]\mathbf{x}'(u) = \begin{bmatrix} x'(u)\\ y'(u) \end{bmatrix}

如果把曲线看成一个点随时间运动的轨迹,并令 u=tu=t,那么:

x(t)\mathbf{x}'(t)

就是速度向量。

书中假设参数化是 regular 的,也就是:

x(u)0u[a,b]\mathbf{x}'(u)\neq \mathbf{0} \quad \forall u\in[a,b]

否则某些点的切向量为零,曲线局部会退化,很多微分几何量无法稳定定义。

法向量

在二维平面中,可以把切向量旋转 9090^\circ 得到法向方向。

如果:

x(u)=[ab]\mathbf{x}'(u) = \begin{bmatrix} a\\ b \end{bmatrix}

那么一种 9090^\circ 旋转结果是:

x(u)=[ba]\mathbf{x}'(u)^\perp = \begin{bmatrix} -b\\ a \end{bmatrix}

单位法向量为:

n(u)=x(u)x(u)\mathbf{n}(u) = \frac{\mathbf{x}'(u)^\perp} {\|\mathbf{x}'(u)^\perp\|}

由于旋转方向可以选顺时针或逆时针,法向量的方向有符号约定。后面曲率的符号也会依赖这个约定。

同一条曲线可以有不同参数化

曲线由函数的像决定,不由某个具体参数化唯一决定。

例如:

x1(u)=[uu],u[0,1]\mathbf{x}_1(u) = \begin{bmatrix} u\\ u \end{bmatrix}, \quad u\in[0,1]

和:

x2(u)=[u2u2],u[0,1]\mathbf{x}_2(u) = \begin{bmatrix} u^2\\ u^2 \end{bmatrix}, \quad u\in[0,1]

它们都描述从 (0,0)(0,0)(1,1)(1,1) 的同一条线段。

区别在于运动速度不同。

x1\mathbf{x}_1

x1(u)=[11]\mathbf{x}_1'(u) = \begin{bmatrix} 1\\ 1 \end{bmatrix}

速度大小恒定:

x1(u)=2\|\mathbf{x}_1'(u)\|=\sqrt{2}

x2\mathbf{x}_2

x2(u)=[2u2u]\mathbf{x}_2'(u) = \begin{bmatrix} 2u\\ 2u \end{bmatrix}

速度大小为:

x2(u)=22u\|\mathbf{x}_2'(u)\| = 2\sqrt{2}u

它随 uu 改变。

所以参数化不同,但几何形状相同。

信息

微分几何希望研究的是不依赖具体参数化的性质,比如曲线长度和曲率,而不是“某个参数值处速度是多少”这种参数化相关量。

3.1.1 弧长

曲线段 [c,d][a,b][c,d]\subseteq[a,b] 的长度为:

l(c,d)=cdx(u)dul(c,d) = \int_c^d \|\mathbf{x}'(u)\|\,du

这里:

x(u)\|\mathbf{x}'(u)\|

可以理解为单位参数变化对应的曲线长度变化,也就是速度大小。

因此切向量编码了曲线的 metric 信息。

数值例子:直线段长度

设:

x(u)=[uu],u[0,1]\mathbf{x}(u) = \begin{bmatrix} u\\ u \end{bmatrix}, \quad u\in[0,1]

切向量:

x(u)=[11]\mathbf{x}'(u) = \begin{bmatrix} 1\\ 1 \end{bmatrix}

速度大小:

x(u)=12+12=2\|\mathbf{x}'(u)\| = \sqrt{1^2+1^2} = \sqrt{2}

所以总长度:

L=012du=2L = \int_0^1 \sqrt{2}\,du = \sqrt{2}

这正是点 (0,0)(0,0)(1,1)(1,1) 的欧氏距离。

弧长参数化

可以把原始参数 uu 转换成弧长参数 ss

s=s(u)=aux(t)dts=s(u) = \int_a^u \|\mathbf{x}'(t)\|\,dt

其中 ss 表示从起点 x(a)\mathbf{x}(a) 走到 x(u)\mathbf{x}(u) 的曲线长度。

如果整条曲线长度为:

L=abx(u)duL = \int_a^b \|\mathbf{x}'(u)\|\,du

那么弧长参数把区间 [a,b][a,b] 映射到:

[0,L][0,L]

弧长参数化的重要性质是:

x(0)\mathbf{x}(0)x(s)\mathbf{x}(s) 的曲线长度正好等于 ss

这是一种长度保持的参数化,也就是 isometry。

弧长参数化下的单位速度

如果曲线用弧长 ss 参数化,那么:

x(s)=1\|\mathbf{x}'(s)\|=1

也就是说,沿曲线每走一个单位的 ss,就在几何上走了一个单位长度。

这让很多公式更干净。

曲率定义就是在弧长参数化下最简单。

提示

曲线总能用弧长重新参数化。但书中提醒:曲面一般不能像曲线这样定义全局 canonical arc-length parameterization。这会在后面的曲面参数化中变得重要。

3.1.2 曲率

假设曲线已经用弧长 ss 参数化。

曲率定义为:

κ(s):=x(s)\kappa(s) := \|\mathbf{x}''(s)\|

直观理解:

  • 一阶导数 x(s)\mathbf{x}'(s) 是单位切向量。
  • 二阶导数 x(s)\mathbf{x}''(s) 描述切向量变化得多快。
  • 切向量变化越快,曲线弯得越厉害。

因此曲率衡量曲线偏离直线的程度。

曲率和法向量

弧长参数化下,曲线的二阶导数沿法向方向:

x(s)=κ(s)n(s)\mathbf{x}''(s) = \kappa(s)\mathbf{n}(s)

如果只关心曲率大小:

κ(s)=x(s)|\kappa(s)| = \|\mathbf{x}''(s)\|

如果考虑法向方向约定,那么曲率可以带符号。

法向反向时:

nn\mathbf{n}\mapsto-\mathbf{n}

曲率符号也会改变。

直线的曲率

直线可以写成:

x(s)=p0+st\mathbf{x}(s) = \mathbf{p}_0+s\mathbf{t}

其中 t\mathbf{t} 是单位方向。

一阶导数:

x(s)=t\mathbf{x}'(s)=\mathbf{t}

二阶导数:

x(s)=0\mathbf{x}''(s)=\mathbf{0}

所以:

κ(s)=0\kappa(s)=0

如果一条曲线处处曲率为 0,它就是线段。

圆的曲率

半径为 RR 的圆可以用弧长参数写成:

x(s)=[Rcos(s/R)Rsin(s/R)]\mathbf{x}(s) = \begin{bmatrix} R\cos(s/R)\\ R\sin(s/R) \end{bmatrix}

一阶导数:

x(s)=[sin(s/R)cos(s/R)]\mathbf{x}'(s) = \begin{bmatrix} -\sin(s/R)\\ \cos(s/R) \end{bmatrix}

它的长度为 1。

二阶导数:

x(s)=[1Rcos(s/R)1Rsin(s/R)]\mathbf{x}''(s) = \begin{bmatrix} -\frac{1}{R}\cos(s/R)\\ -\frac{1}{R}\sin(s/R) \end{bmatrix}

曲率大小:

κ=x(s)=1R\kappa = \|\mathbf{x}''(s)\| = \frac{1}{R}

所以:

圆越小,弯得越厉害,曲率越大。
圆越大,越接近直线,曲率越小。

例如:

  • R=1R=1,曲率 κ=1\kappa=1
  • R=2R=2,曲率 κ=0.5\kappa=0.5
  • R=10R=10,曲率 κ=0.1\kappa=0.1

密切圆

曲率还可以通过 osculating circle,也就是密切圆来理解。

密切圆是在某一点处最贴近曲线的圆。

曲率与密切圆半径满足:

κ=1R\kappa=\frac{1}{R}

其中 RR 是密切圆半径。

直观上:

  • 曲线局部很弯:密切圆小,RR 小,κ\kappa 大。
  • 曲线局部很平:密切圆大,RR 大,κ\kappa 小。
  • 直线可以看成半径无限大的圆,κ=0\kappa=0

用三点理解密切圆

书中给出一个构造方式:

取曲线上三个点:

x(u),x(u),x(u+)\mathbf{x}(u^-),\quad \mathbf{x}(u),\quad \mathbf{x}(u^+)

其中:

u<u<u+u^-<u<u^+

这三个点确定一个圆。

当:

uu,u+uu^-\rightarrow u, \qquad u^+\rightarrow u

这个三点圆的极限就是点 x(u)\mathbf{x}(u) 处的密切圆。

这也解释了为什么离散网格上常用局部邻域去估计曲率:连续曲率可以看作局部几何极限,离散曲率则用邻域点近似这个极限。

参数化无关性

曲率和长度是 Euclidean invariants。

这意味着它们在刚体变换下不变:

  • 平移不改变长度和曲率。
  • 旋转不改变长度和曲率。

它们也不应依赖具体参数化。

例如前面两条参数曲线:

x1(u)=(u,u)T\mathbf{x}_1(u)=(u,u)^T

和:

x2(u)=(u2,u2)T\mathbf{x}_2(u)=(u^2,u^2)^T

虽然速度函数不同,但它们描述的是同一条直线段。

因此曲率都为:

κ=0\kappa=0

总长度都为:

L=2L=\sqrt{2}

和后续曲面的关系

曲线这一节是第 3 章的入口。

后面讨论曲面时,会把这些概念推广:

曲线概念曲面对应概念
切向量 x\mathbf{x}'两个偏导 xu,xv\mathbf{x}_u,\mathbf{x}_v
法向量 n\mathbf{n}曲面法向 xu×xv\mathbf{x}_u\times\mathbf{x}_v
弧长 metric第一基本形式
曲率 κ\kappa主曲率、平均曲率、高斯曲率
局部弯曲shape operator / second fundamental form

对于 polygon mesh,后续还要进一步离散化这些概念。

本节记忆点

  • 平面参数曲线写作:
x(u)=(x(u),y(u))T\mathbf{x}(u)=(x(u),y(u))^T
  • 切向量是:
x(u)\mathbf{x}'(u)
  • regular parameterization 要求:
x(u)0\mathbf{x}'(u)\neq0
  • 曲线段长度为:
l(c,d)=cdx(u)dul(c,d)=\int_c^d\|\mathbf{x}'(u)\|\,du
  • 弧长参数为:
s(u)=aux(t)dts(u)=\int_a^u\|\mathbf{x}'(t)\|\,dt
  • 弧长参数化下:
x(s)=1\|\mathbf{x}'(s)\|=1
  • 曲率定义为:
κ(s)=x(s)\kappa(s)=\|\mathbf{x}''(s)\|
  • 半径为 RR 的圆曲率为:
κ=1R\kappa=\frac{1}{R}
  • 曲率也可以理解为密切圆半径的倒数。

后续问题

进入 3.2 时可以重点关注:

  1. 曲线的一个参数如何推广到曲面的两个参数 (u,v)(u,v)
  2. 曲面的 tangent plane 如何由 xu,xv\mathbf{x}_u,\mathbf{x}_v 张成?
  3. 曲面的 metric 如何由第一基本形式描述?
  4. 曲线曲率如何推广成曲面的主曲率、平均曲率和高斯曲率?