CS468_note
CS468: Differential Geometry for Computer Science
暑假开始看的,想了想还是要认真做一下笔记,顺便把问题解答也写一下,让知识得到梳理,不然过一个月就会忘记。
这门课本身是理论与实践相互结合的,两位老师轮流从数学理论和计算机领域研究两个方向去进行微分几何内容的讲解 数学理论部分主要是摘录课堂笔记,有些可能还要依赖国内教材上的讲解进行补充;计算机编程的内容主要是以论文的介绍展开的,这部分内容还配有一些练习,可能要先看完理论再回过头整理编程部分(虽然最近更欠缺的是具体实践)
Overview
- 欧式几何只能处理标准几何元素,出于研究更广泛几何(曲线曲面)的目的,人们开始研究微分几何。
- 但是微分几何也存在一些问题(不同参数化带来的连续性差异/并不连续的尖点处可能有 $C^\infty$ 的性质等)。
- 微分几何中的两个重要概念:高斯曲率(Gaussian curvature)和平均曲率(mean curvature),它们都是完全独立于参数化的。
- 对微分几何(流形,特别是3维空间中的曲面)的研究还有别的内容,比如曲面上的流场和矢量场/特定变化下曲面的不变点/微分几何中的距离(在离散三角网格中可以用Dijkstra算法估计距离)。
- 还可以从黎曼几何的观点出发,只考虑曲面上的角和距离,根据曲率判断两条局部平行的线是否在远处会相交,这样的观点可以用来判断“地图上的两条直线是否在球面上保持相同长度”这样的问题。
- 几何在许多领域都有应用,比如研究双摆问题中小球的运动轨迹,实际上它的所有轨迹构成了一个环面,这件事在物理仿真中非常有用,因为它有效简化了模型。
- 由于离散情况下,获取的原始数据往往是从扫描设备得到的点云数据,组合成三角形网格之后可以用来解决更多的问题,但是需要注意到,网格需要满足一些条件才可以用来近似流形边,包括每条边最多只在两个面上,同一个点引出的所有边应该可以拼成一个闭或开的扇形(fan),上述两点构成了分析曲面的充分条件。
- 如果是无效网格或者一些表现较差的网格还可能出现其它问题,比如有些技术会有对于角度或直线的要求;此外还需要考虑作用在网格上的函数,可能会因为网格质量而导致计算结果的精度受到影响。
- 离散微分几何的初衷就是解决上述的问题,与其将连续的概念直接做离散化,这样做的好处在于保结构性,即能够保持连续曲面上的性质在离散的问题中仍然成立。
- 离散微分几何在众多领域都有广泛应用。
Curve
曲线是曲面的一维版本,相比曲面更容易理解,因此是一个很好的出发点。
定义 参数化可微曲线是一个可微映射 $\gamma: I \rightarrow \mathbb{R}^n$ ,其中 $I = (a, b)\subset \mathbb{R}$ 。 $I$ 被称为参数域,曲线本身也可以称为 $\gamma$ 的图象或轨迹。此外, $\gamma$ 也可以写成分量形式: $\gamma(t) = (\gamma_1(t), \gamma_2(t),\dots, \gamma_n(t))$ 。
我们最关注的是 $n = 3$ 的情况。如果把曲线看作是已知的,那么 $\gamma(t)$ 可以看作曲线上的一个点在 $t$ 时刻的位置,随着 $t$ 的变化,这个点沿着曲线移动。虽然是同一个图象, 根据不同的速度 移动这个点对应了不同的函数 $\gamma(t)$ ,这也就说明了存在不止一种参数化方式来表示这条曲线。
定义 $t$ 时刻对应的点在曲线上的速度是 $V(t) = \frac{\mathrm{d} \gamma}{\mathrm{d} t}$ 。如果 $V(t) = (V_1(t), V_2(t), V_3(t))$ 那么 $V_i(t) = \frac{\mathrm{d} \gamma_i}{\mathrm{d} t}$
定义 $t$ 时刻对应的点在曲线上的加速度是 $A(t) = \frac{\mathrm{d}^2 \gamma}{\mathrm{d} t^2}$
下面考虑一个常速运动的曲线(即 $\gamma$ 的每个分量的导数都是常数),因此 $\gamma$ 关于 $t$ 是线性的:
\[\gamma(t) = \begin{pmatrix} c_1\\c_2\\c_3 \end{pmatrix}t + \begin{pmatrix} d_1\\d_2\\d_3 \end{pmatrix}\]这个曲线很好理解:这就是一条参数化的直线。此时 $|V(t)| = \sqrt{\gamma_1’(t)^2 + \gamma_2’(t)^2 + \gamma_3’(t)^2}$ 为常数。两边开平方后再对 $t$ 求导就会得到
\[\left\|\frac{\mathrm{d}\gamma}{\mathrm{d}t}\right\|^2 = \dot{\gamma}_1^2 +\dot{\gamma}_2^2 + \dot{\gamma}_3^2 \Rightarrow 0 = 2\dot{\gamma}_1\ddot{\gamma}_1 + 2\dot{\gamma}_2\ddot{\gamma}_2 + 2\dot{\gamma}_3\ddot{\gamma}_3\]写成内积的形式则为
\[\langle V(t), A(t)\rangle = 0\]所以,当 曲线的速度为常量时 ,它的速度和加速度是正交的。
接下来讨论参数化的变化。假设 $\gamma: I \rightarrow \mathbb{R}^3$ , $\varphi: I \rightarrow I$是一个光滑的双射。因为 $\varphi$ 是一段区间上的双射,因此它是单调的,因此 $\varphi’$ 是非零的。
通过 $\varphi$ ,我们可以对曲线作重新参数化: $\tilde{\gamma}(s) = \gamma \circ \varphi(s)$ 。这条曲线具有相同的轨迹,但是它的速度可以改变。通过链式法则,可以得到微分几何中的一个重要结论:
\[\frac{\mathrm{d}\tilde{\gamma}}{\mathrm{d} s} = \frac{\mathrm{d}(\gamma\circ\varphi(s))}{\mathrm{d}t}\frac{\mathrm{d}\varphi}{\mathrm{d}s} = V(\varphi(s)) \frac{\mathrm{d}\varphi}{\mathrm{d}s} = V(t)\frac{\mathrm{d}\varphi}{\mathrm{d}s}\]因为 $\varphi$ 并不一定是恒等映射,因此速度可以不同。
能计算曲线的长度非常重要,它也是积分计算的一个重要应用。给定一条光滑曲线 $\gamma: [a, b]\rightarrow \mathbb{R}^3$ 和区间 $I = [a, b]$ ,其中 $I = [t_0, t_1] \cup \dots \cup [t_{n - 1}, t_n], t_0 = a, t_n = b$ 。则弧长可以近似为由相邻的 $\gamma(t_i)$ 和 $\gamma(t_{i + 1})$ 连成的线段长的和,也就是说 $\gamma$ 被近似成了分段线性的曲线。如果用 $l$ 表示 $\gamma$ 的弧长,那么
\[l\approx \sum_{i = 1}^n\|\gamma(t_i) - \gamma(t_{i - 1})\| = \sum_{i = 1}^n\|\dot{\gamma}(t_i^*)\Delta t_i\| = \sum_{i = 1}^n\|\dot{\gamma}(t_i^*)\|\Delta t_i.\]注意这里的 $\dot{\gamma}(t_i^*)$ 是从中值定理取到的。当我们对分割取极限,那么上面的表示即为Riemann和:
\[l = \lim_{n\rightarrow \infty}\sum_{i = 1}^n\|\dot{\gamma}(t_i^*)\|\Delta t_i = \int_{a}^b\|\dot{\gamma}(t)\|\mathrm{d}t.\]弧长是一个几何量(geometrical quantity),它是与参数化无关的。可以按如下方法证明:假设 $\phi:[a, b]\rightarrow [a, b]$ 是满足 $\phi(a) = a, \phi(b) = b$ 的同胚映射,并且记 $\tilde{\gamma}(s) = \gamma(\phi(s))$ , $\gamma$ 和 $\tilde{\gamma}$ 的弧长用 $l$ 和 $\tilde{l}$ 表示。根据链式法则可得:
\[\begin{align*} \tilde{l} &= \int_a^b \left\|\frac{\mathrm{d}(\gamma\circ\phi(s))}{\mathrm{d}s}\right\|\mathrm{d}s\\ &= \int_a^b |\phi'(s)|\left\|\frac{\mathrm{d}\gamma}{\mathrm{d}t}\circ\phi(s)\right\|\mathrm{d}s\\ &= \int_a^b |\phi'\circ\phi^{-1}(t)|\left\|\frac{\mathrm{d}\gamma(t)}{\mathrm{d}t}\right\|\frac{\mathrm{d}t}{|\phi'\circ\phi^{-1}(t)|}\\ &= \int_a^b \left\|\frac{\mathrm{d}\gamma(t)}{\mathrm{d}t}\right\|\mathrm{d}t = l. \end{align*}\]这是本讲的重点之一,由此我们可以借助特定的参数化来计算弧长。此外,微分几何中的很多几何量都具有类似的参数无关性质,因此可以通过不同的参数化进行计算。然而大部分的情况证明这些无关性比较复杂,故之后不会总给出严格证明。
例 假设 $\gamma$ 是一条单位速度参数化的曲线,即满足 $|\dot{\gamma}| = 1$ ,那么弧长 $l = \int_{0}^T|\dot{\gamma}|\mathrm{d}t = T$ ,从直觉上来说这样的曲线应该是一条直线。
更一般地,对于非线性的 $\gamma$ ,总是存在一个参数化使得 $[0, T]$ 区间上曲线的长度刚好是 $T$ 。这对于计算弧长来说是很好的性质,同时它也说明此时的速度与加速度总是正交的。任意的曲线都存在这样的一种参数化(弧长参数化)。
曲线的性质中还包括了曲率,这是一个与曲线加速度相关的一个性质。
定义 测地曲率向量是加速度向量中的正交部分,被速度向量长度的平方正则化(换句话说,它是参数无关的): $\mathbf{k}\gamma = [\ddot{\gamma}]^{\perp}/|\dot{\gamma}|^2$ ,所以测地曲率 $k\gamma = |\mathbf{k}_{\gamma}|$ 。
在弧长参数化的条件下,测地曲率向量即为 $\mathbf{k}_{\gamma} = [\ddot{\gamma}]$ 。然而,在一般情况下,测地曲率向量的计算要通过正交化获得:
\[\mathbf{k}_\gamma = \frac{1}{\|\dot{\gamma}\|^2}\left(\ddot{\gamma} - \frac{\langle\dot{\gamma}, \ddot{\gamma}\rangle\dot{\gamma}}{\|\dot{\gamma}\|^2}\right) = \frac{1}{\|\dot{\gamma}\|}\frac{\mathrm{d}}{\mathrm{d}t}\left(\frac{\dot{\gamma}}{\|\dot{\gamma}\|}\right).\]另一个重要的概念是Frenet标架。不失一般性,我们假设 $\gamma$ 是一条弧长参数化的曲线。
定义 $\gamma$ 上的标架是在曲线的每一点附加的3个彼此正交的单位向量。
Frenet标架有如下要求:
- 第一个向量是单位切向量: $T(s) = \dot{\gamma}(s)$ 。当我们要求曲线是弧长正交化的时候,这个等式不需要进行归一化;
- 在曲率非零的位置,第二个向量是曲线的单位法向量: $N(s) = \dot{T}(s) / |\dot{T}(s)|$ ;
- 最后一个向量被称为曲线的副法向量: $B(s) = T(s) \times N(s)$ 。
注意到我们在上述的定义中不包含曲率为0的情况(即曲线为直线的情况),密切平面指的是 $T(s)$ 和 $N(s)$ 张成的平面。
有一组被称为Frenet公式的等式,它们将曲率与上述向量联系在了一起(通过定义可以直接计算得到)
\[\begin{align*} \dot{T}(s) &= k_{\gamma}(s)N(s)\\ \dot{N}(s) &= -k_{\gamma}(s)T(s) - \tau_{\gamma} (s) B(s)\\ \dot{B}(s) &= \tau_{\gamma}(s)B(s) \end{align*}\]这里我们引入了挠率(torsion): $\tau_{\gamma}(s) = -\langle \dot{N}(s), B(s)\rangle$ 。
局部地,曲率 $k$ 和曲率的导数 $\dot{k}$ 决定了曲线在密切平面内的转向程度。而挠率 $\tau$ 和曲率 $k$ 共同决定了曲线从密切平面抬升到法线方向的程度。因此,曲线的局部行为可以通过曲率和扭率来描述。
在全局上,我们有如下定理:
定理 (曲线基本定理,Fundamental Theorem of Curves) 假设 $k: I \rightarrow \mathbb{R}^+$ 和 $\tau: I \rightarrow \mathbb{R}$ 是微分函数。那么存在曲线 $\gamma : I \rightarrow \mathbb{R}^3$ 是的 $s$ 是弧长, $k(s)$ 是测地曲率, $\tau(s)$ 是挠率,并且满足这些要求的曲线 $\gamma$ 之间只相差一个刚性变换。
这个定理说明曲率 $k$ 和扭率 $\tau$ 完全并唯一地确定了一条曲线的形状和空间中的扭曲方式,但不包括其在空间中的具体位置和方向。任何两条具有相同曲率和扭率函数的曲线都可以看作是同一条曲线的不同位置或朝向的实例。
Discrete Curves
在前面的内容中,有一个被使用但是没有强调过的定理
定理 取 $v(t): \mathbb{R} \rightarrow \mathbb{R}$ 并满足 对任意的 $t$ 都有 $|v(t)| = 1$ ,那么对任意的 $t$ 都有 $\langle v(t), v’(t)\rangle = 0$ 。
离散情况的Frenet标架可以用来理解蛋白质分子结构等离散曲线。我们可以通过如下步骤构建Frenet标架:
- 计算分段线性曲线上的切向量:通过相邻两条边计算得到: \(\mathbf{t}_j = \frac{\mathbf{p}_{j + 1} - \mathbf{p}_j}{\|\mathbf{p}_{j + 1} - \mathbf{p}_j\|}\)
- 之后先计算副法线法向,可以通过相邻的两个切向量做叉积获得: \(\mathbf{b}_j = \mathbf{t}_{j - 1}\times \mathbf{t}_j\)
- 由于法线正交与切向量和副法线,所以可以直接计算得到: \(\mathbf{n}_j = \mathbf{b}_j \times \mathbf{t}_j\)
然后,蛋白质结构中的偏转可以被认为是利用了旋转矩阵:tk,并且导数收敛到曲率。在单位副法线的情况下,可以获得挠率。 这对于检测蛋白质中扭结的 Alpha 螺旋非常有用。 这个矩阵构造在极限内收敛,但令人惊讶的是并不要求曲线是光滑的。
在离散情况中,最显而易见的就是通过分段光滑的近似来表示一套曲线,比如Bezier曲线。在计算机图形学中这样的应用已经足够了,但是在微分几何中,这种近似仍然有它的问题:这样的不连续性不支持积分计算。
一条三次Bezier曲线的弧长表示为 $s = \int_{t_0}^{t_1}\sqrt{\gamma_x’^2+\gamma_y’^2+\gamma_z’^2}\mathrm{d}t$ ,但实际上这样的计算非常困难,有时还不能得到解析解。因此,采取弧长参数化并不是特别适合。这其实也说明了一般情况下解析解往往都是非常复杂麻烦的。
因此,人们开始寻找可以Bezier曲线的替代方案。一个同样便捷的近似是分段线性表示:这样的表示与Bezier曲线一样可以近似曲线,虽然它需要更多的点,所以可能需要更多的计算资源。然而,分段线性近似曲线的曲率非常糟糕:在直线上的曲率是0,在拐点处的曲率则是正无穷。
其他方法还有有限差分,这是用一种将导数离散的办法,它考虑了当 $h\rightarrow 0$ 的时候 $f’(x) \approx (f(x + h) - f(x))/h$ 。但是有一些情况上述的近似并不收敛,对于计算机来说也不能完全将 $h$ 近似到0。所以,寻找在离散情况下仍然能够保持连续的结构自然就成为了进一步研究的目标。有很多很好的模型,但是不存在一个各方面都好用的模型。
对于平面曲线(挠率为0),Gauss映射 $\mathcal{G}$ 满足 $C \rightarrow S^1$ ,它将曲线上每一点处的单位法向量映射到单位圆上具有相同法向的点上。在平面上,还有一个角度公式:给定 $\mathbb{R}^2$中的规范xy轴,然后令 $\theta(s)$ 为单位切线与x轴之间的角度。 然后, $T(s) = (\cos(\theta(s)), \sin(\theta(s)))$ ,并求导数 $T’(s) = \theta’(s)(-\sin(\theta(s)), \cos(\theta(s)))$ 。这可以被认为是有符号的曲率 $\kappa(s) = \theta’(s)$ 和单位法线 $N(s) = (-\sin(\theta(s)), \cos(\theta(s)))$ 。 然后,这可以用来获取诸如Gauss映射的卷绕数之类的东西。转数取决于 $\theta$ ,但这可以通过对曲率进行积分来得到:
定理(转绕数) \(\int\kappa(s)\mathrm{d}s = 2\pi k\)
这是一个关于整条曲线的全局定理。对于离散的情况下,它也有所医杭甬:一个分段线性的近似仍然存在Gauss映射,它可以被用来恢复卷绕数。如果 $\Gamma$ 是曲线的一段,两条线段以角度 $\theta$ 相交,长度为 $l_1$ 和 $l_2$ ,则 $\kappa \approx \theta/(l_1 + l_2)$ ,它可以表示曲率在这段折线上的总变化。更一般地,我们也可以说这段的角度变化 $\theta = \int_{\Gamma}\kappa(s)\mathrm{d}s$ 。
当我们用更多的点来分段线性近似曲线时,局部的曲率数值会变大,因为这个时候线段的长度随着点的添加变短了。然而这个时候曲率的积分是不变的,它仍然等于 $\theta$ 。
定理(离散版本的转绕数) 如果 $\Gamma$ 是一个曲线的分段线性近似,其中每段线段用 $\Gamma_1, \dots, \Gamma_n$ 来表示,那么
\[\int_{\Gamma}\kappa\mathrm{d}s = \sum_{i = 1}^n \int_{\Gamma_i}\kappa(s)\mathrm{d}s = \sum_{i = 1}^n \theta_i = 2\pi k.\]虽然这是一个非常简单的定理,但它与连续情况的定理是完全对应的,这一点非常重要。
对于曲率还有另一种定义,即计算单位法向量长度的缩短有多么快。所以有 $\nabla L = 2N\sin(\theta/2)$ 。这种定义在连续情况下是等价的,但是对于上面离散情况的转绕数定理则不成立,因为 $\sin \theta \ne \theta$ 。而连续情况下 $\sin \theta$ 会收敛到 $\theta$ 。
离散曲率确实在极限时收敛,尽管这需要了解很多条件:曲线类型、收敛类型、样本点的位置等。因此,虽然不同的定义在离散情况下会存在不同的结果,但是当它们收敛到连续情况时结果就相同了。
然而,仅仅观察折线段还不足够,就像离散弹性杆的情况一样。 例如,如果有人扭转然后压缩鞋带,鞋带就会以难以模拟的方式聚集。 例如,这可以应用于头发建模。 这在分段线性情况下不起作用。所以在仅仅将物体看做折线段的基础上,对于扭曲还应该添加其他有效方法。一个改进框架的曲线被用于这种情况:在每个点都包含了两个向量 $\mathbf{m}_1$ 和 $\mathbf{m}_2$ ,它们将曲线扭转时的法向量分解。这些向量被称为 material frame 。为了模拟这些曲线,可以写下一种称为弯曲能(bending energy)的势能:
\[E_{\mathrm{bend}(\Gamma)} = \frac{1}{2}\int_{\Gamma}\alpha\kappa^2\mathrm{d}s.\]可以说,这是一种抵抗曲率的势能形式,其中 $\alpha$ 是某个常数。 在离散情况下,积分可以通过和来近似,并且通常可以以封闭形式计算。 此外,曲率法线 $\kappa \mathbf{n} = \mathbf{t}’$ 可以写为
\[\begin{align*} \kappa\mathbf{n} &= \mathbf{t}' = (\mathbf{t}'\cdot \mathbf{t})\mathbf{t} + (\mathbf{t}'\cdot \mathbf{m}_1)\mathbf{m}_1 + (\mathbf{t}'\cdot \mathbf{m}_2)\mathbf{m}_2\\ &= (\mathbf{t}'\cdot \mathbf{m}_1)\mathbf{m}_1 + (\mathbf{t}'\cdot \mathbf{m}_2)\mathbf{m}_2\\ &= \omega_1 \mathbf{m}_1 + \omega_2\mathbf{m}_2, \end{align*}\]其中的系数 $\omega_1, \omega_2$ 就是如上定义的。上面的计算依赖于 $(\mathbf{t}, \mathbf{m}_1, \mathbf{m}_2)$ 是 $\mathbb{R}^3$ 上的正交系。根据上面的正交系,另有一种被称为扭转能(twisting energy)的势能:
\[E_{\mathrm{twist}(\Gamma)} = \frac{1}{2}\int_{\Gamma}\beta m^2\mathrm{d}s,\]其中 $m = \mathbf{m}_1’ \cdot \mathbf{m}_2 = -\mathbf{m}_1\cdot \mathbf{m}_2’$ 。
下一个问题是标架应该怎么确定? 标准标架是一个容易考虑的选择,但除了 Frenet 标架之外,还有更多具有良好特性的标架。 特别是有一种Bishop标架,可以说是选择最宽松的标架而制成的。 首先在曲线的起点选择标准正交基。 然后,通过求解微分方程给出框架的其余部分:如果 $\Omega = \kappa \mathbf{b}$ (称为达布向量),则 $\mathbf{t}’ = \Omega\times \mathbf{t}, \mathbf{u}’ = \Omega\times \mathbf{u}$ 和 $\mathbf{v}’ = \Omega \times \mathbf{v}$ 求出整个标架 $(\mathbf{t}, \mathbf{u}, \mathbf{v})$ (其中 $\mathbf{t}$ 是切向量)。 那么,就有了 $\mathbf{m}_1 = \mathbf{u}\cos\theta + \mathbf{v}\sin\theta$ 和 $\mathbf{m}_2 = -\mathbf{u}\sin\theta + \mathbf{v}\cos\theta$ ,使得模拟变得非常容易:扭转能可以简单地表示为
\[E_{\mathrm{twist}(\Gamma)} = \frac{1}{2}\int_{\Gamma}\beta (\theta')^2\mathrm{d}s,\]之后我们讨论一种被称为离散Kirchoff绳结的结构,这种结构可以简单地把第 $i$ 个切向量记为 $\mathbf{t}^i = \mathbf{e}^i / |\mathbf{e}^i|$ (其中 $\mathbf{e}^i$ 被记为折线段的第 $i$ 段)。然后,曲率另一种定义 $\kappa_i = 2\tan(\phi_i/2)$ ,其中 $\phi_i$ 是 $\mathbf{e}^i$ 和 $\mathbf{e}^{i + 1}$ 之间的角度。 经过代数运算化简后,有
\[(\kappa\mathbf{b})_i = \frac{2\mathbf{e}^{i - 1}\times \mathbf{e}^i}{\|\mathbf{e}^{i - 1}\|\|\mathbf{e}^i\| + \mathbf{e}^{i - 1}\cdot\mathbf{e}^i}.\]最后,弯曲能可以被近似为
\[E_{\mathrm{bend}(\Gamma)} = \frac{\alpha}{2}\sum_i\left(\frac{(\kappa\mathbf{b})_i}{l_i/2}\right)^2\frac{l_i}{2}\approx \alpha\sum_i\frac{\|(\kappa\mathbf{b})_i\|^2}{l_i},\]它也可以转化为逐点形式的积分。
最后,可以谈谈平行移动。 这实际上在离散情况下比在连续情况下更容易理解。 目标是找到一个正交算子 $P$,使得 $P(\mathbf{t}^{i - 1}) = \mathbf{t}^i$ 保持副法线和正交性: $P(\mathbf{t}^{i - 1} \times \mathbf{t}^i) = \mathbf{t}^{i - 1} \times \mathbf{t}^i$ 。 这足以完全指定确定正交算子; 因此, $\mathbf{u}^{i} = P(\mathbf{u}^{i - 1})$ 和 $\mathbf{v}’ = \mathbf{t}^{i} \times \mathbf{u}^i$ 。 那么,material frame可以通过上面给出的公式明确计算出来,并且扭转能就是
\[E_{\mathrm{twist}(\Gamma)} = \beta\sum_i\frac{(\theta^i - \theta^{i - 1})^2}{l_i},\]其中 $\theta^0$ 可以是任意的。 这允许对物理过程进行一些合理的模拟,几乎是实时的。
总结离散曲线的要点如下:一条离散(分段线性)曲线,主要有三种获得曲率的方法:角度 $\theta$ 、弧长的梯度 $2\sin(\theta/2)$ 和平行移动公式 $2\tan(\theta/2)$。 在极限的情况下,它们是一致的,但在离散的情况下要根据情况选择合适的近似方式。 此外,经典微分几何中最好的结构(例如 Frenet 标架)虽然在理论上更容易应用,但实际上很难应用,这里有大部分困难集中在如何给出合适的坐标系和自由度。
Surface I
对研究曲面之前,首先需要给出切空间的定义。我们首先将范围限定在欧式空间中,记 $T_p\mathbb{R}^n$ 为 $p$ 点在 $\mathbb{R}^n$ 中的切平面。我们引入一个新的坐标系,所有从 $p$ 点出发的向量都包含在其中。坐标系可以是标准坐标系,也可以是像之前的Frenet标架或者Bishop标架这样移动的标架。
切向量(即切空间的元素) $X_p\in T_p\mathbb{R}^3$ 的标准构造如下:存在一条曲线 $c: I \rightarrow \mathbb{R}^n$ 使得 $c(0) = p$ 和 $\dot{c}(0) = X_p$ 。 因此可以说 $X_p = \frac{\mathrm{d}c}{\mathrm{d}t} | _{t=0}$,其中 $c:[-\varepsilon, \varepsilon]\rightarrow \mathbb{R}^3$ 是任意满足 $c(0) = p$ 的曲线。 这条曲线不是唯一的; 示例包括直线 $c(t) = tX_p + p$ ,但是可以以某种方式弯曲它,但与 $p$ 的距离为正,以获得其他曲线。 |
有关切空间的一个重要想法是所有向量的出发点从原点移至 $p$ 。 因此,尽管切空间基本上与 $\mathbb{R}^3$ 相同,但向量是源自 $p$ 而不是 $0$ 意味着它们与源自原点的向量无关,并且在没有说明的情况下这些向量不能彼此相加。
$\mathbb{R}^3$ 中所有切空间的并集称为切丛: $T\mathbb{R}^3 = {T_p\mathbb{R}^3 | p \in \mathbb{R}^3}$ 。 它包含六个维度:三个维度用来选择 $p$ ,在每个 $T_p\mathbb{R}^3$ 内还有三个维度。 |
定义 假设 $f:\mathbb{R}^n \rightarrow \mathbb{R}^m$ 是可微映射。记 $\mathbb{R}^n$ 的分量分别是 $(x^1, \dots, x^n)$ ,并且 $f$ 在每个分量上的函数分别是 $f^1, \dots, f^m$ ,所以 $f$ 可以写成 $f(x^1, \dots, x^n) = (f^1(x^1, \dots, x^n), \dots, f^m(x^1, \dots, x^n))$ 。这样就包含了 $mn$ 个偏导数,将它们写成矩阵的形式: \(Df_p = \begin{pmatrix} \frac{\partial f^1}{\partial x^1}(p) & \cdots & \frac{\partial f^1}{\partial x^n}(p) \\ \vdots & \ddots & \vdots \\ \frac{\partial f^m}{\partial x^1}(p) & \cdots & \frac{\partial f^m}{\partial x^n}(p) \end{pmatrix}\in \mathbb{R}^{m \times n}.\)
这是一个从 $T_p\mathbb{R}^n$ 到 $T_{f(p)}\mathbb{R}^m$ 的线性变换: $f$ 将 $p$ 映射到$f(p)$ ,之后微分算子将 $p$ 点在 $\mathbb{R}^n$ 中的切空间映射到 $f(p)$ 在 $\mathbb{R}^m$ 上的切空间。这可以用切空间中向量的曲线表示来理解:设 $c: [-\varepsilon, \varepsilon] \rightarrow \mathbb{R}^n$ 满足 $c(0) = p$ 和在标准基下 $\frac{\mathrm{d}c}{\mathrm{d}t}(0) = X_p = (a_1, \dots, a_n)$ 。 那么, $f$ 可以作用于点 $p$ 上,也可以作用于整条曲线 $c$ 上,得到曲线 $f(c(t))$ ,或者写成复合的形式 $f\circ c(t)$,即一条从 $[-\varepsilon, \varepsilon]$ 映射到 $\mathbb{R}^m$ 的曲线。 那么, $f(p)$ 处的切向量为 $\frac{\mathrm{d}}{\mathrm{d}t}(f\circ c(t))|{t = 0}\in T{f(p)}\mathbb{R}^m$ 。通过链式法则,我们可以将这个切向量与 $X_p$ 关联起来: \(\begin{align*} \frac{\mathrm{d}}{\mathrm{d}t}(f\circ c(t))|_{t = 0}&=\frac{\mathrm{d}}{\mathrm{d}t} \begin{pmatrix} f^1(c(t))\\ \vdots\\ f^m(c(t)) \end{pmatrix} = \begin{pmatrix} \frac{\mathrm{d}}{\mathrm{d}t}f^1(c(t))|_{t = 0}\\ \vdots\\ \frac{\mathrm{d}}{\mathrm{d}t}f^m(c(t))|_{t = 0} \end{pmatrix} = \begin{pmatrix} \sum_{i = 1}^n \frac{\partial f^1}{\partial x^i}(c(t))\frac{\mathrm{d}c^i}{\mathrm{d}t}(t)|_{t = 0}\\ \vdots\\ \sum_{i = 1}^n \frac{\partial f^m}{\partial x^i}(c(t))\frac{\mathrm{d}c^i}{\mathrm{d}t}(t)|_{t = 0} \end{pmatrix} \\ &=\begin{pmatrix} \sum_{i = 1}^n \frac{\partial f^1}{\partial x^i}(p)a_i\\ \vdots\\ \sum_{i = 1}^n \frac{\partial f^m}{\partial x^i}(p)a_i \end{pmatrix} = \begin{pmatrix} \frac{\partial f^1}{\partial x^1}(p) & \cdots & \frac{\partial f^1}{\partial x^n}(p) \\ \vdots & \ddots & \vdots \\ \frac{\partial f^m}{\partial x^1}(p) & \cdots & \frac{\partial f^m}{\partial x^n}(p) \end{pmatrix} \begin{pmatrix} a_1\\ \vdots\\ a_n \end{pmatrix} = Df_p\cdot X_p. \end{align*}\)
计算过程中频繁用到了矩阵乘法的性质。
微分说明了很多关于函数 $f$ 的信息。 在微分几何中,微分的映射性质很重要:是单射还是满射,什么是核、像、特征值等等,所有这些都说明了关于 $f$ 的事情。 例如,微分具有矩阵形式的秩(即像的维度)。
定义 设开集 $\Omega\subset\mathbb{R}^n$ ,如果对于所有 $p\in \Omega$ 有 $\mathrm{rank}(Df_p) = K$ ,就说函数 $f$ 在 $\Omega$ 上具有局部常数秩 $K$ 。
根据上面的定义,我们可以得到以下结论,它们说明了当给定 $f$ 在局部的秩时, $Df_p$ 是如何影响 $p$ 附近的 $f$ 的。
定理 (The Rank Theorem) 设 $f:\mathbb{R}^n\rightarrow\mathbb{R}^m$ 在 $\Omega \subset\mathbb{R}^n$ 上有局部常数秩,那么,存在 $\mathbb{R}^n$ 上的坐标变换 $\varphi$ 和 $\mathbb{R}^m$ 上的坐标变换 $\psi$ 引出满足如下性质的新映射 $\tilde{f} = \psi\circ f\circ \varphi^{-1}$ (即新的坐标系来表示 $f$ ):
- 如果在 $\Omega$ 上 $Df_p$ 是单射,那么 $n \le m$ 并且 $\mathrm{Ker}(Df_p) = {\mathbf{0}}$ 。所以 $\tilde{f}(x^1, \dots, x^n) = (x^1, \dots, x^n, 0, \dots, 0)$ 。
- 如果在 $\Omega$ 上 $Df_p$ 是满射,那么 $n \ge m$ 并且 $\tilde{f}(x^1, \dots, x^m, x^{m + 1}, \dots, x^n) = (x^1, \dots, x^m)$ ,即 $\tilde{f}$ 是一个投影。
- 如果在 $\Omega$ 上 $Df_p$ 是双射,那么 $n = m$ 并且 $\tilde{f}(x^1, \dots, x^n) = (x^1, \dots, x^n)$ ,因为 $\varphi$ 和 $\psi$ 可逆,所以 $f$ 和 $\tilde{f}$ 也是可逆的。
- 如果在 $\Omega$ 上 $Df_p$ 的秩是 $k$ (此时既不是单射也不是满射),那么 $k\le \min(m, n)$ 并且 $\tilde{f}(x^1, \dots, x^n) = (x^1, \dots, x^k, 0, \dots, 0)$ 。
这是一个矫正定理。 坐标变化背后的直觉是,可以通过标准极坐标变换将诸如 $x^2 + y^2 = c$ 的曲线变为诸如 $r^2 = c$ 的曲线。 该定理总体上保证了类似的结果。 然而,这些是取决于 $\Omega$ 的局部坐标变换。情况1的一个例子是曲线:因为是从直线映射到曲线,但采取适当的坐标变换后,又可以做到从直线映射到直线。
整个定理可以概括为:如果 $Df_p$ 具有恒定的秩,则 $f$ 的行为类似于 $p$ 附近的 $Df_p$ 。 严格来说,证明这一点依赖于多元分析的两个关键定理:
定理 (反函数定理)如果 $f:\mathbb{R}^n\rightarrow\mathbb{R}^n$ 是光滑映射并且对于 $p\in \mathbb{R}^n$ 满足 $Df_p$ 是双射,那么存在 $p$ 的一个邻域,在该邻域上 $f$ 可逆。
检查 $Df_p$ 是不是双射很简单,因为 $Df_p$ 是双射等价于 $\det(Df_p)\ne 0$ 。
定理 (隐函数定理)假设 $F: \mathbb{R}^k\times \mathbb{R}^n\rightarrow \mathbb{R}^n$ 是光滑函数, $D_2F_{(p, q)}$ 是双射,并且 $F(p, q) = 0$ ,则方程 $F(x, y) = 0$ 可以由 $(p, q)$ 附近的点 $(x, y)$ 解出,因为在 $q$ 附近存在定义的 $g: \mathbb{R}^k\rightarrow \mathbb{R}^n$,使得 $q = g(p)$ 和 $F(x, g(x)) = 0$ 成立。
这可以被认为是求解 $n+k$ 个未知数中的 $n$ 个方程组:将有 $k$ 个自由变量,其余变量之间的依赖关系将由 $(x, g(x))$ 给出。 上述定理中,$D_2F$ 是 $n\times n$ 的Jacobi矩阵。
例 假设 $n = 1, k = 2$ ,并且 $F(x, y, z) = x^2 + y^2 + z^2 - 1$ 。那么,对 $(x, y, z)\in \mathbb{S}^2$ 满足 $F(x, y, z) = 0$ ,所以 $\mathbb{S}^2$ 是满足方程解的集。求解 $z$ ,则得到 $z = \pm\sqrt{1 - x^2 - y^2}$ 。在 $(0, 0, 1)$ 附近, $z$ 取得正值,则解为 $g(x, y) = \sqrt{1 - x^2 - y^2}$ ,从而得到坐标 $(x, y, \sqrt{1 - x^2 - y^2})$ 。
引入隐函数定理,计算 $D_2F = \frac{\partial F}{\partial z} = 2z$ ,因此方程可以在给定 $z\ne 0$ 的情况下局部求解。 这是合理的,因为 $z = 0$ 正是上面函数 $g$ 不能成立的情况:此时导数的定义很糟糕,并且球体有垂直切线,得到的 $g$ 也有两个可能的表示;在其他位置就不会发生这些问题。
特别地,对于 $\mathbb{R}^3$ ,曲面有三种非常常用的表示方法,它们在讲义中会被重复提到:
- 函数的图像 $f: \mathbb{R}^2 \rightarrow \mathbb{R}$ 。这种表示有一个很重要的限制,就是并不是每个曲面都是一个图像,比如球面。
- 水平集函数 $F: \mathbb{R}^3 \rightarrow \mathbb{R}$ 。利用隐函数定理,可以将一个函数的水平集与另一个函数的图联系起来:$F(x, y, z) = 0$ 的解空间是二维的,因此它是一个曲面。
- 参数曲面 $\sigma: U\rightarrow \mathbb{R}^3$ ,其中 $U$ 是 $\mathbb{R}^2$ 上的开集, $\sigma(u^1, u^2) = (\sigma^1(u^1, u^2), \sigma^2(u^1, u^2), \sigma^3(u^1, u^2))$ 。它常用来和水平集一块儿使用,因为 $F(\sigma(u))$ 是常数。这些曲面是曲线的推广,以 $\mathbb{R}^2$ 而不是 $\mathbb{R}$ 作为参数域。这要求 $D\sigma_p$ 对所有 $p\in U$ 都是单射的。
极(球)坐标中的球体是参数曲面的一个很好的例子:如果 $\theta$ 是点与垂直方向的角度,$\varphi$ 是经度,则球体由 $\sigma(\theta, \varphi) = (\cos\varphi\sin\theta, \sin\varphi\sin\theta, \cos\theta)$ 参数化。 这里,参数域 $U = [0, \pi)\times[0, 2\pi)$ (因为不是闭的,所以保证了在参数域上是单射)。
Surface II
常用的定义曲面的方法有两种。关键想法在于是图像、水平集和参数化都不能表示全部曲面:并非所有曲面都有图像;找到一般曲面的水平集函数通常也很困难:它是方程组的一组解,本身的计算会很困难,就算可以计算,它提供的也是一个庞大的曲面系的完备表示;对于参数化,每次只能是对曲面的一些局部进行参数化,之后还要处理局部坐标的重叠问题。上述的方法还有一个严重的问题,就是它们的表示都不唯一,这既是理论问题,也是实际的问题,所以引出了如下解决方案:
定义 记集合 $S\subset \mathbb{R}^3$ 。如果对 $p\in S$ ,存在 $p$ 的开邻域 $V\subseteq\mathbb{R}^3$ 和一个开集 $U\subseteq\mathbb{R}^2$ ,存在定义其上的参数化 $\sigma: U\rightarrow V\cap S$ 并满足如下三条,则称 $S$ 是一个正则曲面:
- $\sigma = (\sigma^1, \sigma^2, \sigma^3)$ ,并且每个 $\sigma^i$ 都是可微的;
- 当限制 $\sigma$ 是从 $U$ 到 $V\cap S$ 的映射时,它是可逆的并且具有连续逆;
- 对所有 $q$ , $D\sigma_q$ 都是单射(即 $\det((D\sigma_q)^\mathrm{T}D\sigma_q) \ne 0$ ),因此 $\sigma$ 可以保持线性无关。
正则曲面可以与正则曲线(即切向量始终非零)进行类比,几何直觉是总存在 $\sigma$ 可以将参数域映射到曲面的一部分。
例 在这种定义下,图也是曲面。如果 $f: \mathbb{R}^2\rightarrow \mathbb{R}$ ,就可以得到曲面 $S = {(x, y, f(x, y)) | x, y \in \mathbb{R}}$ 。但是在这个过程中仍然要注意不能存在垂直的切线。 |
图形表达的标准形式(即上面 $S$ 的定义)可以给出 $\sigma(x, y) = (x, y, f(x, y))$ 。 这满足所有要求,因此图实际上是曲面。这里详细说一下第三个条件:
\[\begin{align*} D\sigma_{(x, y)} &= \begin{pmatrix} \frac{\partial \sigma^1}{\partial x}& \frac{\partial \sigma^1}{\partial y}\\ \frac{\partial \sigma^2}{\partial x}& \frac{\partial \sigma^2}{\partial y}\\ \frac{\partial \sigma^3}{\partial x}& \frac{\partial \sigma^3}{\partial y} \end{pmatrix} = \begin{pmatrix} 1& 0\\ 0& 1\\ \frac{\partial f}{\partial x}& \frac{\partial f}{\partial y} \end{pmatrix}\\ D\sigma^\mathrm{T}D\sigma&= \begin{pmatrix} 1& 0 & \frac{\partial f}{\partial x} \\ 0& 1 & \frac{\partial f}{\partial y} \end{pmatrix} \begin{pmatrix} 1& 0\\ 0& 1\\ \frac{\partial f}{\partial x}& \frac{\partial f}{\partial y} \end{pmatrix} = \begin{pmatrix} 1 + \left(\frac{\partial f}{\partial x}\right)^2 & \frac{\partial f}{\partial x}\frac{\partial f}{\partial y}\\ \frac{\partial f}{\partial x}\frac{\partial f}{\partial y} & 1 + \left(\frac{\partial f}{\partial y}\right)^2 \end{pmatrix} \end{align*}\]由于 $D\sigma^\mathrm{T}D\sigma$ 的行列式等于 $1 + \left(\frac{\partial f}{\partial x}\right)^2 + \left(\frac{\partial f}{\partial y}\right)^2 > 0$ 。此外,还应该注意这样将图表示为曲面的时候, $f$ 应当是光滑函数(否则根本不能对 $x, y$ 求偏导),所以非光滑函数在曲面上应当会存在奇异点(比如圆锥的顶点)。
如果已经有了一个球面 $S$ ,那么曲面中的曲线 $\gamma: I \rightarrow \mathbb{R}^3$ 始终在曲面上: $\gamma(t)\in S$ (对于所有 $t\in I$ )。 因此可以看作 $\gamma(t) = \sigma(\gamma_0(t))$ ,这样的 $\gamma_0$ 总是可以在局部被定义。 例如,如果 $\gamma(t) = (t, t, \sqrt{1 - 2t^2})$ 在单位球面上,则 $\gamma_0(t) = (t, t)$ 。
还有坐标曲线的概念:如果 $U$ 具有局部坐标 $u^1$ 和 $u^2$ ,则存在与 $u^1$ 或 $u^2$ 平行的曲线:对于某个常数 $k$ ,$\gamma = (t, k)$ 或 $\gamma = (k, t)$ 。 这些曲线映射到曲面上的相同曲线网络中。 这意味着我们可以直观地表示 $D\sigma$ 的单射性:指向 $u^1$ 和 $u^2$ 的两个坐标以及它们生成的网格被映射到线性独立向量,并且网格不会坍缩。
因此,我们可以将曲线 $\gamma_0: I \rightarrow U$ 的切向量 $\dot{\gamma}_0(u)$ 推到曲面上作为 $\sigma \circ \gamma_0$ 的切向量 $v$ ,并满足 $v = D\sigma_u\cdot \dot{\gamma}_0(u)$ 。注意,此时 $v$ 与曲面相切。
定义 令 $\sigma: U \subset \mathbb{R}^2 \rightarrow V\cap S\subset \mathbb{R}^3$ 是曲面 $S$ 上一个子集的参数化,并选择 $p\in S$ 使得对某些 $u\in U$ 满足 $p = \sigma(u)$ 。那么,切空间就被定义为 $T_pS = \mathrm{Im}(D\sigma_u)\subset T_{\sigma(u)}\mathbb{R}^3$ 。
这个定义意味着切平面是参数域中所有可能通过 $p$ 的曲线的切向量前推获得的。
这说明了微分几何的一个更普遍的原理:必须通过一些参数化来建立概念,但随后可以证明它与参数无关。 该证明的总体思路是,如果 $\sigma: U\rightarrow \mathbb{R}^3$ 和 $\tau: U’ \rightarrow \mathbb{R}^3$ 是曲面同一部分的两个不同参数化, $\sigma\circ \tau^{-1}: U’\rightarrow U$ 是光滑双射。 那么 $\mathrm{Im}(D\sigma_u) = \mathrm{Im}(D(\sigma\circ\tau^{-1}\circ\tau)_u) = \mathrm{Im}(D\tau_u)$ ,因为微分可以通过链式法则分开,并且乘以可逆矩阵不会改变矩阵的列空间。
因此,切线空间是一个几何对象,但切空间的基并不依赖于参数化。不过,当给定参数化 $\sigma:U\rightarrow \mathbb{R}^3$ ,我们可以通过计算 $v_1 = D\sigma_u\begin{pmatrix} 1\0 \end{pmatrix} = \frac{\partial \sigma}{\partial u^1}$ 和 $v_2 = D\sigma_u\begin{pmatrix} 0\1 \end{pmatrix} = \frac{\partial \sigma}{\partial u^2}$ ,因此 $(v1, v2)$ 是两个微分的量(可以用来组成切平面的基)。
Discrete Surface
本节的基本假设是所有的曲面都是流形网格:每条边在至少1个至多2个面上,并且共用交点的面一定是都有共边的(也就是不会出现两个面只存在一个共用顶点,像是领结型的结构)。这样的假设是很多离散曲面算法的基础,是一个非常强的假设,现实情况中并不总能满足。
中值定理和泰勒定理保证了对曲面的线性近似就很好:误差是二次的,而且曲面上存在和近似结果切线相同的点。 三角形网格还有其他优点:它们易于渲染,并且可以形成许多不同的拓扑(例如具有 $n$ 面的球体)。 最后,三角网格支持细分和优化,使得工作更容易。 因此,通过三角网格可以编码曲面的几何形状和拓扑结构。
三角网格的几何相对来说很清晰:顶点在哪里?从拓扑的角度来说,往往需要描述曲面上有多少洞,两个顶点是否连通等等。比起基本的几何性质,这些拓扑性质是更高一层的性质。
一般地,一个三角网格由一个点集 $V = {v_1, \dots, v_n}\subset \mathbb{R}^n$ ,一个边集 $E = {e_1, \dots, e_n}\subset V\times V$ 和一个面集 $F = {f_1, \dots, f_n}\subset V\times V \times V$ 组成,点、边和面都相邻并且满足上面的流形条件。这个定义可以被推广到更高维度(如单纯复形,即四面体的一般说法)。
定义 三角网格中顶点的价或者度指的是从该点引出的边的数量。
定义 有 $V$ 个顶点、 $E$ 个边、 $F$ 个面的曲面的欧拉示性数 $\chi = V - E + F$ 。
如果一个曲面中包含 $g$ 个洞,那么示性数 $\chi = 2 - 2g$ 。
根据上述定义,(不考虑边界情况)每条边与两个面相邻,每个面包含三条边,所以 $2E = 3F$ ,代入后得到示性数 $\chi = V - F / 2$ 。此外,如果一个曲面含有很少的洞或者没有洞(在具体应用中这样的假设是合理的),那么 $\chi$ 的绝对值很小,故 $V - F/ 2$ 接近 $0$ ,故 $F\approx 2V$ 。当然,这样的数量关系是存在很多反例的,不过在通常情况下, $E\approx 3V, F \approx 2V$ ,所以每个顶点的平均度数是 $6$ :虽然顶点个数是边的3倍,但当我们计算度数时,每条边实际上被计算了两遍。
另一个三角网格的重要概念是定向。熟悉的不具有定向的曲面有莫比乌斯环。不定向的曲面也符合曲面的定义,但是一些算法或者定义是基于曲面有定向这个前提提出的。因为直接给出三角网格的连续性并不容易,所以我们避免这点给出定向的定义:每个三角面片都有一个定向(顺时针或逆时针),如果对每一条边,共用它的两个面在其上的方向都是相反的,那么我们就成这样的三角网格是定向的。定向的定义是与连续性有关的,因为利用叉积的右手定则,我们可以获得每个面片的法向矢量,尽管并不严格,但这样的定义给出了一个类似“连续”的法向矢量场。在不加说明的情况下,本节提到的曲面都是定向曲面,涉及到的算法都有要求曲面是定向的。