线面交点

在解析几何中, 一条直线与一个平面的交点可能是空集、一个点或一条直线。在计算机图形学、运动规划和碰撞检测中，经常需要分析相交类型，以及计算出点坐标或线的方程。 空间中一个平面可以表示为点 p {\displaystyle \mathbf {p} } 的集合 ( p − p 0 ) ⋅ n = 0 {\displaystyle (\mathbf {p} -\mathbf {p_{0}} )\cdot \mathbf {n} =0} 其中 n {\displaystyle \mathbf {n} } 是该平面的法线， p 0 {\displaystyle \mathbf {p_{0}} } 是平面上任意一点。（ a ⋅ b {\displaystyle \mathbf {a} \cdot \mathbf {b} } 表示向量 a {\displaystyle \mathbf {a} } 和 b {\displaystyle \mathbf {b} } 的数量积） 而直线可表示为 p = d l + l 0 d ∈ R {\displaystyle \mathbf {p} =d\mathbf {l} +\mathbf {l_{0}} \quad d\in \mathbb {R} } 其中 l {\displaystyle \mathbf {l} } 是该直线的方向向量， l 0 {\displaystyle \mathbf {l_{0}} } 是直线上任意一点， d {\displaystyle d} 是实数范围内的标量。将直线方程代入平面方程得 ( d l + l 0 − p 0 ) ⋅ n = 0 {\displaystyle (d\mathbf {l} +\mathbf {l_{0}} -\mathbf {p_{0}} )\cdot \mathbf {n} =0} 展开得 d l ⋅ n + ( l 0 − p 0 ) ⋅ n = 0 {\displaystyle d\mathbf {l} \cdot \mathbf {n} +(\mathbf {l_{0}} -\mathbf {p_{0}} )\cdot \mathbf {n} =0} 解得 d {\displaystyle d} d = ( p 0 − l 0 ) ⋅ n l ⋅ n . {\displaystyle d={(\mathbf {p_{0}} -\mathbf {l_{0}} )\cdot \mathbf {n} \over \mathbf {l} \cdot \mathbf {n} }.} 若 l ⋅ n = 0 {\displaystyle \mathbf {l} \cdot \mathbf {n} =0} ，则直线与平面平行。此时，如果( p 0 − l 0 ) ⋅ n = 0 {\displaystyle \mathbf {p_{0}} -\mathbf {l_{0}} )\cdot \mathbf {n} =0} ，则该直线在平面内，即直线上所有的点都是交点。否则，直线与平面没有交点。 若 l ⋅ n ≠ 0 {\displaystyle \mathbf {l} \cdot \mathbf {n} \neq 0} ，则直线与平面有且只有一个交点。解得 d {\displaystyle d} ，则交点的坐标为 d l + l 0 {\displaystyle d\mathbf {l} +\mathbf {l_{0}} } . 空间中一条直线可以用一个点和一个给定的方向来描述。则一条直线可以表示为如下点的集合 l a + ( l b − l a ) t , t ∈ R {\displaystyle \mathbf {l} _{a}+(\mathbf {l} _{b}-\mathbf {l} _{a})t,\quad t\in \mathbb {R} } 其中 l a = ( x a , y a , z a ) {\displaystyle \mathbf {l} _{a}=(x_{a},y_{a},z_{a})} 和 l b = ( x b , y b , z b ) {\displaystyle \mathbf {l} _{b}=(x_{b},y_{b},z_{b})} 是直线上两个不同的点。 相似地，一个平面可以表示为如下点的集合 p 0 + ( p 1 − p 0 ) u + ( p 2 − p 0 ) v , u , v ∈ R {\displaystyle \mathbf {p} _{0}+(\mathbf {p} _{1}-\mathbf {p} _{0})u+(\mathbf {p} _{2}-\mathbf {p} _{0})v,\quad u,v\in \mathbb {R} } 其中 p k = ( x k , y k , z k ) {\displaystyle \mathbf {p} _{k}=(x_{k},y_{k},z_{k})} ， k = 0 , 1 , 2 {\displaystyle k=0,1,2} 是平面上不共线的三个点。 直线和平面的交点可以表示为将直线上的点代入平面方程内，则参数方程如下： l a + ( l b − l a ) t = p 0 + ( p 1 − p 0 ) u + ( p 2 − p 0 ) v {\displaystyle \mathbf {l} _{a}+(\mathbf {l} _{b}-\mathbf {l} _{a})t=\mathbf {p} _{0}+(\mathbf {p} _{1}-\mathbf {p} _{0})u+(\mathbf {p} _{2}-\mathbf {p} _{0})v} 即 l a − p 0 = ( l a − l b ) t + ( p 1 − p 0 ) u + ( p 2 − p 0 ) v , {\displaystyle \mathbf {l} _{a}-\mathbf {p} _{0}=(\mathbf {l} _{a}-\mathbf {l} _{b})t+(\mathbf {p} _{1}-\mathbf {p} _{0})u+(\mathbf {p} _{2}-\mathbf {p} _{0})v,} 用矩阵表示为 [ x a − x 0 y a − y 0 z a − z 0 ] = [ x a − x b x 1 − x 0 x 2 − x 0 y a − y b y 1 − y 0 y 2 − y 0 z a − z b z 1 − z 0 z 2 − z 0 ] [ t u v ] {\displaystyle {\begin{bmatrix}x_{a}-x_{0}\\y_{a}-y_{0}\\z_{a}-z_{0}\end{bmatrix}}={\begin{bmatrix}x_{a}-x_{b}&x_{1}-x_{0}&x_{2}-x_{0}\\y_{a}-y_{b}&y_{1}-y_{0}&y_{2}-y_{0}\\z_{a}-z_{b}&z_{1}-z_{0}&z_{2}-z_{0}\end{bmatrix}}{\begin{bmatrix}t\\u\\v\end{bmatrix}}} 可得点的坐标为 l a + ( l b − l a ) t {\displaystyle \mathbf {l} _{a}+(\mathbf {l} _{b}-\mathbf {l} _{a})t} 若直线与平面平行或在平面内，那么向量 l b − l a {\displaystyle \mathbf {l} _{b}-\mathbf {l} _{a}} ， p 1 − p 0 {\displaystyle \mathbf {p} _{1}-\mathbf {p} _{0}} 及 p 2 − p 0 {\displaystyle \mathbf {p} _{2}-\mathbf {p} _{0}} 是线性独立的，且矩阵为奇异矩阵。 若满足 t ∈ [ 0 , 1 ] {\displaystyle t\in [0,1]} ，则交点在直线上 l a {\displaystyle \mathbf {l} _{a}} 与 l b {\displaystyle \mathbf {l} _{b}} 之间。 若满足 u , v ∈ [ 0 , 1 ] , ( u + v ) ≤ 1 , {\displaystyle u,v\in [0,1],\;\;\;(u+v)\leq 1,} 则交点位于平面上 p 0 {\displaystyle \mathbf {p} _{0}} ， p 1 {\displaystyle \mathbf {p} _{1}} 及 p 2 {\displaystyle \mathbf {p} _{2}} 所构成的三角形中。 该问题可用矩阵的形式表示解答： [ t u v ] = [ x a − x b x 1 − x 0 x 2 − x 0 y a − y b y 1 − y 0 y 2 − y 0 z a − z b z 1 − z 0 z 2 − z 0 ] − 1 [ x a − x 0 y a − y 0 z a − z 0 ] . {\displaystyle {\begin{bmatrix}t\\u\\v\end{bmatrix}}={\begin{bmatrix}x_{a}-x_{b}&x_{1}-x_{0}&x_{2}-x_{0}\\y_{a}-y_{b}&y_{1}-y_{0}&y_{2}-y_{0}\\z_{a}-z_{b}&z_{1}-z_{0}&z_{2}-z_{0}\end{bmatrix}}^{-1}{\begin{bmatrix}x_{a}-x_{0}\\y_{a}-y_{0}\\z_{a}-z_{0}\end{bmatrix}}.} 在计算机图形学中的光线追踪算法中，一个面可以被表示为几个平面的集合。一个面的图像可以用光线与每个面的交点表达。在基于视觉的三维重建中（计算机视觉的一个子场），深度通常是由“三角测量法”测算的。 Intersections of Lines, Segments and Planes (2D & 3D) from GeomAlgorithms.com （页面存档备份，存于互联网档案馆）