浏览量:72

2.4. 直线与平面

本篇文章禁止用于任何商业目的,版权申明、版本说明等见《前言》。

PDF文档和源码下载地址:https://github.com/twinklingstar20/Programmers_Computational_Geometry

2.4. 直线与平面

2.4.1. 直线与平面的夹角

问题描述:计算直线\(L(t) = Q + t\vec d,t \in \left( { - \infty , + \infty } \right)\)与平面\(\Gamma :\{ \vec n,d\} \)之间的夹角\(\theta \),其中,\(Q\)表示直线\(L\)上的点,\(\vec d\)表示直线的方向,\(\vec n\)是平面的法向量,\(d\)是一个常量。

2015-3-22 11-56-43

图2.11 直线\(L\)与平面\(\Gamma \)的夹角

如图2.11所示,设直线\(L\)与平面\(\Gamma \)不平行,即相交于一个点\(Y\)\(A\)是直线\(L\)上的一个点,但不在平面\(\Gamma \)上,经过点\(A\)作一条垂直于平面的直线,与平面相交于点\(A'\),连接\(Y,A'\),那么直线与经过\(Y,A'\)的直线的夹角\(\theta \)就是最终要计算的直线与平面的夹角。显然,经过三个点\(Y,A,A'\)可以确定一个平面\(\Gamma '\),易知,\(\Gamma '\)垂直于平面\(\Gamma \)且两平面相交于经过\(Y,A'\)的直线,可以计算出直线与平面法向量的夹角:

\[\alpha = \arccos \left| {\frac{{\vec n \cdot \vec d}}{{\left\| {\vec n} \right\| \cdot \left\| {\vec d} \right\|}}} \right| \tag{2.13}\]

又因为\(\alpha + \theta = \frac{\pi }{2}\),则有:

\[\theta = \frac{\pi }{2} - \arccos \left| {\frac{{\vec n \cdot \vec d}}{{\left\| {\vec n} \right\| \cdot \left\| {\vec d} \right\|}}} \right| \tag{2.14}\]

其中,夹角\(\theta \in \left[ {0,\frac{\pi }{2}} \right]\),如果直线的方向向量、平面的法向量经过归一化处理,则不再需要除法操作,及夹角计算公式可以表示为:

\[\theta = \frac{\pi }{2} - \arccos \left| {\vec n \cdot \vec d} \right| \tag{2.15}\]

2.4.2. 直线与平面的交

问题描述:判断直线\(L(t) = Q + t\vec d,t \in \left( { - \infty , + \infty } \right)\)与平面\(\Gamma :\{ \vec n,d\} \)是否相交,若相交,计算出交点\(Y\),若不相交,判断是平行关系还是重合关系,其中,\(Q\)表示直线\(L\)上的点,\(\vec d\)表示直线的方向,\(\vec n\)是平面的法向量,\(d\)是一个常量。

直线与平面只有三种关系:平行,重合,相交。如果\(\vec d \cdot \vec n \ne 0\),那么直线与平面一定相交于一点;否则,直线与平面可能是重合或者平行的关系。

首先,考虑相交的情况,把直线的参数方程代入平面的参数表示等式中,则有:

\begin{eqnarray*}
\vec n \cdot \left( {Q + \vec dt} \right) + d = 0
\tag{2.16}
\end{eqnarray*}

解出\(t\)值,得:

\begin{eqnarray*}
t = \frac{{ - (\vec n \cdot Q + d)}}{{\vec n \cdot \vec d}}
\tag{2.17}
\end{eqnarray*}

最后再把\(t\)值代入直线的参数方程中,就可以计算出交点\(Y\)

\[Y = Q - \frac{{\vec n \cdot Q + d}}{{\vec n \cdot \vec d}}\vec d \tag{2.18}\]

2015-3-22 11-56-58

图2.12 直线与平面的三种关系

如果\(\vec d \cdot \vec n = 0\),则直线与平面可能是重合或者平行的关系。如果是重合的关系,那么直线上的点\(Q\),一定在平面上,即一定有\(\vec n \cdot Q + d = 0\);否则,它们是平行的关系。直线与平面的三种情况,如图2.12所示。

算法伪码如下所示:

问题描述:判断直线\(L(t) = Q + t\vec d\)与平面\(\Gamma :\{ \vec n,d\} \)是否相交,若相交,计算出交点\(Y\),若不相交,判断是平行关系还是重合关系
return ({PARALLEL, OVERLAPPING, INTERSECTING})
1.    \(delta = \vec d \cdot \vec n\);
2.    \(dist = \vec n \cdot Q + d\);
3.    if \(delta = = 0\), then
4.           \(Y = Q - (dist/delta) \cdot \vec d\);
5.           return INTERSECTING;
6.    else
7.           if \(dist = = 0\), then
8.                  return OVERLAPPING;
9.           else
10.                 return PARALLEL;
11.          end if;
12.   end if;

如果是判断射线与平面的相交,因为射线的定义与直线的定义相似,只是射线要求\(t \ge 0\),所以算法伪码也是类似的,但是在算法第4步,计算出\(t = - dist/delta\)后,如果\(t \ge 0\),则射线与平面相交,否则直线与平面是分离的。

如果是判断线段与平面的相交,设线段的两个端点为\({Q_0},{Q_1}\),那么线段可以表示成类似直线的表示形式,即:

\[L(t) = {Q_0} + ({Q_1} - {Q_0})t \tag{2.19}\]

因此判断线段与平面的相交的算法伪码也是相似的,与射线不同的是,\(t\)的范围是\(\left[ {0,1} \right]\)

spacer

Leave a reply