
OI Wiki 三维计算几何指南空间向量、平面方程、夹角距离与立体几何定理实战【免费下载链接】OI-wiki:star2: Wiki of OI / ICPC for everyone. 某大型游戏线上攻略内含炫酷算术魔法项目地址: https://gitcode.com/GitHub_Trending/oi/OI-wiki三维计算几何是信息学竞赛OI / ICPC中从平面走向立体的关键一步空间中的点、向量、直线与平面全部可以沿用二维问题的“坐标 向量运算”方法论来解决。本文以 OI Wiki 的docs/geometry/3d.md为主体完整梳理三维空间的基本概念平面点法式与一般式、直线与平面之间的夹角判定、点到平面的距离、直线与平面的交点以及三正弦定理、三余弦定理两大立体几何工具并结合仓库内的 三维凸包模板代码 与 三维凸包算法讲解 给出源码级印证。读完本文你将掌握用空间向量求解三维几何问题的完整公式体系并能在代码中正确实现法向量、叉积与可见性判定等核心操作。前置基础从二维几何到三维空间三维几何的很多概念与二维几何是相通的我们可以用与解决二维几何问题相同的方法来解决三维几何问题仍然把图形放入坐标系用坐标表示点与向量用向量运算刻画位置关系。二维与三维的区别在于二维平面使用直角坐标系下的有序数对 $(x,y)$ 表示点三维空间则使用空间直角坐标系下的三元组 $(x,y,z)$二维向量的线性运算加减、数乘在三维中逐分量成立模长公式扩展为 $|\boldsymbol v|\sqrt{x^2y^2z^2}$二维中的“叉积”给出一个标量有向面积三维中的叉积则给出一个同时垂直于两个输入向量的新向量这正是法向量的来源。仓库的《向量》一文在“在三维空间中的拓展立体几何/空间向量”一节中明确指出平面部分所述的所有内容在空间中均成立并且补充了三条三维特有的结论空间向量基本定理如果三个向量 $\boldsymbol{e_1},\boldsymbol{e_2},\boldsymbol{e_3}$ 不共面那么空间中任意向量 $\boldsymbol p$ 都可以唯一表示为 $\mathbf px\boldsymbol{e_1}y\boldsymbol{e_2}z\boldsymbol{e_3}$据此可以用三个相互垂直的基底建立空间直角坐标系共面向量基本定理存在两个不共线的向量 $\boldsymbol{x},\boldsymbol{y}$ 时向量 $\boldsymbol p$ 与它们共面的充要条件是存在唯一实数对 $(a,b)$ 使得 $\boldsymbol{p}a\boldsymbol{x}b\boldsymbol{y}$方向向量与法向量空间直线的位置由它经过的一点及其一个方向向量完全确定已知垂直于某直线的平面一般方程 $axbyczd0$ 时$(a,b,c)$ 既是该平面的一个法向量也是这条直线的一个方向向量。这些结论是后续所有公式推导的基石建议先阅读向量基础再进入本文。基本概念点、向量、直线与平面点、向量、直线这些概念和二维几何是相似的这里不再展开。三维空间中真正的新对象是平面。平面点法式表示我们可以用平面上的一点 $P_0(x_0,y_0,z_0)$ 和该平面的法向量即垂直于该平面的向量$\boldsymbol{n}$ 来表示一个平面。因为 $\boldsymbol{n}$ 垂直于平面所以 $\boldsymbol{n}$ 垂直于该平面内的所有直线。换句话说设 $\boldsymbol{n}(A,B,C)$则该平面上的点 $P(x,y,z)$ 都满足$$ \boldsymbol{n} \cdot \overrightarrow{PP_0} 0 $$根据向量点积的定义上式等价于$$ A(x-x_0)B(y-y_0)C(z-z_0)0 $$整理后得到$$ AxByCz-(Ax_0By_0Cz_0)0 $$令 $D-(Ax_0By_0Cz_0)$则上式变成$$ AxByCzD0 $$我们称这个式子为平面的一般式。记忆要点平面一般式 $AxByCzD0$ 的系数 $(A,B,C)$ 恰好就是该平面的一个法向量。这一性质在竞赛中极为常用——给定三个不共线点先求两条边向量的叉积得到法向量再代入一个点解出 $D$即可一步写出平面方程。从源码结构看三维凸包代码正是把“法向量由叉积给出”落实到了struct Node中operator*重载了三维叉积operator重载了点积struct Face::Normal()通过两条边向量做叉积返回面的法向量Node operator*(Node A) const { return {y * A.z - z * A.y, z * A.x - x * A.z, x * A.y - y * A.x}; } double operator(Node A) const { return x * A.x y * A.y z * A.z; } Node Normal() { return (A[v[1]] - A[v[0]]) * (A[v[2]] - A[v[0]]); }基本操作直线、平面之间的夹角运用空间向量的知识空间中直线、平面之间的夹角可以很快求出。下面按“先定义、再公式”的顺序逐一展开。三个基本角度定义异面直线所成的角对于两条异面直线 $a$、$b$过空间中一点 $P$ 作 $a \parallel a$$b \parallel b$则 $a$ 与 $b$ 所成的锐角或直角被称为 $a$ 和 $b$ 两条异面直线所成的角。直线与平面所成的角对于直线 $a$ 和平面 $\alpha$若 $a$ 与 $\alpha$ 相交于 $A$过 $a$ 上一点 $P$ 引平面 $\alpha$ 的垂线交 $\alpha$ 于 $O$则 $a$ 与 $PO$ 所成角的余角被称为直线与平面所成的角。特别地若 $a \parallel \alpha$ 或 $a \subset \alpha$则它们之间的夹角为 $0^\circ$。二面角对于两个平面 $\alpha$、$\beta$它们的夹角被定义为与两条平面的交线 $l$ 垂直的两条直线 $a,b$其中 $a \subset \alpha$$b \subset \beta$所成的角。这三个定义把立体几何中的角度问题统一归结为向量夹角问题从而可以用坐标计算。两直线夹角定义与关系充要条件关键命题两直线的方向向量的夹角叫做两直线的夹角。有了这个命题就可以得出以下结论已知两条直线 $l_1, l_2$它们的方向向量分别是 $s_1 (m_1, n_1, p_1)$$s_2 (m_2, n_2, p_2)$设 $\varphi$ 为两直线夹角则$$ \cos \varphi \dfrac{\left | m_1m_2n_1n_2p_1p_2 \right |}{\sqrt{m_1^2n_1^2p_1^2}\sqrt{m_2^2n_2^2p_2^2}} $$分子取绝对值是因为异面直线所成的角取锐角或直角$\varphi \in [0, \frac{\pi}{2}]$而两个方向向量本身的夹角可能在 $(\frac{\pi}{2}, \pi]$ 区间取绝对值后才能映射回锐角。由上式可以直接得到两条充要条件$l_1 \perp l_2 \iff m_1m_2 n_1n_2 p_1p_2 0$点积为零$l_1 \parallel l_2 \iff \dfrac{m_1}{m_2} \dfrac{n_1}{n_2} \dfrac{p_1}{p_2}$对应坐标成比例三维向量与平面的夹角当直线与平面不垂直时直线和它在平面上的投影直线的夹角 $\varphi$$\varphi \in [0, \frac{\pi}{2}]$称为直线与平面的夹角。设直线向量 $s(m, n, p)$平面法线向量 $f(a, b, c)$那么以下命题成立角度的正弦值$$ \sin\varphi \dfrac{\left | am bn cp \right |}{\sqrt{a^2b^2c^2}\sqrt{m^2n^2p^2}} $$注意这里是正弦而非余弦——因为直线与平面所成的角定义为“直线与其投影的夹角”它与“直线方向向量与法向量夹角”互为余角所以对直线方向向量与法向量夹角的余弦取余角即得正弦。直线与平面平行 $\iff ambncp 0$方向向量与法向量垂直即点积为零直线与平面垂直 $\iff \dfrac{a}{m} \dfrac{b}{n} \dfrac{c}{p}$方向向量与法向量平行即对应坐标成比例点到平面的距离设平面 $\Pi: AxByCzD0$法向量 $\boldsymbol n(A,B,C)$平面外一点 $P_1(x_1,y_1,z_1)$。在平面上任取一点 $P_0(x_0,y_0,z_0)$则点到平面的距离等于向量 $\overrightarrow{P_0P_1}$ 在法向量方向上的投影长度$$ d \left| \overrightarrow{P_0P_1} \cdot \frac{\boldsymbol n}{|\boldsymbol n|} \right| \frac{|A(x_1-x_0)B(y_1-y_0)C(z_1-z_0)|}{\sqrt{A^2B^2C^2}} $$由于 $P_0$ 在平面上满足 $Ax_0By_0Cz_0-D$代入得$$ d \frac{|Ax_1By_1Cz_1D|}{\sqrt{A^2B^2C^2}} $$即把点的坐标代入平面方程左边再取绝对值除以法向量模长。该公式与二维中“点到直线距离 $d\frac{|Ax_0By_0Cz_0|}{\sqrt{A^2B^2C^2}}$”的形式完全一致是平面一般式最直接的应用。直线与平面的交点直接联立直线方程和平面方程即可。设直线过点 $P_0(x_0,y_0,z_0)$方向向量为 $\boldsymbol s(m,n,p)$则直线上的点可以写成参数形式$$ \begin{cases} x x_0 tm\ y y_0 tn\ z z_0 tp \end{cases} $$代入平面一般式 $AxByCzD0$$$ A(x_0tm)B(y_0tn)C(z_0tp)D0 $$解得$$ t -\frac{Ax_0By_0Cz_0D}{AmBnCp} $$当 $AmBnCp \neq 0$ 时存在唯一交点把 $t$ 代回参数方程即可得到交点坐标当 $AmBnCp 0$ 时直线方向向量与平面法向量垂直即直线与平面平行此时无交点或直线在平面内需进一步验证。立体几何定理三正弦定理与三余弦定理除向量计算外立体几何中还有两个在竞赛中高频出现的经典定理它们把“二面角、线面角、线线角”之间的关系用简洁的正弦、余弦乘积式表达出来可用于绕过繁琐的坐标运算快速解题。三正弦定理设二面角 $MABN$ 的度数为 $\alpha$在平面 $M$ 上有一条射线 $AC$它和棱 $AB$ 所成角为 $\beta$和平面 $N$ 所成的角为 $\gamma$则$$ \sin\gamma \sin\alpha\cdot\sin\beta $$应用场景当题目给出“二面角 平面内射线与棱的夹角”时可一步求出该射线与另一平面所成的角常用于空间几何计算与最值问题中。记忆方式小角的正弦 二面角正弦 × 平面内夹角正弦。三余弦定理设 $O$ 为平面上一点过平面外一点 $B$ 的直线 $BO$ 在面上的射影为 $AO$$OC$ 为面上的一条直线那么 $\angle COB$、$\angle AOC$、$\angle AOB$ 三角的余弦关系为$$ \cos\angle BOC\cos\angle AOB\cdot\cos\angle AOC $$$\angle AOC$、$\angle AOB$ 只能是锐角应用场景三余弦定理又被称为“最小角定理”的定量版本它揭示了一条斜线与平面内任意直线夹角的余弦等于该斜线与其射影夹角的余弦乘以射影与该直线夹角的余弦。常用于求解“斜线—射影—平面内直线”构成的直角三角形链问题在求二面角、判断两条异面直线夹角时都能显著减少运算量。记忆方式大角的余弦 两个小角余弦之积。源码实战三维凸包中的空间向量运算三维几何的知识在竞赛中最典型的应用之一是三维凸包。仓库在《凸包》文档末尾的“三维凸包”一节给出了完整算法与模板代码其核心思路与本文的向量公式一一对应。算法过程三维凸包采用增量式Incremental构造过程如下微小扰动首先对输入点作微小扰动避免出现四点共面的情况四点共面会导致法向量为零向量后续可见性判断失效新增一点对于一个已知凸包新增一个点 $P$将 $P$ 视作一个点光源向凸包做射线。光线的可见面和不可见面一定是由若干条棱隔开的更新面集将光的可见面删去并新增由其分割棱与 $P$ 构成的平面重复此过程直到处理完所有点。由Pick 定理、欧拉公式在凸多面体中顶点数 $V$、边数 $E$ 及面数 $F$ 满足 $V-EF2$和圆的反演可知该算法的时间复杂度为 $O(n^2)$。代码中的向量原语docs/geometry/code/3d/3d_1.cpp中处处体现了本文的空间向量知识struct Node存储三维点/向量 $(x,y,z)$len()计算模长 $\sqrt{x^2y^2z^2}$operator*是三维叉积结果向量垂直于两输入向量operator是点积struct Face用三个顶点下标表示一个三角面片Normal()返回法向量area()通过 $|\text{叉积}|/2$ 计算三角形面积double area() { return Normal().len() / 2.0; }这正是利用了“向量叉积的模等于两向量张成平行四边形面积”这一几何意义与本文“法向量垂直于平面”的表示完全一致see(Face a, Node b)判断点 $b$ 是否在面 $a$ 的可见侧把向量 $(b - A[a.v[0]])$ 与面法向量做点积点积大于 $0$ 说明 $b$ 位于法向量一侧可见这正是本文“直线与平面夹角”一节中 $\sin\varphi$ 分子 $|ambncp|$ 的符号判定应用int see(Face a, Node b) { return ((b - A[a.v[0]]) a.Normal()) 0; }shake()对每个点添加 $[-\frac{\epsilon}{2}, \frac{\epsilon}{2}]$ 量级的随机扰动$\epsilon 10^{-9}$对应算法第一步的“微小扰动”避免四点共面主流程读入 $n$ 个点并扰动后调用Convex_3D()维护当前凸包的所有面用vis[x][y]标记棱的可视性最后累加所有面的面积保留 3 位小数输出。由于三维凸包的可见性判定、法向量计算完全建立在本文的空间向量公式之上吃透本文的平面表示与夹角理论是理解该模板代码以及用它求解洛谷 P4724【模板】三维凸包等题目的直接前提。总结三维计算几何的核心方法论是把立体几何问题“坐标化、向量化”几何对象表示方法关键公式平面一点 法向量 / 一般式$AxByCzD0$$(A,B,C)$ 为法向量两直线夹角方向向量$\cos\varphi\dfrac{m_1m_2n_1n_2p_1p_2}{\sqrt{m_1^2n_1^2p_1^2}\sqrt{m_2^2n_2^2p_2^2}}$直线与平面夹角方向向量 法向量$\sin\varphi\dfrac{ambncp}{\sqrt{a^2b^2c^2}\sqrt{m^2n^2p^2}}$点到平面距离一般式代入$d\dfrac{Ax_0By_0Cz_0D}{\sqrt{A^2B^2C^2}}$直线与平面交点参数方程联立$t-\dfrac{Ax_0By_0Cz_0D}{AmBnCp}$三正弦定理 / 三余弦定理角间关系$\sin\gamma\sin\alpha\sin\beta$$\cos\angle BOC\cos\angle AOB\cos\angle AOC$在实现层面可以沿用二维计算几何一文“代码编写注意事项”中的经验三维几何同样涉及大量double浮点运算需要注意精度问题如使用 $\epsilon10^{-9}$ 级别的容差与常数因子对时间的影响。同时注意叉积、点积在三维下的新语义——叉积返回法向量点积用于判断方向关系——这是从二维迈向三维时最需要建立的习惯。延伸阅读二维几何基础三维几何的前置章节快速排斥实验、跨立实验、多边形面积等思想可推广到空间向量含三维拓展空间向量基本定理、方向向量、法向量的严格定义与坐标求法凸包含三维凸包三维凸包的增量构造算法与 $O(n^2)$ 复杂度分析三维凸包模板代码可直接复用的法向量、叉积、可见性判定与面面积累加实现极坐标与坐标变换三维空间中的球坐标系可用于空间旋转类问题。【免费下载链接】OI-wiki:star2: Wiki of OI / ICPC for everyone. 某大型游戏线上攻略内含炫酷算术魔法项目地址: https://gitcode.com/GitHub_Trending/oi/OI-wiki创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考