万花筒里的数学:双曲空间、蜂巢、球堆和分形
⚠ 本文比较长,且包含大量图片和动画。
本文介绍我和哥廷根大学的陈浩老师最近合作完成的一个数学可视化项目:绘制高维双曲空间中的球堆。这个项目非常有意思,可谓“雅俗共赏”,一方面读者不需要具备专门的数学知识,仅通过直观欣赏即可领略数学中的对称之美、分形之美;另一方面它的背后涉及不少硬核的数学,如双曲几何、Coxeter 群、动力系统等,漂亮的图形背后蕴含着更为深刻的内在美,所以我迫不及待地把它写出来分享给大家。我尽量不引入复杂的数学概念和证明,虽然有时候也很难避免做一些推理。
文章的主标题是万花筒,万花筒是我们生活中常见的一种玩具,我想对它大家应该并不陌生,而副标题则涉及四个数学名词双曲空间 (hyperbolic space)、密铺 (tiling)、球堆 (ball packings)、分形 (fractals),这几个概念恐怕对有些同学就比较陌生了。打个比方的话,双曲空间是故事发生的舞台,密铺和球堆是舞台上的两位主演,它们相互合作呈现出分形的效果。
楔子
在佛经《华严经》中有这么一段 1:
忉利天王帝释宫殿,张网覆上,悬网饰殿。彼网皆以宝珠作之,每目悬珠,光明赫赫,照烛明朗。珠玉无量,出算数表。网珠玲玲,各现珠影。一珠之中,现诸珠影。珠珠皆尔,互相影现。无所隐覆,了了分明。相貌朗然,此是一重。各各影现珠中,所现一切珠影,亦现诸珠影像形体,此是二重。各各影现,二重所现珠影之中,亦现一切。所悬珠影,乃至如是。天帝所感,宫殿网珠,如是交映,重重影现,隐映互彰,重重无尽。
这段话倒不难懂,大意如下:
翻译:忉利天的天主 (佛的十个名称之一) 的宫殿上悬挂了一张大网,每个网眼里面装饰了一颗珠子,珠子在明亮的灯烛照耀下闪闪发光。这些珠子的数量数不胜数,任何数字都不能表示它。每一个珠子的表面都清清楚楚映照出其它所有珠子的影像,无一例外 (珠珠皆尔,互相影现。无所隐覆,了了分明)。而这些影像又在其它所有珠子的表面继续成像,如此循环下去,无穷无尽。
这是一个多么富有想象力和壮观的景象!佛教用它来比喻世间事物相即相容重重无尽的性质。不过仔细一想,诶,这段文字描述的不就是一群珠子之间相互反复成像的效果嘛,如果真的有这样的场景,它到底是个什么样子,我们能画出来吗?
没问题!数学上真的有这样的场景!比如下图这样的:

或者这样的:

可以看到在这两幅图中,空间中悬挂了无数大小不一的球,大球挨着小球,小球又挨着更小的球,层层叠加,错落有致,呈现出某种奇异的对称图案。你有没有注意到图中的空洞部分也都是球形?实际上两幅图的原场景中的所有球是填满整个空间的,为了避免视线遮挡我移走了一部分球,这才让我们可以一窥内部的细节。如果我们反过来把移走的球塞回去,同时拿走当前剩下的球,则会看到另一种风格的球堆效果。
这种风格的球堆图案可以有无穷多种,在文章开头给出的项目链接中你还可以看到一些。本文的主要目的就是介绍这些图案背后的数学。粗略地说,它们都来自四维双曲空间 (这是一个“弯曲”的度量空间) 的边界在三维欧氏空间中的投影,其中的每一个球,包括拿走的那些,又各自构成一个三维的双曲空间。
好吧,我们没有人见识过四维空间是什么样子的,更不用说四维的双曲空间了。要理解这种超出人类经验范围之外的事物,最好还是从低维的情形开始分析,累积经验,然后通过类比来了解高维的情形。所以接下来我们的故事先从大家生活中熟悉的万花筒说起。
万花筒是关于镜子的魔术
先来看几张生活中的万花筒图案:
![]() |
![]() |
![]() |
在上面的第一个图中两面平行的墙上各自挂了一面镜子,房间中的人在镜子中反复折返成像,所有虚像排成一列纵队延伸至直线的无穷远方。这个万花筒本质是一维的,因为房间中的一个点和它的所有虚像都排列在一条直线上。
在第二个图中两面镜子呈 135 度夹角,两个镜面围成一个 45 度的锥形区域,这个锥形区域中间的纸片在反复成像下共有 7 个虚像,它们和原像合起来构成了一个正八边形。这个万花筒也是一维的,因为基本区域中的一个点和它的所有虚像都位于一个圆周上。
注意:我们采用这样的约定:镜子之间的夹角定义为它们法向量之间的夹角,这样才能区别镜子的“正反面“。所以虽然上面两个镜子围成一个 45 度的锐角区域,但是它们法向量之间的夹角是钝角 135 度。
第三个图是我们常见的万花筒玩具,它是将三块玻璃围成一个三棱柱 (这是最常见的的镜子组合),一端封住并开一个观察孔,另一端用一个双层的透明塑料封住,塑料夹层里放置了一些彩色的小物件。三块玻璃中间围成的三棱柱区域是基本区域,当转动万花筒时,物件在基本区域内的位置随之变化,从而其虚像也随之变化,就可以观察到动态而绚丽的图案。这个万花筒是二维的,因为基本区域中的一个点的所有虚像构成一个二维平面上的网格的顶点。
把这个过程概括地描述出来,就是:
万花筒的原理:
在空间中摆放几面镜子,每个镜子将空间分为两半,选定一半作为其内部,另一半作为其外部。我们称所有镜子的外部的交为基本区域,并在这个基本区域内放一个原像物体。此原像在镜子中反复成像,一生二,二生三,三生万物,子子孙孙无穷匮也。如果原像与所有虚像始终不发生“重影”的现象 (无所隐覆,了了分明),就会观察到一个具有对称性的万花筒图案。
注意万花筒的一个关键要求是物体的原像和虚像之间不能出现重叠 (后面会给出什么是不重叠的准确定义),这就对镜子的摆放方式提出了限制。比如在只有两面镜子的情形,镜子之间的夹角必须是 \(\pi\) 的有理数倍,否则基本区域中任意一点的虚像会密密麻麻铺满一个圆周 (在圆周上稠密),导致得到的图案杂乱无章。
那么到底哪些镜面组合可以给出万花筒图案呢?答案是:万花筒的结构由其对称性决定,我们只要对万花筒可能的对称性进行分类,就可以构造出对应的万花筒。怎么描述万花筒的对称性呢?这就要用到数学中的群 (group) 的概念。
万花筒的对称群
在一个万花筒中,我们记所有镜子的正半空间围成的区域为 \(\mathcal{D}\),\(\mathcal{D}\) 是开集,叫做万花筒的基本区域。记 \(\overline{\mathcal{D}}\) 为 \(\mathcal{D}\) 的闭包。你可以把 \(\mathcal{D}\) 理解为放置原像的房间,\(\overline{\mathcal{D}}\) 是房间加上了四周镜面所在的墙壁。当原像放置在 \(\mathcal{D}\) 中时,原像不属于任何镜面,所以第一次反射原像关于每个镜子都会产生一个新的虚像;当原像放置在某些墙面的交线上时,即原像属于 \(\overline{\mathcal{D}}\) 但不属于 \(\mathcal{D}\),第一次反射原像在这些镜子中不会产生虚像 (后续的可以)。
设万花筒有 \(n\) 面镜子,关于每个镜子 \(i\) 的反射 \(\rho_i\) 是一个空间中的“等距变换”,它把位于镜子一侧的正/负半空间中的物体映射为另一侧的负/正半空间中与其大小相同的虚像。由于关于同一个镜面的连续两次反射会回到自身,所以 \(\rho_i^2=1\) 是恒等变换。\(n\) 个反射 \(S=\{\rho_i,i=1,\ldots,n\}\) 的所有可能的组合构成一个集合 \(W\),\(W\) 有如下特点:
- 恒等变换 \(1\in W\)。
- 设 \(g,g'\in W\) 是两个变换,则它们的复合 \(gg'\in W\)。
- 设 \(g\in W\),则 \(g\) 的逆变换 \(g^{-1}\in W\)。
\(W\) 叫做万花筒的对称群,\(S\) 中的元素叫做 \(W\) 的生成元。
我们要求在一个万花筒中,基本区域中的原像与其任何虚像都不发生重叠现象,即对任何 \(g\in W, g\ne1\) 都有 \(\mathcal{D}\cap g\mathcal{D}=\emptyset\)。
这是一个很强的约束,可以证明在这个条件下,两个镜子 \(i,j\) 的夹角必须形如 \(\pi-\pi/m\),其中 \(m\ge2\) 是正整数或者 \(\infty\) (\(\infty\) 对应两个镜子平行的情形) 2。由于两个反射的复合 \(\rho_i\rho_j\) 是一个角度为 \(2\pi/m\) 的旋转,旋转轴是镜面 \(i,j\) 的交线,从而 \((\rho_i\rho_j)^m=1\) 是恒等变换。
当 \(m=\infty\) 时,我们认为 \(\rho_i\) 和 \(\rho_j\) 之间没有任何关系。
我们把万花筒具有的这种对称性用一个抽象的群来描述:设 \(S=\{s_1,\ldots,s_n\}\) 是一个符号集合,\(M=(m_{ij})_{1\leq i,j\leq n}\) 是一个元素取值为正整数或者无穷的对称矩阵,其中
- \(M\) 的对角元都是 2。
- \(M\) 的 \((i,j)\) 分量 \(m_{ij}\) 表示对 \(s_i,s_j\in S\) 有 \((s_is_j)^{m_{ij}}=1\) 成立。
由上面两个不难推出 \(m_{ij}=m_{ji}\)。这是因为对任何 \(i\) 有 \(s_i^2=1\),所以 \(s_is_j\) 和 \(s_js_i\) 互为逆元素,而在一个群里 \(g^m=1\) 和 \((g^{-1})^m=1\) 是等价的,所以 \(M\) 确实必须是对称矩阵。
定义 1:我们称 \(W = W(S, M)\) 是由 \(S\) 和 \(M\) 决定的抽象 Coxeter 群。\(n=|S|\) 叫做 \(W\) 的秩 (rank)。
\(s_i\) 对应的就是万花筒中关于镜面 \(i\) 的单反射 \(\rho_i\),这里抽象 Coxeter 群的含义是,我们抛弃了每个 \(\rho_i\) 的具体表现形式,而仅考虑它们之间满足的结构关系。对一个抽象 Coxeter 群 \(W\),可能有不同的万花筒都以 \(W\) 为对称群,这时 \(s_i\) 作为反射 \(\rho_i\) 有不同的实现形式。
定义 2:设 \(W = W(S, M)\) 是一个抽象 Coxeter 群,如果一个万花筒的对称群是 \(W\),我们就称这个万花筒是 \(W\) 的一个实现 (realization)。
你可以简单地把 Coxeter 群的实现理解为“镜子的摆放方法”。不同的摆放方法给出不同的实现。
于是研究万花筒的结构可以归结为研究对应的 Coxeter 群 \(W\) 的结构及其可能的实现。
有一种非常直观的描述 Coxeter 群的方法,是使用一个带标记的有限无向图,叫做 Coxeter-Dynkin 图。图的每一个顶点对应一个反射镜面,顶点之间连线的规则如下:
- 当两个镜面互相垂直时,它们之间没有边相连。
- 当两个镜面夹角恰好是 \(\pi-\pi/3\) 时,它俩用一条无标记的边相连。
- 当两个镜面夹角是 \(\pi-\pi/m\),\(m\in\{4,5,\ldots\}\) 时用一条标记为 \(m\) 的边相连。
- 两个平行的镜面用一条标记为 \(a\) 的边相连,这里 \(a\) 是一个 \(\leq-1\) 的实数。当 \(a=-1\) 时这个记号也写作 \(\infty\)。
这其中第 4 条规则看起来很奇怪,这是采用的所谓 Vinberg 记号,用于区别双曲空间中超平行镜面的夹角,具体本文后面会介绍。
我们下面通过一些例子来熟悉 Coxeter 群以及 Coxeter-Dynkin 图的概念。
欧氏万花筒
顾名思义,欧氏万花筒指的是基本区域及其虚像能够填满一个欧氏空间的万花筒。欧氏万花筒因为有无限多个虚像,所以其对应的 Coxeter 群必然是无限群。
最简单的欧氏万花筒是一维直线 \(\mathbb{R}^1\) 上的万花筒:设两个镜面分别位于直线上 \(x=0\) 和 \(x=1\) 处,法向量方向指向对方,则基本区域的闭包 \(\overline{\mathcal{D}}=[0,1]\) 在反复的反射下会填满整个一维直线:
这个万花筒的对称群是 \(W_{s,t}=\langle s,t\,|\, s^2=t^2=1 \rangle\),其 Coxeter-Dynkin 图为
其中关于 \(x=0\) 的反射是 \(s(x)=-x\),关于 \(x=1\) 的反射是 \(t(x)=2-x\),它俩的复合 \(st(x)=x-2\) 是一个平移。平移变换不是线性变换,这不太好,但数学上可以把它变成高一维空间中的线性变换,即把一维直线放到二维平面 \(\mathbb{R}^2\) 中的超平面 \(y=1\) 上,这时两个线性变换 \(s:(x, y)\to (-x, y)\) 和 \(t:(x,y)\to (x+2y, y)\) 在 \(y=1\) 上的截面给出的正是两个平行镜面对应的万花筒:
这个图虽然看似简单,但是揭示了万花筒构造过程中的一些重要特点:
- 一维的欧氏万花筒是在二维空间中处理的,镜面反射都是线性变换。
- 基本区域 \(\mathcal{D}\) 是一个无限大的锥形区域。
- \(\overline{\mathcal{D}}\) 的虚像填满了整个上半空间 \(y > 0\) 和原点组成的锥形区域 (Tits 锥)。
- 万花筒图案位于截面 \(y=1\) 上。
这些特点务必牢记,因为所有的万花筒的构造都遵循类似的套路。
注:Keenan Crane 有一个非常漂亮的视频 (YouTube 地址),演示了怎样把仿射变换处理为高一维空间中的线性变换:
在前面万花筒玩具中,三个镜面围成一个三棱柱,一个点的所有虚像都位于同一个二维平面内,我们同样可以把这个万花筒放到三维空间 \(\mathbb{R}^3\) 中的超平面 \(z=1\) 上来处理,这时三个镜面反射都是三维空间中的线性变换:
基本区域 \(\mathcal{D}\) 是图中红色的无穷大锥形区域,\(\overline{\mathcal{D}}\) 的虚像填满整个上半空间 \(z>0\) 和原点组成的锥形,万花筒图案位于截面 \(z=1\) 上。
可以证明三棱柱围成的三角形的三个内角必须是 (60, 60, 60),(45, 45, 90) 或者 (30, 60, 90) 三种之一,\(\overline{\mathcal{D}}\) 的虚像才能密铺整个平面,即二维的欧氏万花筒本质上只有三种不同的结构,它们分别对应的是 rank 为 3 的仿射 Coxeter 群 \(\widetilde{A}_2,\widetilde{B}_2,\widetilde{C}_2\),其 Coxeter-Dynkin 图如下:
\(\widetilde{A}_2\) | \(\widetilde{B}_2\) | \(\widetilde{C}_2\) |
其中 \(\widetilde{A}_2\) 的三个镜面两两夹角都是 \(\pi-\pi/3\),而标号 3 都是省略不写的,所以其 Coxeter-Dynkin 图是一个无标记的三角形;\(\widetilde{B}_2\) 的三个镜面两两夹角为 \((3\pi/4, 3\pi/4, \pi/2)\),所以其 Coxeter-Dynkin 图有两个标号为 4 的边,两端的顶点因为互相垂直所以不相连。\(\widetilde{C}_2\) 的图可以同理分析。
当原像在基本区域中间变动时,它们可以给出各种不同的万花筒图案,这些图案密铺了整个二维欧氏平面:
原像在基本区域边上 | 原像在基本区域顶点 |
原像在基本区域内部 | 原像在基本区域内部 |
依此类比,三维的欧氏万花筒自然需要四面镜子来生成,这四面镜子给出四维欧氏空间中的四个线性变换,通过取其在 \(\mathbb{R}^4=\{(x,y,z,w)\,|\, x,y,z,w\in\mathbb{R}\}\) 中的超平面 \(w=1\) 上的截面,我们就得到了三维欧氏空间中的密铺图案。这四面镜子的摆法在“不可约”的意义下也只有三种,它们分别对应的是 rank 为 4 的仿射 Coxeter 群 \(\widetilde{A}_3,\widetilde{B}_3,\widetilde{C}_3\):
\(\widetilde{A}_3\) | \(\widetilde{B}_3\) | \(\widetilde{C}_3\) |
同样当原像在基本区域中间变动时,它们可以给出各种不同的万花筒图案:
注:你可能要问了,如果我取正方体的六个面所在的平面为镜子,这样不就得到了一个有六面镜子的三维万花筒了吗?这种情形下镜面可以分为三组平行镜面,每组内的两个镜面是平行的,不同组之间的镜子是互相垂直的,这个万花筒本质是三个一维万花筒的“直积”,即不同组的镜面产生的虚像互不干涉,我们称它是可约的。
到这里,我想你应该也能猜到四维空间、五维空间甚至更高维数空间中的欧氏万花筒的构造方法了:在空间 \(\mathbb{R}^{n+1}\) 中摆放 \(n+1\) 面镜子,镜子的夹角是精心选择的,它们的镜面反射生成的是仿射型 Coxeter 群 \(W_n\)。在 \(\overline{\mathcal{D}}\) 中放置一个原像物体,然后观察超平面 \(x_{n+1}=1\),这是一个 \(n\) 维的欧氏空间,就会看到这个空间被万花筒图案所填满,即得 \(n\) 维的欧氏密铺。
\(n\geq4\) 维的欧氏万花筒我们没法直接看到,是不是可以把它投影到二维或者三维空间中来观察呢?不幸的是由于仿射 Coxeter 群只有固定的几种,这种投影并不会给出新的二维/三维欧氏万花筒,但是对某些合适的超平面,通过选取高维万花筒的一部分投影到超平面上,会得到所谓的准晶 (quasicrystals) 结构,比如通过将五维空间中的正方体网格 \(\mathbb{Z}^5\) 的一部分投影到由五次单位根 \(\zeta\) 给出的二维平面 \((1,\zeta,\zeta^2,\zeta^3,\zeta^4)\) 上(取这个复向量的实部和虚部张成的二维子空间),可以得到著名的彭罗斯密铺:
彭罗斯密铺虽然可以密铺整个平面,但是它没有任何平移对称性 (non-periodic),也不能用镜面反射来生成,所以不是欧氏万花筒。
球面万花筒
与欧氏万花筒不同的是,球面万花筒的基本区域只有有限多个虚像,其对应的 Coxeter 群是有限群。
最简单的球面万花筒当然还是一维的情形。这时两个镜面夹角形如 \(\pi-\pi/m\),其中 \(m\ge2\) 是正整数。基本区域 \(\mathcal{D}\) 也是一个无限大的锥形区域,\(\overline{\mathcal{D}}\) 与其所有虚像填满了整个二维空间,基本区域中任意一点及其虚像位于同一个圆周上,构成了一个多边形的顶点:
这个万花筒对应的 Coxeter 群为 \(W=\langle s,t\,|\, s^2=t^2=(st)^m=1\rangle\),这个群有 \(2m\) 个元素,其 Coxeter-Dynkin 图为
一个生动的视频演示:
对于三维的球面万花筒,\(\overline{\mathcal{D}}\) 及其虚像同样填满了整个空间,原像点与其所有虚像都在同一个球面上。通过观察在球面上的截面,就可以看到球面万花筒的图案:
梳理一下,我们发现:
- 二维的球面万花筒是在三维空间中处理的。
- 基本区域 \(\mathcal{D}\) 是一个无限大的锥形区域。
- \(\overline{\mathcal{D}}\) 及其虚像填满了整个 \(\mathbb{R}^3\)。
- 万花筒图案位于截面 \(x^2+y^2+z^2=1\) 上。
这个套路是不是和之前欧氏万花筒的情形很类似呢?区别就在于基本区域及其虚像填满的空间区域不一样,选择的观察万花筒的截面也不一样。
球面万花筒可以给出所有的正多面体:正四面体、正方体、正八面体、正十二面体,正二十面体。这其中正四面体和正八面体是对偶的 (可以由同一个万花筒通过改变原像在基本区域内的位置得到),其 Coxeter 群为 \(A_3\cong S_4\)。正十二面体和正二十面体是对偶的,其 Coxeter 群为 \(H_3\cong A_5\times\mathbb{Z}_2\)。正方体是自对偶的,其 Coxeter 群为 \(B_3\cong S_4\times\mathbb{Z}_2\)。此外所有的正 \(m\) 边形棱柱也可以由球面万花筒得到,其 Coxeter 群为正 \(m\) 边形的对称群 \(I_m\) 与二元群 \(\mathbb{Z}_2\) 的直积,这种多面体其实是将一个多边形关于一个与其垂直的镜子反射得到的,其对称群是可约的。三个镜子能够生成的球面万花筒只有这四种,其中棱柱型中包含无穷多个多面体。
\(A_3\) | \(B_3\) | \(H_3\) | \(I_m\times\mathbb{Z}_2\) | |
---|---|---|---|---|
元素个数 | 24 | 48 | 120 | 4m |
Coxeter 图 | ||||
多面体 | ![]() ![]() |
![]() |
![]() ![]() |
![]() |
通过变换原像在基本区域中的位置,我们还可以获得更多的球面万花筒图案以及对应的多面体,我强烈推荐你体验 Matt Zucker 的 shadertoy 作品,你可以点击画面左边的 UI 来选择对称群,调整原像的位置,切换球面密铺/多面体。
下面这个手工制作的万花筒更加直观地展示了这一点:YouTube 地址
up 主使用的不是三面镜子哎,你能看懂成像的过程吗? 3
更高维的球面万花筒当然更加复杂,但是方法是一样的:在 \(n+1\geq4\) 维空间中摆放 \(n+1\) 个镜面,使得它们的反射生成一个有限 Coxeter 群,基本区域的闭包 \(\overline{\mathcal{D}}\) 及其虚像填满了整个 \(\mathbb{R}^{n+1}\),将截面 \(x_1^2+\cdots+x_{n+1}^2=1\) 上的图案投影到 \(n\) 维空间即可。
我们把四维空间中的正多面体叫做正多胞体,因为它其实是由若干全等的三维正多面体拼起来的,每个三维多面体构成其一个胞腔。四维空间中的正多胞体有 5-cell, 超正立方体 (tesseract),16-cell, 24-cell, 120-cell, 600-cell 六种。例如下面的动画演示的是 120-cell 投影到三维后的效果:
关于正多胞体的更多知识,我推荐欣赏数学视频 Dimensions 中的第三章和第四章。
镜子必须是平的吗?
在前面欧氏和球面万花筒中,我们使用的都是平直的镜子来进行反射,虚像和原像是一模一样大小的。难道镜子不能是弯曲的吗?用哈哈镜可不可以呢?
当然可以,故事精彩的部分从这里才真正开始呢!😆
怎么描述哈哈镜的反射呢?这就是下面要介绍的反演变换。
设 \(B(O, r)\) 是以空间中一点 \(O\) 为中心,半径为 \(r\) 的球,\(P\) 是空间中任意一点。点 \(P\) 关于球 \(B(O,r)\) 的反演点 \(P'\) 是射线 \(\overrightarrow{OP}\) 上满足 \(|OP|\cdot |OP'| = r^2\) 的唯一点。显然 \(P'\) 关于 \(B(O,r)\) 的反演点是 \(P\),我们称 \(P,P'\) 关于 \(B(O,r)\) 互为反演点。规定球心 \(O\) 和无穷远点互为反演点。
写成表达式,就是 \[P' = O + \frac{r^2(P - O)}{|P - O|^2}.\]
当 \(P\) 在球外时,可以这样计算反演点 \(P'\):过 \(P\) 作球 \(B(O, r)\) 的任一切线,设切点为 \(Q\),然后由 \(Q\) 点向线段 \(\overline{OP}\) 引垂线,垂足 \(P'\) 即为所求的反演点。
反演变换 \(f:P\to P'\) 是非线性的,它交换球面的内部和外部,保持球面上的点不动,并且连续的两次反演又回到自身,所以正是以球面为镜面的反射!
反演变换有几个重要的性质:
- 它将空间中的任何球面/超平面仍然映射为球面/超平面。如果把超平面看作是半径无穷大的球面的话,那么这句话就可以简写为反演变换将球面映射为球面。
- 它是保角的,即两条曲线 \(\gamma(t),\gamma'(t)\) 在一点 \(p\) 处的夹角等于变换后 \(f(\gamma(t)),f(\gamma'(t))\) 在 \(f(p)\) 处的夹角。
- 一个球面/超平面在反演变换下被映射为自身,当且仅当其与反演球是正交的。
这三条性质都比较容易证明,不过本文就不在这里展开写了。
你可能已经猜到了,本文开头的球堆图案就是通过在空间中摆放一些球面哈哈镜,然后以若干珠子作为原像,让这些原像在镜子中反复成像而得到的!
这里的核心问题是,怎样摆放不同的哈哈镜,才能让它们和谐共处,翩翩起舞,营造出绚丽的珠光宝气的世界呢?这背后的原理是什么呢?
要回答这个问题,我们必须进入奇妙的双曲空间,研究其中的万花筒结构:双曲万花筒。
在进入这部分内容之前,我们需要介绍一个非常重要的反演变换,即所谓的球极投影。我们之前提到,球堆图案是四维双曲空间的边界在三维欧氏空间中的投影。我们经常需要在低维的欧氏空间与高维的双曲空间之间做一些转换,球极投影就可以帮助我们做到这一点。
设 \(S_n=\{(x_1,x_2,\ldots,x_{n+1})\,|\, x_1^2+x_2^2+\cdots+x_{n+1}^2=1\}\) 是 \(\mathbb{R}^{n+1}\) 中的单位球面,把 \(\mathbb{R}^n\) 等同于超平面 \(x_{n+1}=0\),球极投影按照如下方式建立 \(S_n\) 与 \(\mathbb{R}^n\cup\{\infty\}\) 之间的一一对应:取 \(q=(0,0,\ldots,1)\) 为 \(S_n\) 上的北极点,对球面 \(S_n\) 上任意一点 \(p\),作射线 \(\overrightarrow{qp}\) 与平面 \(x_{n+1}=0\) 交于一点 \(\widetilde{p}\),\(\widetilde{p}\) 即为 \(p\) 点在球极投影下的对应点。此外规定 \(q\) 的对应点为无穷远点。
用坐标的形式表示,设 \(p=(x_1,x_2,\ldots,x_{n+1})\),则 \[\widetilde{p}=(\frac{x_1}{1-x_{n+1}}, \frac{x_2}{1-x_{n+1}},\ldots, \frac{x_n}{1-x_{n+1}},0).\]
注意到 \(\widetilde{p}\) 也在射线 \(\overrightarrow{qp}\) 上,且不难计算验证 \(|\widetilde{p} - q| \cdot |p - q| = 2\),所以球极投影是关于以北极点 \(q\) 为中心,半径为 \(\sqrt{2}\) 的球的反演变换。
另一种常见的球极投影方式是选择投影到 \(x_{n+1}=-1\) 平面上,根据相似原理这种方式是将投影到 \(x_{n+1}=0\) 的结果放大 2 倍,所以它是以北极点为中心,半径为 2 的球的反演变换。
既然球极投影是反演变换,那么它自然具有“保持球不变的性质”,即它将 \(S_n\) 上的圆映射为 \(\mathbb{R}^n\) 中的球或者超平面,其中只有在 \(S_n\) 上的圆过北极点时其才被映射为超平面。在 \(n=2\) 时,单位球 \(S^2\) 上的圆被映射为平面上的圆或者直线。
下面的图片来自 Henry Segerman,演示了对经过北极点的圆,其在球极投影下被映射为平面上的直线:
下面的视频来自 Jos Leys,演示了对不经过北极点的圆,其在球极投影下被映射为平面上的圆:
可以看到在球极投影下,球面上越靠近北极的区域,投影到地面后就会越远,被放大的比例就越大,所以球极投影在北极点附近是严重变形的。
我留两个疑问:
Q:反演变换的原像和虚像大小不一致,这也能用在万花筒里吗?
是的,从欧氏度量的角度看它们大小是不一样,但是如果我们修改度量的定义,把整个场景搬到一个弯曲的空间中呢?在新的度量下它们不就可以一样大了?
Q:\(n\) 维的仿射变换可以放到 \(n+1\) 维的空间中处理成线性变换,反演变换也可以吗?
可以!不过区别是 \(n\) 维欧式空间中的反演需要放到 \(n+2\) 维的双曲空间 (射影模型) 中变成线性变换,这一点后面会讲到。
二维 Poincaré 双曲空间
双曲空间是一个“弯曲”的度量空间,它有若干不同的等价模型,这里“等价模型”的意思是,我们可以在不同的空间 \(H,H'\) 上定义不同形式的双曲度量 \(\mathrm{d}_H, \mathrm{d}_{H'}\),但二者间存在一一映射 \(f:H\to H'\) 使得 \(\mathrm{d}_H(p,q) = \mathrm{d}_{H'}(f(p), f(q))\),即 \(f\) 保持变换前后的度量不变,所以 \(H,H'\) 是等价的双曲空间模型。
最常见的是 Poincaré 单位球模型,这其中又以二维的单位圆模型最著名。
在二维时,Poincaré 双曲空间由单位圆盘的内部 \(\mathbb{D}=\{|z|<1,z\in\mathbb{R}^2\}\) 组成。注意单位圆周 \(|z|=1\) 不属于这个空间,它是空间的“无穷远边界”。
在这个空间里,两点之间 \(P,Q\) 的最短路径一般不再是直线,而是过 \(P, Q\) 且与单位圆正交的一个圆在 \(P,Q\) 之间的部分:
这个路径的长度为 \[\mathrm{d}(P, Q) = \ln\frac{|AQ|\cdot |PB|}{|AP|\cdot |QB|}.\] 这里 \(|AQ|\) 指的是 \(A,Q\) 两点之间直线线段的欧氏长度。其它同理。
只有在 \(P,Q\) 位于同一条直径上时,\(P,Q\) 之间的最短路径才是过它们的欧氏直线段。
任意一点 \(R\) 到单位圆中心 \(O\) 的双曲距离 \(\mathrm{d}(P, O)\) 与 \(R\) 的欧氏长度 \(r\) 之间的关系为 \[\mathrm{d}(P, O) = \ln\frac{1 + r}{1 - r}.\] 所以你看,当 \(R\) 逐渐接近单位圆周时,\(r\uparrow 1\),\(\ln\dfrac{1+r}{1-r}\uparrow\infty\),\(R\) 与圆盘中心 \(O\) 的双曲距离趋于无穷大!
对刚接触双曲空间的人来说,这确实有点难以接受,单位圆不过是巴掌大点的地方,它怎么会是个无穷大的空间呢?这是因为我们是在外部的欧氏空间中去看它,而对生活在双曲空间中的外星生物,它们会有完全不同的体验。
在双曲空间中有许多现象对习惯了欧氏空间的人类来说是反直觉的,举几个例子:
过直线 \(l\) 外一点 \(p\) 可以作无穷多条直线与 \(l\) 平行。这里的直线应理解为双曲度量下的最短路径,即测地线:
左边的这组直线与 \(l\) 实际上是超平行的,它们与 \(l\) 既不相交也不相切,但是它们与 \(l\) 所夹的角度是不一样的。所以在双曲空间中平行这个概念不再简单地等价于“两条直线夹角为 0/180 度”。在双曲空间里面我们实际上可以用一个实数 \(a\) 来标记两条直线的夹角:当两条直线相交时,\(a\) 就是二者夹角的余弦 \(a=\cos\theta\in(-1,1)\);若两条直线对应的圆相切,这时它们平行但不超平行,\(a=\pm1\),其中 \(a=+1\) 对应的是两圆内切,\(a=-1\) 对应的是两圆外切;当两条直线超平行时 \(|a|>1\),其中 \(a>1\) 对应的是一个圆包含另一个,\(a<-1\) 对应的是两圆不相交。这个实数 \(a\) 叫做两个圆的 separation,它的具体计算方式我们暂时先不做介绍。
任何三角形的内角和小于 180 度,最小可以是 0,最大可以任意接近 180 度:
注意最外侧的三角形的三条边两两夹角都是 0,它们是双曲空间里的三条平行线。两条平行线在一端趋近,在另一端发散,所以平行线之间的距离不是固定值。虽然我们从外部空间观察看到它们互相趋近的一端在圆周上有个交点,但对双曲空间里的人他们看到的其实类似于摄影中的透视现象,平行线的交点位于无穷远处:
在欧氏空间中,三个内角完全相同的两个三角形未必全等,它们还可以相差一个缩放;但在双曲空间中这样的两个三角形必然全等。
我们还需要不加证明地引用如下事实:
事实:在 Poincaré 空间中,关于直线的反演变换保持直线上的点不动,交换直线的两侧空间,并且保持双曲度量不变。即关于直线的反演变换是双曲空间中的镜面反射,虚像和原像是全等的。
有了这些准备,我们来看一个简单的双曲空间中的万花筒:
在双曲空间中摆放三面镜子,这里有两个是平面镜,一个是球面镜,三个镜子的夹角分别为 \((\pi-\pi/3, \pi-\pi/3, \pi-\pi/7)\),三面镜子围成一个三角形的基本区域。我在右上角的小图中标出了三个镜面:
想象基本区域的边界是三面哈哈镜,将基本区域关于这三面镜子作一次反射,得到三个虚像,虚像再作反射得到更多虚像,一直下去,得到的图案就密铺了整个空间:
完整的动画在下面:
虽然看起来越靠近边界处图案变得越来越小,但记住这只是我们的错觉,所有的三角形在双曲空间中都是全等三角形。
在上面的例子中,基本区域 \(\mathcal{D}\) 是一个完全位于双曲空间内部的三角形,这种情形称作是紧的 (compact);如果有的顶点位于无穷远边界上,这种情形称作是仿紧的 (paracompact),这样的顶点叫做理想 (ideal) 顶点;进一步如果有的顶点位于空间外部,这种情形称作是非紧的 (non-compact),这样的顶点叫做超理想 (hyperideal) 顶点。
紧 (有限顶点) | 仿紧 (理想顶点) | 非紧 (超理想顶点) |
![]() |
![]() |
![]() |
之前提到,所有万花筒都可以通过在高维空间中摆放平面镜 (镜面反射是线性变换),然后取合适的截面投影到低维空间中得到。双曲万花筒也不例外。下图演示了二维的 Poincaré 双曲空间中的万花筒可以从三维的 Hyperboloid 射影模型投影得到:
图中红色的锥是基本区域 \(\mathcal{D}\),\(\overline{\mathcal{D}}\) 及其虚像也填满一个锥形区域 (Tits 锥),通过取其在双曲抛物面 \(x^2+y^2-z^2=-1\) 的上半分支的截面就得到了万花筒图案,投影即可得 Poincaré 双曲空间的密铺。
我来解释下怎么从 Coxeter-Dynkin 图来判断万花筒是紧的、仿紧的还是非紧的。
假设 Coxeter-Dynkin 图有 \(n\) 个顶点,于是万花筒有 \(n\) 面镜子,在 \(n\) 维空间中处理时,基本区域有 \(n+1\) 个顶点,其中一个是原点,对另外 \(n\) 个顶点中的任何一个顶点 \(P\),\(P\) 恰好位于其中 \(n-1\) 面镜子的交线上,这 \(n-1\) 面镜子构成一个低一维的万花筒。\(P\) 的类型可以根据这个低一维的万花筒的类型来判断:
- \(P\) 是有限的 (位于空间内部) 当且仅当这个低一维的万花筒是球面的。
- \(P\) 是理想的 (位于空间边界) 当且仅当这个低一维的万花筒是仿射的。
- \(P\) 是超理想的 (位于空间外部) 当且仅当这个低一维的万花筒是双曲的。
在上面仿紧的 Coxeter 图中我标注了一个红色顶点,它是理想顶点,因为拿走它之后剩下的是一个 \(\infty\) 标号的欧氏万花筒。在上面非紧的 Coxeter 图中我也标注了一个红色顶点,它是超理想顶点,因为拿走它以后剩下的是一个标号为 \(-1.1\) 的双曲万花筒。这个标号是 Vinberg 记号,表示两条超平行直线之间的 separation,因此是双曲的。这三个图中所有黄色的顶点都是有限的,因为拿走它们以后剩下的都是有限 Coxeter 群。
下面的视频中,我们尝试从一个双曲空间中的生物的角度去理解它所看到的世界,当然这个效果并不真实,因为双曲空间中的光并不走直线。
三维双曲蜂巢
有了二维双曲空间的经验,三维双曲空间就容易理解多了。既然二维双曲万花筒需要三面哈哈镜,基本区域是个三角形,以边为镜面,自然对三维 Poincaré 单位球空间,我们需要四面哈哈镜,基本区域是个四面体,镜面是多面体的面。基本区域在反复的反射下密铺整个单位球的内部,形成所谓的蜂巢结构:
这其中每一个胞腔都是一个双曲空间中的正十二面体,每个顶点处有 8 个胞腔在此相邻,每条边处有 4 个胞腔在此相邻。其 Coxeter-Dynkin 图为
其中圈出的镜面表示原像点位于除去这个镜面之外其它镜面的交线上,即第一次反射时只有此镜面会给出新的虚像。
我们也把这个蜂巢简写为 (5, 3, 4),其中 (5, 3) 正是前面看到过的正十二面体的 Coxeter-Dynkin 图,这对应胞腔的结构;(3, 4) 正是前面看到过的正立方体的 Coxeter-Dynkin 图,这对应每个顶点处胞腔的拼接方式。
在三维双曲空间中这样的所有胞腔均为全等的多面体的紧致蜂巢只有四种,另外三种分别是 (4, 3, 5), (3, 5, 3) 和 (5, 3, 5)。你能看出来下面这个是另外三个中的哪一种吗?
仿紧的正的蜂巢有 11 种,例如下图显示的是 (3, 6, 3):
其 Coxeter-Dynkin 图如下:
这个蜂巢的每个胞腔是一个记号为 (3, 6) 的多面体,而 (3, 6) 给出的是二维正六边形欧氏密铺,所以每个胞腔有无穷多个面,每个面是一个正六边形。想象把一个平面上无穷大的六边形网格在无穷远处扎在一起变成一个网兜的样子,这个网兜就是蜂巢中的一个胞腔。而这个扎在一起的位置,就是图中黑色的洞,它们是位于单位球边界上的理想顶点 4。
从边界附近观察蜂巢,这时的景象颇有点科幻的味道:
对仿紧的蜂巢,在边界附近可以更清楚地看到那些有理想顶点的胞腔,作为一个有无穷多个网眼的网兜是怎样在其理想顶点处“扎在一起”的:
对非紧的蜂巢,你会看到这时在边界球面上出现了许许多多大小不一的圆洞,这些圆洞密密麻麻挤在一起,但是互不相交 (可以相切但是没有公共的内部),并且覆盖了整个球面 (所有圆内部的并的闭包等于整个球面),所谓的圆堆 (circle packing) 图案出现了!
这不应该是一个特别惊奇的事情,回忆我们之前看到的二维非紧密铺的情形,那个二维的情形已经足够说明问题:图中每个三角形(基本区域以及其虚像) 都是双曲空间中一个无穷大的区域,它们各自与单位圆的边界之交是一段圆弧,这样的圆弧对应三角形的超理想顶点。所有这些圆弧互不相交且拼成了整个单位圆周!
所以上升到三维的情形,把单位圆换成单位球,三角形换成蜂巢的胞腔,圆弧换成圆,就得到每个胞腔 (准确的说是那些有超理想顶点的胞腔) 与边界球面的交是一个圆,这个圆对应胞腔的一个超理想顶点,所有这些圆之间内部互不相交,并且它们并的闭包等于整个球面,绝无遗漏,我们称之为圆堆 (circle packing)。
不过等等,好像我们还漏掉了什么,注意到图中那些位于圆盘缝隙之间的点了吗?它们有什么含义吗?
答案是:它们是 Coxeter 群 \(W\) 作用在三维双曲空间上的极限集 (limit set)。极限集构成一个分形。
极限集的定义:设 \(x_0\) 是三维双曲空间中一点,\(W(x_0)=\{w(x_0)\,|\, w\in W\}\) 为 \(x_0\) 在蜂巢的对称群 \(W\) 作用下的轨道,则集合 \(W(x_0)\) 的聚点都位于边界球面上。我们把 \(W(x_0)\) 的所有聚点组成的集合叫做 \(W\) 的极限点,把极限点的闭包叫做 \(W\) 的极限集,记作 \(\Lambda(W)\)。可以证明 \(\Lambda(W)\) 的定义不依赖于 \(x_0\) 的选取,没有非空的内点,并且是边界球面上在 \(W\) 作用下不变的最小非空闭集。
由于极限集没有内点 (实际上它的测度是 0),所以严格来说我们是画不出来的,上图中我做了一些近似处理,在边界上挖去了一些较大的圆,剩下的部分就认为属于极限集了。
上面这种“管中窥豹”的方法不太方便领略超理想蜂巢的全貌,我们采用另外两种方法来绘制它:
第一种方法是通过一个反演变换,把 Poincaré 单位球模型转移到上半空间模型中,上半空间模型是双曲空间的另一种模型,它由 \(\{(x,y,z)\,|\, z > 0\}\) 组成,以平面 \(z=0\) 为其无穷远理想边界。这时圆堆的图案出现在了地面上:
越靠近地面,蜂巢的结构就变得越小,但是记住地面是无穷远边界,靠近边界的时候双曲度量相对于欧氏度量是指数增长的关系,所以蜂巢“看起来”变小可不是真的小。
上图中也包含了仿紧的蜂巢结构,你能找出来吗?
第二种方法是把边界球面上的图案通过球极投影变换到地面上。可以看到每一个圆都自成一个二维的 Poincaré 双曲空间:
在上面的图中,蜂巢结构藏在地面上的小球里面,球面上的图案是边界球面上的圆堆,地面上的图案来自球面上图案的球极投影。
啊?这太不可思议了吧?还记得我们之前说过吗,一个顶点是超理想的,当且仅当将它对应的镜面移除以后剩下的镜面生成一个双曲密铺,图中每一个圆盘中绘制的图案对应的正是这个双曲密铺。这无穷多个双曲空间合在一起,构成了欧氏平面里的一个圆堆!
你注意到了吗?上面图中的圆堆似乎按照染色分成了不同的种类。这个染色是有讲究的:在 Coxeter-Dynkin 图中,如果有多个超理想顶点,那么它们各自的 vertex configuration 对应不同的圆盘,这些圆盘在对称群作用下生成不同的轨道,这个染色就是根据轨道来的。
一沙一世界,一叶一菩提
在看过了二维和三维超理想蜂巢的情形后,我们整理一下目前为止的思路:
- 二维的情形单位圆内部是蜂巢,边界上出现了无数弧段拼成的“arc packing”,而单位圆可以在球极投影下等同于 \(\mathbb{R}^1\cup\{\infty\}\)。
- 三维的情形单位球内部是蜂巢,边界上是圆堆,而单位球面可以在球极投影下等同于 \(\mathbb{R}^2\cup\{\infty\}\),所以我们得到一个二维欧氏平面的圆堆。
所以再上升一个维度,对四维超理想蜂巢,它的边界上应该出现“ball packing”的图案,将边界在球极投影下等同于三维欧氏空间,我们应该得到一个三维欧氏空间的 ... 球堆?
不完全是这样。
并不是对任何超理想的蜂巢,边界上都会出现圆堆的图案。比如在三维蜂巢的情形,考虑下面这个 Coxeter 群:
这个群对应的蜂巢结构在边界上的图案如下:
仔细看,地面上的圆之间发生了重叠的现象,这不构成一个圆堆。
问题出在这个群的 Coxeter-Dynkin 图中删去下方的两个顶点以后剩下的两个顶点之间的标号为 \(-1.1\),这是 Vinberg 记号下用于表示双曲空间中两个超平行的反射镜面,因此剩下的这两个镜面生成一个双曲 Coxeter 群。对这种删去两个顶点以后剩下的部分仍然给出双曲 Coxeter 群的情况,蜂巢的边界上一定会出现重叠的圆。
为了解释什么情况下圆堆会出现重叠的情况,我们需要引入 Coxeter 群的 level 的概念。
定义 3:设 \(l\) 是一个非负整数,\(W\) 是一个 Coxeter 群。\(W\) 的 level 是最小的非负整数 \(l\),使得在其 Coxeter-Dynkin 图中删除任何 \(l\) 个顶点后得到的子图是有限的或者仿射的。
于是有限或者仿射 Coxeter 群的 level 都是 0。对于紧的或者仿紧的双曲蜂巢,其没有超理想顶点,删除任何一个顶点以后剩下的子图都是有限或者仿射 Coxeter 群,所以 Coxeter 群的 level 等于 1。
对 level 大于等于 2 的群,我们有如下结论:
定理 [Maxwell82]:空间边界上出现圆堆图案当且仅当 Coxeter 群的 level 等于 2。
在陈浩老师和 Labbé 的论文中 (见参考文献) 列出了全部 326 种 rank >=5 的 level = 2 的 Coxeter 群。而 level >= 3 的 Coxeter 群有无穷多个。
所以对于四维蜂巢,要使得它的空间边界上出现球堆,其 Coxeter 群的 level 必须是 2。不过由于球堆在球极投影到三维欧氏空间后会填满整个欧氏空间,导致我们“无处落脚”,所以我们选择特殊的群进行展示,使得其球堆在投影后有一个球是三维空间中的 \(z=0\),其内部为 \(z<0\) 的半空间,其它球都位于 \(z>0\) 半空间。这个上半空间可以进一步通过反演变换到单位球里面,我们就得到了单位球里的一个球堆:
另一种方式是直接用一个 \(z=c>0\) 的平面去做截面。由于整个上半空间填满了球,所以做截面以后得到的应该是一个二维的圆堆,如下图所示:
这个圆堆对应的 Coxeter-Dynkin 图如下所示,
其中每一个顶点都是超理想顶点,所以它的蜂巢的基本区域的所有顶点都在空间外面,但是删去任何两个顶点以后得到的子图要么是二维的 (4, 4) 仿射群,或者是 (2, 2, 2) 有限群,所以它的 level 等于 2。由于它包含 (4, 4) 仿射群作为子群,所以圆堆的图案具有正方形网格的对称性。
你可以在项目主页看到更多的圆堆截面图。
在 rank = 5 但是 level >= 3 的情形,球堆仍然覆盖了整个空间,但是会出现重叠的现象。如果我们移走一部分球的话,空间中就会出现连通的空洞,得到的就是类似本文开头的分形效果图。
rank=5, level=3 | rank=5, level=4 |
![]() |
![]() |
同样地,图中的每个球,包括移走的那些,都自成一个三维的 Poincaré 双曲空间。虽然这些球看起来大小不一,但这是投影到欧氏空间后的效果,在双曲空间中,来自同一个原像的球大小都是一样的。
至此我们的故事就讲完了。本文内容比较长,所以如果你记不住太多内容的话,可以记住这个一句话的概括:
双曲万花筒的内部是蜂巢,边界是圆堆,圆堆在边界上的补集是分形 。
双曲空间、蜂巢、圆堆、分形都有了。
关于这个项目
这个项目的完成首先要感谢合作者陈浩老师和另一位贡献者 Abdelaziz Nait Merzouk (knighty)。
knighty 应该是最早提出使用 raymarching 技巧渲染双曲蜂巢的人。他在旧版的分形论坛 www.fractalforums.com 上公开了这一方法。本项目中渲染三维蜂巢的程序就是基于他的方法。此外 knighty 也是所谓 "pseudo Kleinian" 分形的发现者,你可以在网络上搜索到大量关于这一分形的精美图片。在与 knighty 的私信讨论中他耐心地向我解释了 raymarching 技巧中的许多细节,并对项目提出了很多有用的修改意见。
陈浩老师在看到本文开头 knighty 的作品后认出了这种分形来自 level 3 情形的圆堆,首先给出了这个分形更为本质的数学解释 (来自专业人士的降维打击)。他不厌其烦地向我解释了圆堆与双曲几何背后的数学,并手把手教给我构造圆堆的步骤。如果不是陈浩老师的指导,我绝不可能领略到圆堆和蜂巢背后如此奇妙的数学!
这个项目由若干个子程序组成,有一些使用了分形软件 fragmentarium,其它的放在 ShaderToy 上。使用的渲染方法主要是 raymarching 和 distance field rendering 技术。
附录:技术细节补充
这部分内容似乎不适合放在一个科普性质的文章中,所以作为附录的形式出现。
Coxeter 群必须是有限、仿射或者双曲的吗?
并非如此。虽然本文介绍的三种万花筒分别对应有限、仿射和双曲 Coxeter 群,但并不是所有的 Coxeter 都给出这三种万花筒之一。这一点可以用 Cartan 矩阵的符号来判断:
设 \(M=(m_{ij})_{1\leq i,j\leq n}\) 是 Coxeter 矩阵,\(C = \left(-\cos\dfrac{\pi}{m_{ij}}\right)_{1\leq i,j\leq n}\) 叫做 Cartan 矩阵,其中当 \(M\) 中的某个元素是 Vinberg 记号下的实数 \(a\) 时,Cartan 矩阵中对应的元素用 \(a\) 代替。我们假设 Coxeter 群是不可约的,即其 Coxeter-Dynkin 图是连通的,这时有如下判定:
- Coxeter 群是有限的当且仅当 \(C\) 正定。
- Coxeter 群是仿射的当且仅当 \(C\) 的符号为 \((n-1, 0)\)。
- Coxeter 群是双曲的当且仅当 \(C\) 的符号为 \((n-1, 1)\)。
Maxwell 证明了 level = 2 的群必然是双曲的,对 level >=3 的群则不一定。
反演变换作为高维空间中的线性变换
这一部分来说明欧氏空间中的反演变换和平面反射都可以处理为高维空间中的线性变换。
设 \(\mathbf{x}\in\mathbb{R^n}\) 是欧氏空间中一点,为了方便我们取南极点 \((0,0,\ldots,-1)\) 为球极投影中的极点,在逆球极投影下它的像为 \[\mathbf{X} = \left(\frac{2\mathbf{x}}{1+\mathbf{x}^2}, \frac{1-\mathbf{x}^2}{1+ \mathbf{x}^2}\right)\in S^n\subset\mathbb{R}^{n+1}.\] 这里我用记号 \(\mathbf{x}^2\) 来表示欧氏内积 \(\mathbf{x}\cdot\mathbf{x}\)。
进一步我们把 \(\mathbf{X}\) 放到 \(n+2\) 维空间中的超平面 \(x_{n+2}=1\) 上:定义 \(\mathbf{\xi} = (\mathbf{X}, 1)\)。
\(\mathbb{R}^n\) 中以一点 \(\mathbf{p}\) 为中心,\(r>0\) 为半径的球可以表示为 \[(\mathbf{x-p})^2\leq r^2.\] 直接验证可得这等价于 \(\langle\mathbf{\xi}, \mathbf{\omega}\rangle_L \geq 0\),其中 \[\mathbf{\omega} = \left(\frac{\mathbf{p}}{r}, \frac{1-\mathbf{p}^2+r^2}{2r}, \frac{1+\mathbf{p}^2-r^2}{2r}\right).\] 而 \(\langle\cdot,\cdot\rangle_L\) 是 \(\mathbb{R}^{n+1,1}\) 中的 Lorentz 内积: \[\langle \mathbf{x},\mathbf{y} \rangle_L = \sum_{i=1}^n x_iy_i - x_{n+1}y_{n+1}.\] 注意到 \(\mathbf{\omega}\) 的分母上都除以 \(r\),这是为了使得 \(\langle \mathbf{\omega},\mathbf{\omega} \rangle_L = 1\),即 \(\mathbf{\omega}\) 是 Lorentz 内积下的单位向量,并且是 space-like 的。
球的外部 \((\mathbf{x-p})^2\geq r^2\) 自然可以表示为 \(\langle\mathbf{\xi}, \mathbf{\omega}\rangle_L \leq 0\)。所以欧氏空间中的球面确实可以表示为高维双曲空间中的半空间。
\(\mathbb{R}^n\) 中以 \(\mathbf{n}\) 为单位法向量,与原点距离为 \(d\) 的超平面的正半空间可以表示为 \[\mathbf{x}\cdot\mathbf{n}\geq d.\] 直接验证可得这等价于 \(\langle\mathbf{\xi}, \mathbf{\omega}\rangle_L \geq 0\),其中 \(\mathbf{\omega} = (\mathbf{n}, -d, d)\)。\(\mathbf{\omega}\) 仍然是 Lorentz 内积下 space-like 的单位向量。
设 \(\mathbf{\omega}_1,\mathbf{\omega}_2\in\mathbb{R}^{n+1,1}\) 分别对应 \(\mathbb{R}^n\) 中的两个球 \((\mathbf{p}_1,r_1)\) 和 \((\mathbf{p}_2,r_2)\),则 \[\langle \mathbf{\omega}_1,\mathbf{\omega}_2\rangle_L=\frac{r_1^2+r_2^2-|\mathbf{p_1-p_2}|^2}{2r_1r_2}=\pm1 + \frac{(r_1^2\mp r_2^2)-|\mathbf{p_1-p_2}|^2}{2r_1r_2}.\] 于是 \(\langle \mathbf{\omega}_1,\mathbf{\omega}_2\rangle_L\in[-1, 1]\) 当且仅当 \[|r_1-r_2| \leq |\mathbf{p_1-p_2}|\leq r_1+r_2,\] 即两球有交点。且等于 \(-1\) 时两球外切,等于 \(+1\) 时两球内切。
此外当 \(\langle \mathbf{\omega}_1,\mathbf{\omega}_2\rangle_L < -1\) 时两球不相交,\(\langle \mathbf{\omega}_1,\mathbf{\omega}_2\rangle_L > 1\) 时一个球完全包含另一个球。
这个内积 \(\langle \mathbf{\omega}_1,\mathbf{\omega}_2\rangle_L\) 就是我们之前提到的镜面之间的 separation 值。
不难验证欧氏空间中关于球 \((\mathbf{p},r)\) 的反演变换对应的是 \(\mathbb{R}^{n+1,1}\) 中的超平面反射 \(\mathbf{\xi}\to\mathbf{\xi}- 2\langle\mathbf{\xi, \omega}\rangle_L\cdot\mathbf{\omega}\),这个反射保持 Lorentz 度量不变,因而是双曲空间的等距变换。
超理想顶点的进一步解释
蜂巢的超理想顶点其实并不难理解,但是需要借助双曲空间的 Klein 模型,以及一些二次型的知识。
首先是一些关于 Klein 模型的基本知识。
下面的插图来自 Martin Von Gagern:
Poincaré 模型 | Klein 模型 |
![]() |
![]() |
![]() |
![]() |
Klein 模型与 Poincaré 模型类似,都来自双曲空间在高一维空间的投影,区别在于投影选择的极点不同,所以所处的位置也不同。Poincaré 空间位于过原点的平面 \(x_{n+1}=0\) 上,而 Klein 模型位于与双曲抛物面相切的平面 \(x_{n+1}=1\) 上。过原点的超平面与双曲抛物面的交线投影到 Poincaré 模型后则变为与单位圆正交的测地线,而投影到 Klein 模型则以后变为直线。
在我们刚才将 \(\mathbb{R}^n\) 中的点 \(\mathbf{x}\) 映射为 \(\mathbb{R}^{n+1,1}\) 中的点 \(\xi\) 的过程中,第一步是逆球极投影到了单位球面上,第二步则是提升到了 Klein 模型中,它位于平面 \(x_{n+1}=1\) 截光锥 \(\langle\mathbf{x,x}\rangle_L = 0\) 得到的截面上。
其次是一些二次型的基本知识。
在 Lorentz 空间 \(\mathbb{R}^{n,1}\) 中,设 \(\xi\) 是一个非零向量,\(\xi^{\bot}\) 是在 Lorentz 内积下 \(\xi\) 的正交补空间,则有三种可能:
\(\xi\) 位于光锥内部,所以是 time-like 的:\(\langle\xi,\xi\rangle_L<0\),内积限制在 \(\xi^\bot\) 上是正定的,\(\xi^\bot\) 与光锥没有非零交点。
\(\xi\) 位于光锥边界,所以是 light-like 的:\(\langle\xi,\xi\rangle_L=0\),内积限制在 \(\xi^\bot\) 上的 Sylvester 符号为 \((n-1, 0)\),\(\xi^\bot\) 与光锥相切于 \(\xi\) 5。
\(\xi\) 位于光锥外部,所以是 space-like 的:\(\langle\xi,\xi\rangle_L>0\),内积限制在 \(\xi^\bot\) 上符号为 \((n-1,1)\)。\(\xi^\bot\) 与光锥之交是一个球帽 (sphere cap)。
之前提到,对蜂巢基本区域的一个顶点 \(\xi\),过 \(\xi\) 的镜面会生成一个低一维的万花筒,这个低一维的万花筒实际上出现在过 \(\xi\) 的切平面 \(H = \xi + \xi^\bot\) 中,叫做顶点 \(\xi\) 的 vertex configuration。剩下那个不经过 \(\xi\) 的镜面起到了截面的作用。当 \(\xi\) 位于光锥内部时,内积 \(\langle\cdot,\cdot\rangle_L\) 限制在 \(\xi^\bot\) 上是正定的,因而在 \(H\) 上也是,这个低一维的万花筒是个球面万花筒。特别地 \(H\) 与光锥的截面还是一个以 \(\xi\) 为中心的欧式度量下的球。当 \(\xi\) 位于光锥上是理想顶点时,内积 \(\langle\cdot,\cdot\rangle_L\) 限制在 \(\xi^\bot\) 上是半正定的,\(H\) 与光锥相切于过 \(p\) 的直线,这个万花筒是个欧式万花筒。当 \(\xi\) 位于光锥外部时,内积 \(\langle\cdot,\cdot\rangle_L\) 限制在 \(\xi^\bot\) 上是双曲的,因而这个万花筒是个双曲万花筒,特别地 \(H\) 与光锥的截面是一个以 \(p\) 为中心的具有 Minkowski 内积的伪球 (hyperboloid)。
下面的视频演示了对非紧的情形,基本区域会有一部分落在光锥外面,它与光锥的交是一段弧 (在射影空间中),在投影到下方的 Klein 空间时变成边界上的一段圆弧。
参考文献
- G. Maxwell. Sphere packings and hyperbolic reflection groups. J. Algebra 79 (1982), no. 1, 78–97.
- È. B. Vinberg. Discrete groups generated by reflections.
- Hao Chen, Jean-Philippe Labbé. Lorentzian Coxeter systems and Boyd-Maxwell ball packings.
- Thomas E. Cecil, Lie Sphere Geometry, 2nd ed., Universitext, Springer, New York, 2008.
- John G. Ratcliffe. Foundations of Hyperbolic Manifolds. Graduate Texts in Mathematics book series (GTM, volume 149).
- Roice Nelson, Henry Segerman. Visualizing Hyperbolic Honeycombs.
这段材料要感谢陈浩老师推荐。↩︎
这里我们暂时先不考虑 Vinberg 记号的情形,见后文。↩︎
注意到每个万花筒都使用了四面镜子,所以 up 主应该是取两个互相垂直的镜子 \(m_1,m_2\) 过原点,然后将镜子 \(m_3\) 关于 \(m_1,m_2\) 反复反射。\(m_3\) 在 \(m_1,m_2\) 生成的 dihedral 群作用下有四个像,正好围成一个圆周,这就是视频中的四面镜子。然后拿走镜子 \(m_1,m_2\),把塑料棒放在镜子 \(m_1\) 或者 \(m_2\) 的位置上,使得塑料棒中间部分位于原点,这相当于使得塑料棒首先关于 \(m_2\) (或 \(m_1\)) 成像一次,得到的就是正多面体。↩︎
这个蜂巢的顶点实际上位于一个 horosphere 上:
这个 horosphere 可以通过一个反演变换变成欧式空间的一个正六边形密铺。↩︎
见参考文献中 Ratcliffe 的书定理 3.1.1。↩︎