数学 / 立体几何初步 · 从直观图到判定定理 / 空间几何体的结构与直观图 待审核 1 / 5
V − E + F = 2

空间几何体的结构与直观图

立体几何的第一批对象是形体本身。课本从平面图形造它们:多边形沿一个方向平移得棱柱,向一点收缩得棱锥,中途截断得棱台;矩形绕一边旋转得圆柱,直角三角形绕一条直角边旋转得圆锥,半圆绕直径旋转得球。本页做两件事:把这些形体的顶点、棱、面数清,以及把它们画到纸上。

1 · 柱锥台球的构成

定义 1.1(棱柱与棱锥) 有两个面互相平行、其余各面都是四边形且每相邻两个四边形的公共边都互相平行的多面体叫做棱柱;有一个面是多边形、其余各面都是有一个公共顶点的三角形的多面体叫做棱锥。用平行于棱锥底面的平面截棱锥,底面与截面之间的部分叫做棱台。

旋转体那一组由「平面图形绕一条定直线旋转」得到:矩形绕一边旋转得圆柱,直角三角形绕一条直角边旋转得圆锥,直角梯形绕垂直于两底的腰旋转得圆台,半圆绕它的直径旋转得球。定义里的定直线是轴,与轴垂直的那些截面是圆。

画板要求把每个形体写成一张顶点表加一张面表,而圆柱、圆锥、圆台、球的侧面不是平面。本页一律按细分近似处理:侧面沿圆周切成 4848 段,球取 36×1836 \times 18 的经纬网格,于是它们与多面体走同一套画法与同一套遮挡判定。代价是圆周长被内接多边形的周长顶替,偏差有多大在 §4 里量。

图 1-1 · 八种空间几何体的直观图与展开图。可调方位角与俯仰角旋转视图,也可切到展开图对照各面的形状与总面积。

2 · 结构量与欧拉公式

定理 2.1(欧拉公式) 简单多面体的顶点数 VV、棱数 EE、面数 FF 满足 VE+F=2V - E + F = 2

实现里棱不单独列表:面表写好以后,棱由「同一个面上相邻的两个顶点」去重得到,每条棱天然带着它两侧的那两个面。这个选择不是为省几行,而是遮挡判定要的恰是「这条棱两侧是哪两个面」;手写的棱表与面表迟早对不上,而少一条棱不报错,只会让图上少一根线。

欧拉公式成了枚举的第一道检验,它不看坐标怎么写出来:正四棱台是 812+6=28 - 12 + 6 = 2,圆柱的 4848 段近似是 96144+50=296 - 144 + 50 = 2,球的 36×1836 \times 18 经纬网格是 6141260+648=2614 - 1260 + 648 = 2

例 2.2nn 棱柱有 2n2n 个顶点、3n3n 条棱、n+2n + 2 个面,2n3n+(n+2)=22n - 3n + (n + 2) = 2;正 nn 棱锥有 n+1n + 1 个顶点、2n2n 条棱、n+1n + 1 个面,(n+1)2n+(n+1)=2(n+1) - 2n + (n+1) = 2;正 nn 棱台的三个数与棱柱同。

另一条与坐标无关的检验是凸性:每个面的外法向都由体心指向体外,且没有任何顶点落在某个面的外侧。面的绕向因此不必手写,交给「与体心比一下」算出来即可。

3 · 直观图里的不可见棱

正交投影保平行、保中点、保比例,代价是丢掉深度感(论证见 shared/geom3d.ts 的头注)。丢掉的那部分靠两件事补:可旋转的视角,以及「看不见的棱画虚线」这条约定。

判据落在面上而不落在棱上。设视线方向为 f\vec{f}(指向远处),面的外法向为 n\vec{n},则 nf<0\vec{n} \cdot \vec{f} < 0 时这个面朝向观察者。一条棱两侧的面都背向观察者,它就被实体挡住,画虚线。凸体的正面在投影下互不重叠,所以填色不需要排前后。

nf\vec{n} \cdot \vec{f} 恰为零的面是刀刃:它侧向观察者,投影退化成一条线段。原以为把这一档归入背面更自然,实测否掉了:正对正方体的一个面时四个侧面都恰好侧向,归入背面则轮廓上那条棱两侧都是背面,图上会缺一条边线。归入正面不产生这种缺口,但另一个数字随之变化——一般视角下正方体的不可见棱恒为 33 条,而方位角 0°、俯仰角 0° 时它掉到 00 条,垂直俯视时同样是 00 条。后者在图上无损:此时背面那四条棱的投影与正面四条完全重合,画实线还是虚线都看不出分别。这条容差与这两个数字都写进了 core/solid.test.ts

4 · 侧面的展开图

沿棱剪开再铺平得到的平面图形是展开图。铺平的每一步都是刚体运动,故它是等距变换:每个面的边长与面积在图上与在体上一致,展开图的总面积就是表面积。实现按面的邻接关系做一遍宽度优先:每个面先在自己的平面内取一套等距的二维坐标,再搬到已铺好的邻面的公共棱上,两种搬法里取「落在公共棱另一侧」的那一个。

图上仍相接的棱是面的一棵生成树,共 F1F - 1 条,其余 EF+1E - F + 1 条被剪开。正六棱柱是 88 个面、1818 条棱,故图上相接 77 条、剪开 1111 条。

细分近似在展开图上露出马脚。4848 段的圆柱侧面铺成 4848 个窄矩形拼的长条,宽度是内接正 4848 边形的周长 2×48×rsin(π/48)=6.28095r2 \times 48 \times r \sin(\pi/48) = 6.28095 r,而真圆柱应是 2πr=6.28319r2\pi r = 6.28319 r,短了 0.0714%0.0714\%。这个比值恰是 1sin(π/48)/(π/48)1 - \sin(\pi/48)/(\pi/48),与半径高度无关,单测把两者对到小数第十二位。

球没有展开图。铺平要求每个内顶点处的面角之和恰为 360°360°,而球面的经纬网格上处处不足:48×2448 \times 24 的网格实测赤道顶点 359.0197°359.0197°、极点 359.2281°359.2281°。加密网格只能把亏损摊薄而不能摊掉,因为全体顶点的角亏之和是个拓扑量——对任何闭凸多面体都恰为 720°720°,这是 Gauss–Bonnet 定理的离散形式。正方体的八个顶点各亏 90°90°48×2448 \times 24 的球面网格是一千多个顶点各亏约 1°,两者合起来都是 720°720°

注 · 凸多面体是否总有互不重叠的展开图,这是 Dürer 猜想,至今未决[4]。本页的实现不检测重叠:柱、锥、台从底面出发铺不会重叠,而一般多面体没有这个保证。

5 · 参考文献

  1. Prism (geometry). Wikipedia. 棱柱的定义与分类。https://en.wikipedia.org/wiki/Prism_(geometry)
  2. Frustum. Wikipedia. 棱台与圆台,含体积公式的来历。https://en.wikipedia.org/wiki/Frustum
  3. Net (polyhedron). Wikipedia. 多面体的展开图。https://en.wikipedia.org/wiki/Net_(polyhedron)
  4. Dürer's conjecture. Wikipedia. 凸多面体是否总有无重叠展开图。https://en.wikipedia.org/wiki/D%C3%BCrer%27s_conjecture
  5. Angular defect. Wikipedia. 顶点处的角亏与它的总和。https://en.wikipedia.org/wiki/Angular_defect
  6. Hidden-line removal. Wikipedia. 不可见棱的判定。https://en.wikipedia.org/wiki/Hidden-line_removal