平行的判定与性质
平行的判定定理都是同一种交易:用有限条已知,换一个对无穷多条直线成立的结论。线面平行只需面内一条平行线,面面平行只需面内两条相交的平行线。本页给出两组判定与性质,并把前提失效时的实际情形算出来。
1 · 直线与平面的三种关系
直线与平面的关系由两个量定:方向向量与法向量的内积 ,以及直线上一点到平面的距离。
| 关系 | 点到平面的距离 | 公共点个数 | |
|---|---|---|---|
| 直线在平面内 | 无穷多 | ||
| 直线与平面平行 | 正 | ||
| 直线与平面相交 | 非零 | 与取点有关 |
前两行的内积都为零,靠距离区分。这个分工在判定定理里留下了痕迹:「平面外」这个前提管的正是第一行与第二行的分别,去掉它,结论就从「平行」滑到「在平面内」。
2 · 线面平行的判定与性质
定理 2.1(线面平行的判定) 若平面外的一条直线与此平面内的一条直线平行,则该直线与此平面平行。
三个前提缺一不可:直线在平面外,参照的直线在平面内,两条直线平行。第一个前提被去掉时并不是「结论错了」,而是关系换了一档:直线落进平面,公共点从零个变成无穷多个。判定此时给出的是「前提失效」而不是「不平行」——把一条平行于底面的直线连续下移到底面上,关系在触底的那一刻从「平行」变成「在平面内」。
定理 2.2(线面平行的性质) 若一条直线与一个平面平行,且过这条直线的某个平面与该平面相交,则这条直线与交线平行。
性质定理的用途是「把线面平行换回线线平行」:证明两条直线平行时,中间过一道平面往往比直接找平行四边形短。
3 · 面面平行的判定与性质
定理 3.1(面面平行的判定) 若一个平面内有两条相交直线分别平行于另一个平面,则这两个平面平行。
「相交」这个前提是全部要害。两条相交直线给出两个不共线的方向,它们张成的方向恰是平面的方向;两条平行直线只给出一个方向,剩下的自由度没有被约束。
具体的反例可以在正方体里摆出来:取顶面的棱 ,以及棱 与 上高度同为 的两点连成的线段 。两条直线都水平,故都平行于底面;两者同向,故互相平行。过它们的平面 与底面的夹角是 : 时是 , 时是 ,只有 (此时 退化成顶面)才是 。判定拒绝给出结论,而实际关系是相交。
注 · 时 与底面确实平行,可判定仍然拒绝——两条直线依旧只是平行而不相交。这一档在实现里最容易读错:核验函数返回「不成立」说的是「这条判定给不出结论」,不是「结论不成立」。两件事因此分两栏报出,一栏给判定,一栏给由坐标直接算出的实际关系。
定理 3.2(面面平行的性质) 若两个平行平面同时与第三个平面相交,则两条交线平行。
用一个竖直平面去截顶面与底面,交线的方向 转一圈,两条交线始终平行。这条性质与定理 2.2 是同一个模式:平行关系沿着「交线」这道桥从面传到线。
4 · 相交的两个平面画不出前后
画两个平面时遇到一个图形学上的老问题。填色要定先后,而按面的平均深度排序(画家算法)在两个面相交时失效:相交意味着一部分在前、一部分在后,一个排序键无论取什么值都覆盖不了。
正方体的两个对角截面 与 是这件事的极端例子。两者都过体心且互相对称,平均深度逐位相同(减掉旋转中心后都恰为 ),排序键根本分不出先后。实测在方位角 、俯仰角 、每单位 像素的视图里,两片投影的重叠区有 个像素,其中 的真实前后关系与「先画哪一个」的决定相反——无论先画哪一个,都错一半。
本系列因此不给平面排序,改用低不透明度填充加描边:两个平面在重叠处都看得见,顺序不再影响判读。代价是失去了「谁在前」的直观,补偿是可旋转的视角与读数里的距离一栏。这个取舍写在 core/lab.css 的头注里,那两个数字写在 core/view.test.ts 里。
5 · 参考文献
- Parallel (geometry). Wikipedia. 平行的定义,含线面与面面平行。https://en.wikipedia.org/wiki/Parallel_(geometry)
- Playfair's axiom. Wikipedia. 平行公理的等价表述。https://en.wikipedia.org/wiki/Playfair%27s_axiom
- Line–plane intersection. Wikipedia. 直线与平面求交及平行的退化情形。https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection
- Painter's algorithm. Wikipedia. 按深度排序绘制,以及相交面上的失效。https://en.wikipedia.org/wiki/Painter%27s_algorithm
- Z-buffering. Wikipedia. 逐像素定深度,画家算法的替代。https://en.wikipedia.org/wiki/Z-buffering