forked from Lancelot899/discrete_differential_geometry
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit ca5dd0e
Showing
56 changed files
with
460 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
# 离散微分几何 | ||
|
||
本书为英文教材[DISC RETE DIFFERENTIALG EOMETRY: AN APPLIED I NTRODUCTION](http://www.cs.cmu.edu/~kmcrane/Projects/DDG/paper.pdf)翻译版,不用做任何商业应用。请勿打印成册后贩卖,如被发现,本人有权追究其法律责任。 | ||
|
||
本书翻译没有翻译原文习题部分,对习题有兴趣的朋友可以自行参看原教材。 | ||
|
||
课程首页:https://brickisland.net/DDGSpring2021/ | ||
|
||
作者:Keenan Crane([Keenan Crane (cmu.edu)](https://www.cs.cmu.edu/~kmcrane/)) | ||
|
||
译者: | ||
|
||
* 范帝楷([email protected]) | ||
|
||
校对: | ||
|
||
|
||
|
||
[正文请点击这里](./src/index.md) |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
|
||
|
||
# 引言 | ||
|
||
![](../../image/ch1/1.1.png) | ||
|
||
这本书专注于三维中的几何处理,也为传统微分几何提供第一门课程。我们的目的在于通过计算的角度和数学的角度,来为大家展示一些基本的几何概念(例如曲率)。这种双重视角能相互丰富两个不同学科对这个问题的理解,并提供为现实世界中几何数据的处理提供切实可行的计算方法。在此过程中,我们将重新审视微积分和线性代数中的重要思想,重点强调直观的视觉理解,以补充更传统的数学课堂上的知识内容。本教程包含基本的数学背景知识以及大量的实际案例和应用。除此之外,还简要介绍了数字几何处理于离散微分几何的最新进展。**话题包括**:曲线曲面、曲率、联络、外代数、外微积分、斯托克斯理论、单纯同调、de Rham上同调、Helmholtz-Hodge分解定理、共形映射、有限元方法和数值线性代数。**应用包括**:曲率的近似、曲线和曲面的平滑、曲面参数化、向量场设计以及测地距离的计算。 | ||
|
||
|
||
|
||
这本书的一个主要目的是为处理真实世界的几何问题提供入门教程,它这套方法主要是用外微积分语言。外微积分是一个简单灵活而且十分有效的框架,它为几何处理提供了同一平台。这本书提供了基本的数学知识和大量的时间里,强调应用和实现。尽管大量核心概念在需要的时候还得反复查阅,但任何接触过线性代数和向量微积分的人应该都可以找到相关资源。习题主要基于C++,但不需要使用太深的编程知识,类似于继承、模版这些。这本书也提供指导性的书面练习,主要是为了加深对相关资源上的概念的理解。 | ||
|
||
|
||
|
||
有很多其他可以选择的方式来描述网格处理算法,为什么我们使用外微分?原因在于:外微积分和微分形式在很大程度上是微分几何和数学物理的现代语言。通过学习这门语言,我们可以利用大量现有知识来开发新算法,并根据成熟的理论更好地理解当前算法。它还允许我们在一个统一的框架中轻松实现许多看似不同的算法。例如,在这些笔记中,我们将看到如何仅通过几行代码来表达大量基本几何处理任务(平滑、参数化、向量场设计等),通常是通过求解一个简单的泊松方程。 | ||
|
||
|
||
|
||
采取这种方法还有另一个不同于“以不同的方式说同样的事情”的很好的理由。我们通常先在光滑曲面上设计算法,然后确保这些基本的结构能在离散后的曲面上使用。作为一个基本的例子,考虑上面那张图的顶点。如果我们把顶角$\theta_i$全部加起来,我们通常会得到一个不同于$2 \pi$的数。对于光滑曲面,这个数正好是$2\pi$——用微分几何的语言说:切平面在任何点都应该包含一整个圈所有的方向。如果我们不断细分三角剖分,使得它越来越接近光滑曲面,这个顶点最终会变平,也就是说我们的角度确实会如预期那样接近$2\pi$。即便如此,我们能在很粗糙的网格上给出一个比较好的代替方案:我们重新定义“角度”的意义,使得它最终返回的结果和预期一致。因此,为了达到这个目的,实际上,我们定义 | ||
|
||
$$ s := \frac{2\pi}{\sum\limits_i\theta_i} $$ | ||
|
||
即所有那个顶点处的顶角和与$2\pi$的比值,并且使用增广角度: | ||
|
||
$$\tilde{\theta}_i := s\theta_i$$ | ||
|
||
换句话说,无论网格有多简单,我们简单归一化通常的欧几里得角度,使得它正好加起来等于$2\pi$: | ||
|
||
$$\sum\limits_i\tilde{\theta}_i = s\sum\limits_{i}\theta_i = 2\pi$$ | ||
|
||
基于这个,我们可以用增广角或“离散”角度$\tilde{\theta}_i$而不是通常意义上的欧几里地角度$\theta_i$来像往常一样执行其余的计算。从概念上讲,我们可以想象每个顶点都被略微平滑了。这个操作有效地将我们的曲面上的曲率推到了原本平坦的三角形中。 虽然这种特殊的约定可能并不总是有用,但在曲面的切线空间结构这个问题中起到至关重要的作用,基于这个方法,引出了一个特别高效的曲面处理算法[请参考KCPS13]。 | ||
|
||
|
||
|
||
这个现象其实是我们这本书中经常遇到的一个问题:没有一个“最正确”的离散化的方式,离散化有很多种不同的方法,不同的方法可能对不同的问题更为适合。因此,人们希望将整个理论离散化,以便所有部分很好地整合到一起。离散外微积分就是一个这样的理论,它可以在同调结构中被使用得无比成功,我们将在第8章讨论这个问题。 | ||
|
||
|
||
|
||
这本书的其他部分安排如下:概述曲面微分几何(第三章)、曲面外微积分极其离散化(第四章)、基本离散曲面的属性(第二张)、法向量(第五章)、离散泊松方程(第六章)。剩下的章节介绍了各种各样的几何处理应用以及这些应用中用到的基本的几何概念(共形结构、上同调、平行移动等)。代码练习可以参考补充材料(一些c++框架): | ||
|
||
https://github.com/dgpdec/course | ||
|
||
它包含了基本的网格结构、线性代数库以及可视化工具——其他类似的框架或者库都适合完成这些练习。书面练习的答案可以通过提交请求获取。 | ||
|
||
|
||
|
||
我们整本书的目标是使用具体的几何图景来描述每个基本的几何概念——我们已经尽可能避免了抽象的代数论证。同样,要充分理解书面练习,应该尝试对问题有个直观的几何理解与论证,然后再填写正式的细节。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# 抽象单纯复形 | ||
|
||
我们如何通过有限数量的信息对曲面进行编码,从而可以区分球面和环面?从现在看是,我们先忘掉形状或者*几何*(大小、厚薄等),专注于*连接关系*:哪片曲面和哪片曲面连起来,怎么连起来的? | ||
|
||
![](../../image/ch2/ch2.1.png)图1: 抽象单纯复形指定顶点如何连接,但不指定它们在空间中的位置。 例如,上面的两个图形都表示同一个单纯复形,由六个顶点、十个边、五个三角形和一个四面体组成。 | ||
|
||
|
||
|
||
有许多不同的方式来描述离散表面的连通性; 一种方法是使用单纯复形——实际上它可以编码比表面更复杂的对象。 基本思想是从顶点的集合$ \mathbf{V} $开始,我们将这些顶点通过整数进行编码得到集合: | ||
|
||
$$ \mathbf{V} = \set{0, 1, 2, \cdots, n} $$ | ||
|
||
另外,我们需要一些额外的信息描述这些顶点是何如连接的。单纯复形的想法是指定这些顶点的子集,它们“从将顶点连接起来”,称为k单形。数字 $k \in \mathbb{Z}$是一个非负整数,告诉我们这个集合中有个元素:一个抽象的 k-单形是一组 (k + 1) 个不同的顶点,我们称 k 为单纯形的度数。 例如,一个三角形或 2-单形: | ||
|
||
$$ \set{3, 4, 2}$$ | ||
|
||
边是一个1-单形: | ||
|
||
$$ \set{3, 5}$$ | ||
|
||
从几何上,我们可以认为2-单形是一个三角形,1-单形是一条边,正如图1左边化的,而0-单形就是一个独立的点。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# 定向单纯复形 | ||
|
||
![](../../image/ch2/ch2.2.1_1.png) | ||
到目前为止,我们认为顶点的序不重要,因此我们直接使用了*集合*这个术语,比如说单形$\left\{i, j, k\right\}$和单形$\{j,i,k\}$(或$\{k, j, i\}$)是同一个三角形。但实际上很多情况这两者在朝向上是有区别的,因为很多时候朝向给出了我们需要测量或者使用的信息。比如,如图所示,从山脚到山顶的海拔变化与从山顶到山脚的海拔变化相反。 | ||
|
||
|
||
|
||
为了存储朝向这个信息,我们将使用有序元组代替无序的集合。例如对于同一条边上的两个点$i,j\in V$,我们用$(i,j)$和$(j,i)$来代表两个不同的有向二元组。前者表示从$i$指向$j$的有向边,后者表示$j$指向$i$。对于更高维度的单形(三角形,四面体等),这个表示会稍微复杂一点。考虑一个三角形上的三个点$i,j,k \in V$,我们会得到6个不同的三元组:$(i,j,k),(i,k,j),(j,k,i),(j,i,k),(k,i,j),(k,j,i)$。每个三元组表示了一种遍历三角形顶点的方法,这6种方法实际上可以分为两大类:顺时针和逆时针,如图所示: | ||
|
||
![](../../image/ch2/ch2.2.1_2.png) | ||
|
||
也就是说,我们不关心开始的顶点是哪个,只要两个三元组遍历的方向相同,它们俩是同一个等价类。因此,要指定一个有向三角形,我们只给出一个有代表性的三元组索引,而不是挑出一个特定的元组。因此: | ||
|
||
$$ ijk := \left\{(i,j,k),(j,k,i),(k,i,j)\right\}$$ | ||
|
||
$$ ikj := \left\{(i,k,j),(j,i,k),(k,j,i)\right\}$$ | ||
|
||
|
||
|
||
更一般地,对于任意k单形,我们也定义两种顺序的集合:顶点奇排列的集合和定点偶排列的集合。比如对于一条边,我们有$ij = \left\{(i,j)\right\}$和$ji=\left\{(j,i)\right\}$,三角形$ijk$和$jki$如上所述,四面体有$ijkl$和$jikl$两种。(注:它们类似于行列式中逆序数的计算,交换两个排列,则多出一个负号,从而可以通过正负区别这两种类型。)对于0单形,它只有一个点,因此只有一种方向。如果两个有向单形共享顶点,那么我们需要讨论它们的相对方向。例如$ijk$和$jil$有相同的方向(它们都是逆时针),然而$ijk$与$ijl$则方向不同。 | ||
|
||
![](../../image/ch2/ch2.2.1_3.png) | ||
|
||
实际上三角形$\{i,j,k\}$和三角形$\{i,j,l\}$共享边$\{i,j\}$,如果这两个三角形同向,那么它们在各自单形中有向边方向相反。例如$ijk$和$jil$同向,但是$ij$和$ji$反向。更一般地,如果k单形$\sigma_1$和$\sigma_2$共享k-1个顶点,如果它们同向,则必然在它们各自这个中的k-1点表示的k-1单形反向。另外,如果$\sigma'$是单形$\sigma$的恰当便,那么它们的方向是一致的(注:对于三角形$ijk$,围成三角形的边$ij$、$jk$、$ki$是它的恰当面,它们的方向是一致的)。有一个特列是0单形和1单形,例如$ij$表示从$i$指向$j$的有向边,我们约定它的方向和$j$相同,但和$i$相反。 | ||
|
||
|
||
|
||
一个(抽象)定向单纯复形是一个抽象单纯复形,其中每个单纯形都被分配了一个方向。 即,我们从一个最简单的单纯复形开始,为每个单纯形随意选择两个方向之一。虽然我们经常假设如果两个共享k-1单形的k单形方向相同,但抽象定向单形的原始定义并没有这个要求。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
# 单纯复形上的基本运算符:Star, Closure, Link | ||
|
||
在处理单纯复形时,能够快速简洁地访问各种元素和区域会很有帮助(例如一个顶点周围的点、边、面等)。首先,我们考虑单个顶点$i \in V$,对这个顶点进行star运算(和**hodge star**运算不同)表示获取引用了这个顶点的所有单形$\sigma \in K$,记作$St(i)$,如下图所示: | ||
|
||
![](../../image/ch2/ch2.2_1.png) | ||
|
||
从图上可以看出,$St(i)$表示的是$i$的邻域,但是这个邻域实际上不是一个单纯复形,因为它的每个三角形都少了一条“对边”。为了得到一个复形,我们可以考虑计算$St(i)$的闭包,即给出运算$Cl$,记作$Cl(St(i))$表示在复形$\mathcal{K}$中,包含$St(i)$的最小子复形,如图所示: | ||
|
||
![](../../image/ch2/ch2.2_2.png) | ||
|
||
注意到上面两种运算是不存在交换律的,即$St(Cl(i)) \neq Cl(St(i))$,我们给出$St(Cl(i))$定义,首先是对一个点计算它的闭包,实际上还是这个点(包含一个点的最小子复形显然还是点),然后再计算点的闭包的star,实际上复合后得到的运算就是点的star,也就是说$St(Cl(i)) = St(i)$,如下图所示: | ||
|
||
![](../../image/ch2/ch2.2_3.png) | ||
|
||
这两个运算($St(Cl(i)),Cl(St(i))$)的差,给出了定义链:$Lk(i) = Cl(St(i)) \setminus St(Cl(i))$,如图所示: | ||
|
||
![](../../image/ch2/ch2.2_4.png) | ||
|
||
对于一个子集(未必要求复形)$S\subset \mathcal{K}$,上述三个运算更一般的定义如下: | ||
|
||
* $St(S)$定义为$\mathcal{K}$中包含这个子集任意一个部分的所有单形的集合 | ||
* $Cl(S)$定义为$\mathcal{K}$中包含这个子集的最小复形 | ||
* $Link(S) = Cl(St(S)) \setminus St(Cl(S))$ | ||
|
||
|
||
|
||
有一个和上述概念相近的概念,*边界*,一个 k复形$\mathcal{K}'\in \mathcal{K}$的边界$\mathtt{bd}(\mathcal{K}')$是所有单形$\sigma$的集合的闭包,而每一个单纯形$\sigma$恰好是$\mathcal{K}'$的某个单形的适当面(注:如图所示,边界的一条边,正好是某个$\mathcal{K}'$中的三角形的边,或者说正好是某个三角形的恰当面)。这个定义正好捕捉了一个集合的边界,如图所示: | ||
|
||
![](../../image/ch2/ch2.2_5.png) | ||
|
||
有了边界后,*内部*的定义是很自然的:$\mathtt{int}(\mathcal{K}') = \mathcal{K}' \setminus \mathtt{bd}(K)'$,如上图所示。 | ||
|
||
一般来说,这些运算符(star, closure, link, boundary, and interior)提供了一种自然的方式来描述任何维度中的任何类型的单纯复形。 事实上,它们给出了太过普适性的定义,我们关注的简单的组合曲面所需要的操作符远比这些定义简单。后续,我们将介绍一种在*组合曲面*中常用的查询邻域的结构,称为*半边网格*。如果我们不关心一般情况,它在某些方面更容易使用。但要做到这一点,我们首先定义*组合曲面*——为此,我们需要star,closure和link运算符。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
# 单纯曲面 | ||
|
||
正如本节开头所提到的,一般单纯复形比我们研究普通形状(例如:帽子、脸、心、香蕉,这些形状都可以被曲面很好地描述)所需的数学工具更具有普适性。 因此,使用抽象的单纯曲面通常就已经足够日常应用了。 一个抽象单纯曲面是一个单纯 2-复形,其中对每个顶点进行link运算得到的是一个圈,或者等效地。对每个顶点进行star运算得到的是由三角形组成的组合圆盘。 每个顶点都有一个“盘状”邻域这一事实抓住了拓扑曲面的基本思想; 因此,我们说这种单纯复形是流形。 | ||
|
||
|
||
|
||
与一般单纯复形不同,单纯曲面不能有像三个三角形在一个边上相交,或者多个“锥体”的共用一个顶点之类的情况。我们将称此类情况称为非流形: | ||
|
||
![](../../image/ch2/ch2.3_1.png) | ||
|
||
对于Link算符的定义,我们将其拓展,在边界时,Link可以是一条与边界连接的简单路径,而不是一个圈,如图所示: | ||
|
||
![](../../image/ch2/ch2.3_2.png) | ||
|
||
对于任意单纯曲面$\mathcal{K}$ ,其边界 $\mathtt{bd}(\mathcal{K})$ 必然是(零个或多个)闭环的组合。 | ||
|
||
|
||
|
||
*定向单纯曲面*是一个抽象单纯曲面,我们可以在其中为每个三角形分配一致的方向,即,任意两个共享公共边的三角形都具有相同的方向。 我们认为如果单纯曲面的任意两个三角形可以一致定向,那么这个单纯曲面有向曲面。这个定义可行吗?乍一看,这似乎很简单:从一个任意三角形开始,为其指定任意方向,然后“向外生长”,为你遇到的每个三角形指定一个和之前一致的方向。但问题是,在某些时候(如果曲面是不可定向曲面),当曲面绕一圈回来后会发现无法为新给出的方向无法兼容原来三角形的指定方向。 例如考虑这个组合莫比乌斯带: | ||
|
||
![](../../image/ch2/ch2.3_3.png) | ||
|
||
|
||
|
||
这种不可定向曲面在实际生活中往往不存在,尽管它确实值得关注。 | ||
|
||
|
||
|
||
我们对单纯曲面的定义很容易扩展到高维:(组合或抽象的)单纯 n-流形是纯单纯 n-复形,其中对每个顶点的link运算得到的链都是单纯 (n-1) 球。 单纯n球指的是是n维球$ \mathbb{S}^n := \left\{x\in \mathbb{R}^n \mid |x| = 1\right\} $的三角剖分。一个单纯曲面是一个2流形,它上面的任意一个链都是$\mathbb{S}^1$,即一个圈。一个单纯3流形是四面体组成的网格,它上面每一个顶点都被三角形构成的球面包围。 | ||
|
||
|
||
|
||
到目前为止,我们已经讲了很多关于单纯曲面的内容,它们已经足以让我们用以定义半边表,它将是我们以后用于访问单纯曲面各种元素的基本数据结构。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# 邻接矩阵 | ||
|
||
对抽象单纯复形进行表示的一种比较好的方式是使用邻接矩阵,单纯复形的计算使用邻接矩阵特别容易(只需要通过数值线性代数进行矩阵操作即可)。 这些矩阵还与离散微分形式密切相关,这为我们的许多几何算法提供了基础。 | ||
|
||
我们要做的第一件事是为不用类型的的单纯形分配不同的索引。比如我们的单纯复形由顶点$V$,边$E$和三角形$F$组成,我们会给顶点分配$0, \cdots,|V| - 1$的索引,给边分配$0,\cdots,|E|-1$的索引,给面分配$0,\cdots,|F|-1$的索引。我们不关心哪个三角形一定要分配到第几号索引,我们需要的仅仅是一个索引队形一个三角形。比如,如下图所示,一个2复形,我们给所有的点、边和面都分配了索引: | ||
|
||
![](../../image/ch2/2.4_1.png) | ||
|
||
为了描述单形是如何连起来的,我们使用矩阵$A_0$,用于描述了哪些边连接了哪些点;$A_1$用于描述哪些三角形使用了哪些边,以此类推。如何描述呢,是这样的:如果第r条边引用了第c个点,那么我们将$A_0$的第r行第c列元素设置为1,其他设置为0;如果第r个三角形引用了第c条边,那么矩阵$A_1$的第r行第c列设置为1,其他为0,以此类推,$A_k$的列的数量和k单形的数量一样多,行的数量和k+1单形的数量一样多。正常来说,我们的矩阵只有少量元素是1,大量元素是0,而且矩阵维度特别大,因此它实际上是一个超大规模的稀疏矩阵,我们可以用存储稀疏矩阵的所有方式来存储这种矩阵。 | ||
|
||
![](../../image/ch2/2.4_2.png) | ||
|
||
如果我们的复形是定向的,我们需要构建带符号的邻接矩阵,它在记录连接性的同时,还记录了连接方向。和前者不同之处在于如果两个单行方向是一致的,那么矩阵的元素设置为+1,否则设置为-1。 |
Oops, something went wrong.