浏览量:52

2.5. 平面与平面

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

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

2.5. 平面与平面

2.5.1. 平面与平面的夹角

问题描述:计算两个平面\({\Gamma _1}:\{ {\vec n_1},{d_1}\} \)\({\Gamma _2}:\{ {\vec n_2},{d_2}\} \)的夹角\(\theta \),其中,\({\vec n_1},{\vec n_2}\)分别是平面\({\Gamma _1},{\Gamma _2}\)的法向量,\({d_1},{d_2}\)分别是平面\({\Gamma _1},{\Gamma _2}\)的常量。

2015-3-22 12-23-56

图2.13 平面\({\Gamma _1}\)与平面\({\Gamma _2}\)的夹角

设两个平面不平行或者重合,如图2.13所示,直线\(L\)是两个平面的相交直线,\({P_1},{P_2}\)分别是平面\({\Gamma _1},{\Gamma _2}\)上的点,点\(Y\)在直线\(L\)上,且\(\overline {{P_1}Y} \bot L,\overline {{P_2}Y} \bot L\),则\(\angle {P_1}Y{P_2}\)就是两平面的夹角。又\(\overline {{P_1}Q} \bot {\Gamma _1},\overline {{P_2}Q} \bot {\Gamma _2}\),则四边形\({P_1}Y{P_2}Q\)在同一个平面上,而且\(\angle Q{P_1}Y = \angle Q{P_2}Y = \pi /2\),那么有:

\[\angle {P_1}Q{P_2} = \arccos \frac{{{{\vec n}_0} \cdot {{\vec n}_1}}}{{\left\| {{{\vec n}_0}} \right\| \cdot \left\| {{{\vec n}_1}} \right\|}} \tag{2.20}\]

那么平面\({\Gamma _1},{\Gamma _2}\)之间的夹角为:

\[\theta = \pi - \angle {P_1}Q{P_2} = \pi - \arccos \frac{{{{\vec n}_0} \cdot {{\vec n}_1}}}{{\left\| {{{\vec n}_0}} \right\| \cdot \left\| {{{\vec n}_1}} \right\|}} \tag{2.21}\]

如果两平面平行或重合,那么等式(2.21)计算出来的夹角为0或\(\pi \),显然,平面间的夹角计算与参数方程中的常量\({d_1},{d_2}\)无关。

2.5.2. 平面与平面的交

问题描述:判断两个平面\({\Gamma _1}:\{ {\vec n_1},{d_1}\} \)\({\Gamma _2}:\{ {\vec n_2},{d_2}\} \)是否相交,若相交,计算相交直线,否则,判断两个平面是平行还是重合关系,其中,\({\vec n_1},{\vec n_2}\)分别是平面\({\Gamma _1},{\Gamma _2}\)的法向量,\({d_1},{d_2}\)分别是平面\({\Gamma _1},{\Gamma _2}\)的常量。

如果两个平面相交,那么它们对应的法向量之间的夹角一定非零,否则,一定为零。即如果\(\left\| {{{\vec n}_1} \times {{\vec n}_2}} \right\| \ne 0\)或者\({\left( {{{\vec n}_1} \cdot {{\vec n}_2}} \right)^2} - {\left\| {{{\vec n}_1}} \right\|^2}{\left\| {{{\vec n}_2}} \right\|^2} \ne 0\),则两个平面相交;否则,两个平面平行或者重合。

2015-3-22 12-24-07

图2.14 两个平面\({\Gamma _1},{\Gamma _2}\)相交于一条直线\(L\)

先考虑两个平面相交的情况,设两个平面\({\Gamma _1},{\Gamma _2}\)相交于直线\(L(t) = Y + t\vec d\),如图2.14所示,由于直线\(L\)同时位于两个平面上,因此直线的方向向量同时与两平面的法向量\({\vec n_1},{\vec n_2}\)垂直,有:

\[\vec d = {\vec n_1} \times {\vec n_2} \tag{2.22}\]

向量\({\vec n_1},{\vec n_2}\)和任意一个点\(P\),可以确定一个平面\(\Gamma \),可以令\(P = (0,0)\),显然,平面\(\Gamma \)与平面\({\Gamma _1},{\Gamma _2}\)相交,三个平面相交于点\(Y\)\(Y\)是直线 上的一个点,点\(Y\)可以表示为:

\[Y = a{\vec n_1} + b{\vec n_2} \tag{2.23}\]

其中,\(a,b \in \left( { - \infty , + \infty } \right)\),把它代入两个平面的表示等式中,得到:

\[\left\{ \begin{array}{l}a{{\vec n}_1} \cdot {{\vec n}_1} + b{{\vec n}_2} \cdot {{\vec n}_1} + {d_1} = 0\\a{{\vec n}_1} \cdot {{\vec n}_2} + b{{\vec n}_2} \cdot {{\vec n}_2} + {d_2} = 0\end{array} \right.\]

解方程组,得到:

\[\left\{ \begin{array}{l}a = \frac{{{d_1}{{\left\| {{{\vec n}_2}} \right\|}^2} - {d_2}{{\vec n}_1} \cdot {{\vec n}_2}}}{{{{\left( {{{\vec n}_1} \cdot {{\vec n}_2}} \right)}^2} - {{\left\| {{{\vec n}_1}} \right\|}^2}{{\left\| {{{\vec n}_2}} \right\|}^2}}}\\b = \frac{{{d_2}{{\left\| {{{\vec n}_1}} \right\|}^2} - {d_1}{{\vec n}_1} \cdot {{\vec n}_2}}}{{{{\left( {{{\vec n}_1} \cdot {{\vec n}_2}} \right)}^2} - {{\left\| {{{\vec n}_1}} \right\|}^2}{{\left\| {{{\vec n}_2}} \right\|}^2}}}\end{array} \right. \tag{2.24}\]

把解\((a,b)\)代入等式(2.23),得到\(Y\)坐标,再根据(2.22)得到直线的方向向量,就可以得得到直线\(L\)的参数表示。

现在考虑两个平面不相交的情况,即\(\left\| {{{\vec n}_1} \times {{\vec n}_2}} \right\| = 0\)或者\({\left( {{{\vec n}_1} \cdot {{\vec n}_2}} \right)^2} - {\left\| {{{\vec n}_1}} \right\|^2}{\left\| {{{\vec n}_2}} \right\|^2} = 0\)。如果两个平面是重合的,则有:

\[\frac{{{d_1}}}{{\left\| {{{\vec n}_1}} \right\|}} = \frac{{{d_2}}}{{\left\| {{{\vec n}_2}} \right\|}}\]

为了避免除法和求根运算,可以把判定等式变型为:

\[{d_1}^2 \cdot {\left\| {{{\vec n}_2}} \right\|^2} = {d_2}^2 \cdot {\left\| {{{\vec n}_1}} \right\|^2} \tag{2.25}\]

如果等式(2.25)不成立,说明两个平面是平行的关系。

算法伪码如下所示:

判断两个平面\({\Gamma _1}:\{ {\vec n_1},{d_1}\} \)\({\Gamma _2}:\{ {\vec n_2},{d_2}\} \)是否相交,若相交,计算相交直线,否则,判断两个平面是平行还是重合关系,其中,\({\vec n_1},{\vec n_2}\)分别是平面\({\Gamma _1},{\Gamma _2}\)的法向量,\({d_1},{d_2}\)分别是平面\({\Gamma _1},{\Gamma _2}\)的常量。
return ({PARALLEL, OVERLAPPING, INTERSECTING })
1.    \(x = {\left\| {{{\vec n}_1}} \right\|^2},y = {\left\| {{{\vec n}_2}} \right\|^2},z = {\vec n_1} \cdot {\vec n_2}\);
2.    \(den = {z^2} - x * y\);
3.    if \(den = = 0\), then
4.           \(delta = {d_1}^2 * y - {d_2}^2 * x\);
5.           if \(delta = = 0\), then
6.                  return OVERLAPPING;
7.           else
8.                  return PARALLEL;
9.           end if;
10.   else
11.          \(c = {\vec n_1} \cdot {\vec n_2}\);
12.          \(a = \left( {{d_1} * y - {d_2} * z} \right)/den\);
13.          \(b = \left( {{d_2} * x - {d_1} * z} \right)/den\);
14.          \(Y = a{\vec n_1} + b{\vec n_2}\);
15.          \(\vec d = {\vec n_1} \times {\vec n_2}\);
16.          两个平面的相交直线表示为\(L(t) = Y + t\vec d\);
17.          return INTERSECTING;
18.   end if;

spacer

Leave a reply