线性代数部分
本节续着《线性变换(1)》继续往后写,下面笔者将从代数的角度证明:通过"矩阵+向量"系列变化能够将一个三角形变为任意的三角形,考虑下方两个任意三角形:

我们要把蓝色三角形变化为红色三角形,容易得出变化流程为:

要投入的点组是:1.(x3,y3)−−>(x5,y5),2.(x1,y1)−−>(x4,y4)1.(x_3, y_3)-->(x_5, y_5), 2.(x_1, y_1)-->(x_4, y_4)1.(x3,y3)−−>(x5,y5),2.(x1,y1)−−>(x4,y4),变化方程为:
[a11a12a21a22]([blue]+[−x2−y2])+[x6y6]=[red]
\left[
\begin{array}{c}
a_{11}&a_{12}\\
a_{21}&a_{22}
\end{array}
\right]
(
\left[
\begin{array}{c}
blue
\end{array}
\right]
+
\left[
\begin{array}{c}
-x_2\\
-y_2
\end{array}
\right]
)
+
\left[
\begin{array}{c}
x_6\\
y_6
\end{array}
\right]
=
\left[
\begin{array}{c}
red
\end{array}
\right]
[a11a21a12a22]([blue]+[−x2−y2])+[x6y6]=[red]
投入点组1,得出变化矩阵:
[x5−x6x3−x2−a12y3−y2x3−x2a12y5−y6x3−x2−a22y3−y2x3−x2a22]
\left[
\begin{array}{c}
\frac{x_5-x_6}{x_3-x_2}-a_{12}\frac{y_3-y_2}{x_3-x_2}&a_{12}\\
\frac{y_5-y_6}{x_3-x_2}-a_{22}\frac{y_3-y_2}{x_3-x_2}&a_{22}
\end{array}
\right]
[x3−x2x5−x6−a12x3−x2y3−y2x3−x2y5−y6−a22x3−x2y3−y2a12a22]
投入点组2,筛选出变化矩阵:
[x5−x6x3−x2−a12y3−y2x3−x2a12y5−y6x3−x2−a22y3−y2x3−x2a22]
\left[
\begin{array}{c}
\frac{x_5-x_6}{x_3-x_2}-a_{12}\frac{y_3-y_2}{x_3-x_2}&a_{12}\\
\frac{y_5-y_6}{x_3-x_2}-a_{22}\frac{y_3-y_2}{x_3-x_2}&a_{22}
\end{array}
\right]
[x3−x2x5−x6−a12x3−x2y3−y2x3−x2y5−y6−a22x3−x2y3−y2a12a22]
最终的结果如下:
{a12=(x4−x6)(x3−x2)−(x1−x2)(x5−x6)(y1−y2)(x3−x2)−(x1−x2)(y3−y2)a22=(y4−y6)(x3−x2)−(x1−x2)(y5−y6)(y1−y2)(x3−x2)−(y3−y2)(y1−y2)
\begin{cases}
a_{12} = \frac{(x_4-x_6)(x_3-x_2)-(x_1-x_2)(x_5-x_6)}{(y_1-y_2)(x_3-x_2)-(x_1-x_2)(y_3-y_2)}\\
a_{22} = \frac{(y_4-y_6)(x_3-x_2)-(x_1-x_2)(y_5-y_6)}{(y_1-y_2)(x_3-x_2)-(y_3-y_2)(y_1-y_2)}
\end{cases}
{a12=(y1−y2)(x3−x2)−(x1−x2)(y3−y2)(x4−x6)(x3−x2)−(x1−x2)(x5−x6)a22=(y1−y2)(x3−x2)−(y3−y2)(y1−y2)(y4−y6)(x3−x2)−(x1−x2)(y5−y6)
a11,a12a_{11},a_{12}a11,a12也可以表示出来(式子太长,笔者就不写了),注意到分母可能为零,但是只需要利用平移就可以让分母不为零了,因此容易得出通过"矩阵+向量"系列变化能够将一个三角形变为任意的三角形
1.1伪矩阵
在上一节中我们发现平面三角形具备成为任意平面几何元素几何单位的潜力,而且使用"矩阵+向量"系列变化能够将一个三角形变为任意的三角形,再加上伪向量是点集的本质,我们得到启发,可以将一个复杂的几何图形切割成多个三角形,然后打包成多个伪向量,最终再把伪向量打包变为一个伪矩阵,因此笔者给出伪矩阵的定义就是:多个相同维度伪向量的集合,其形式为:[[伪向量1][伪向量2]…[伪向量n]],考虑下方几何变化:

我们通过简单的蓝色长方形伪向量得出复杂的红色四边形伪向量,在上一节中已经得出单独使用蓝色长方形伪向量进行变化无法得出不规则的红色四边形,原因在于"矩阵+向量"系列变化无法改变几何之间的线性关系,也就是说原本平行的线段在变化后依旧会保持平行,原本不平行的线段在变化后会保持不平行,但是利用三角形三边永不平行的特性,让其成为几何单位,或许就能够实现上方的变化,即:

此时使用单个整体伪向量就无法表示分割成两部分的长方形了,自然而然的,我们需要用到伪矩阵来进行表示,首先我们得求出蓝色长方形中两个三角形的伪向量,此时可以利用上一节的知识先求出一个简单三角形的伪向量,再使用"矩阵+向量"系列变化变过去,首先最简单的三角形伪向量自然就是:

由于向量数乘缩放比例参考点是原点,那么我们就构建正好以原点为缩放参考点的三角形,容易得出上方三角形伪向量为:[2ut2u−2ut]\bigl[\begin{smallmatrix} 2ut \\ 2u-2ut \end{smallmatrix}\bigr][2ut2u−2ut],其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1,然后开始变化,先变这个:

此时由于原三角形有一点原本就位于原点,因此省去了初始的平移,直接就可以进行变化,变化方程为:
[a11a12a21a22][blue]+[−30]=[red]
\left[
\begin{array}{c}
a_{11}&a_{12}\\
a_{21}&a_{22}
\end{array}
\right]
\left[
\begin{array}{c}
blue
\end{array}
\right]
+
\left[
\begin{array}{c}
-3\\
0
\end{array}
\right]
=
\left[
\begin{array}{c}
red
\end{array}
\right]
[a11a21a12a22][blue]+[−30]=[red]
要投入的点组是:(2,0)−−>(−2,0),(0,2)−−>(−3,2)(2, 0)-->(-2, 0),(0, 2)-->(-3, 2)(2,0)−−>(−2,0),(0,2)−−>(−3,2),投入后得出变化矩阵为:
[0.5001]
\left[
\begin{array}{c}
0.5&0\\
0&1
\end{array}
\right]
[0.5001]
投入伪向量到系列变化中,得出新的伪向量:[ut−32u−2ut]\bigl[\begin{smallmatrix} ut-3 \\ 2u-2ut \end{smallmatrix}\bigr][ut−32u−2ut],其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1,带入极值得出端点:(−3,0),(−3,2),(−3,0),(−2,0)(-3, 0),(-3, 2),(-3, 0),(-2, 0)(−3,0),(−3,2),(−3,0),(−2,0),结果正确,我们再变化剩下的那个三角形,变化流程为:

变化方程为:
[a11a12a21a22][blue]+[−20]=[red]
\left[
\begin{array}{c}
a_{11}&a_{12}\\
a_{21}&a_{22}
\end{array}
\right]
\left[
\begin{array}{c}
blue
\end{array}
\right]
+
\left[
\begin{array}{c}
-2\\
0
\end{array}
\right]
=
\left[
\begin{array}{c}
red
\end{array}
\right]
[a11a21a12a22][blue]+[−20]=[red]
要投入的点组是:(0,2)−−>(−2,2),(2,0)−−>(−3,2)(0, 2)-->(-2, 2),(2, 0)-->(-3, 2)(0,2)−−>(−2,2),(2,0)−−>(−3,2),投入后得出变化矩阵为:
[−0.5011]
\left[
\begin{array}{c}
-0.5&0\\
1&1
\end{array}
\right]
[−0.5101]
投入伪向量到系列变化中,得出新的伪向量:[−ut−22u]\bigl[\begin{smallmatrix} -ut-2 \\ 2u\end{smallmatrix}\bigr][−ut−22u],其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1,带入极值得出端点为:(−2,0),(−2,2),(−2,0),(−3,2)(-2, 0), (-2, 2), (-2, 0), (-3, 2)(−2,0),(−2,2),(−2,0),(−3,2)结果正确,感受到线性代数的强大了吗?这东西就像几何的外挂似的,真他妈牛逼,最终我们得出伪矩阵:
[ut−3−ut−22u−2ut2u]
\left[
\begin{array}{c}
ut-3&-ut-2\\
2u-2ut&2u
\end{array}
\right]
[ut−32u−2ut−ut−22u]
其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1,表示的其实就是蓝色长方形的点集,只不过被精准的切分成了两个三角形,我们最终的目的是求出红色不规则四边形的伪矩阵,显然我们做了多余的一步,完全可以直接把三角形变化成红色四边形中被切分出的三角形然后直接得出结果的,因为三角形可以任意的变化,而伪矩阵能够接收变化的结果,下面让我们看到三维体的几何变化。
三维
在三维中多了一种常用的几何变化,即投影变化,投影变化属于笔者定义中的复合变化,在二维中其实也有,只不过用的没有三维的多,因此笔者特意留到三维中分析该变化,要说明的是投影变化不属于笔者定义的维度变化,因为投影后的结果依旧处于三维,没有发生维度变化,而且三维中两线段的关系多了一种,即:异面,剩下的和二维变化就没有非常大的区别了,无非就是数据量变多了,因此我们能够直接把二维变化中的很多方法直接迁移到三维变化,先从三维点入手,首先三维点在三维中显然就只存在位置变化,直接使用向量加法就可以让一个三维点位移到三维中的任意一个点,非常简单,我们重点放在三维面和三维体上。
对于三维面,我们同样考虑其位变变化,形变变化,复合变化以及维度变化,利用在二维中得出的结论,我们直接使用三角面作为三维任意几何面的基本单位,考虑下方三维面:

我们要求出上方三角面的参数方程,利用"矩阵+向量"系列变化,这是非常轻松的,先求出一个简单的三维三角面参数方程:

容易得出上方三角面的伪向量:[2ut2u−2ut0]\bigl[\begin{smallmatrix} 2ut \\ 2u-2ut\\0 \end{smallmatrix}\bigr][2ut2u−2ut0]其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1,要投入变化的点组是:(0,0,0)−−>(5,3,6),(2,0,0)−−>(2,−2,4),(0,2,0)−−>(−2,2,2)(0, 0, 0)-->(5, 3, 6),(2, 0, 0)-->(2, -2, 4),(0, 2, 0)-->(-2, 2, 2)(0,0,0)−−>(5,3,6),(2,0,0)−−>(2,−2,4),(0,2,0)−−>(−2,2,2),得出的变化方程为:
[a11a12a13a21a22a23a31a32a33][blue]+[536]=[red]
\left[
\begin{array}{c}
a_{11}&a_{12}&a_{13}\\
a_{21}&a_{22}&a_{23}\\
a_{31}&a_{32}&a_{33}
\end{array}
\right]
\left[
\begin{array}{c}
blue
\end{array}
\right]
+
\left[
\begin{array}{c}
5\\
3\\
6
\end{array}
\right]
=
\left[
\begin{array}{c}
red
\end{array}
\right]
a11a21a31a12a22a32a13a23a33[blue]+536=[red]
投入点组后,得出变化矩阵:
[−1.5−3.5a13−2.5−0.5a23−1−2a33]
\left[
\begin{array}{c}
-1.5&-3.5&a_{13}\\
-2.5&-0.5&a_{23}\\
-1&-2&a_{33}
\end{array}
\right]
−1.5−2.5−1−3.5−0.5−2a13a23a33
注意到第三列依旧是未知数,这说明第三列不影响变化,我们直接让其等于全零,得出变化矩阵:
[−1.5−3.50−2.5−0.50−1−20]
\left[
\begin{array}{c}
-1.5&-3.5&0\\
-2.5&-0.5&0\\
-1&-2&0
\end{array}
\right]
−1.5−2.5−1−3.5−0.5−2000
投入伪向量到系列变化中,得出新的伪向量:[4ut−7u+53−4ut−u6+2ut−4u]\bigl[\begin{smallmatrix} 4ut-7u+5 \\ 3-4ut-u\\6+2ut-4u \end{smallmatrix}\bigr][4ut−7u+53−4ut−u6+2ut−4u]其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1,带入极值,得出端点(5,3,6),(5,3,6),(−2,2,2),(2,−2,4)(5, 3, 6), (5, 3, 6), (-2, 2, 2), (2, -2, 4)(5,3,6),(5,3,6),(−2,2,2),(2,−2,4),结果正确,平面几何使用两个未知数表示也符合了数学规律,这说明我们得出的方法是具备通用性的,而且计算起来非常轻松,在以三角面为单位后,三维面中所有的位变变化,形变变化和复合变化都是一模一样的套路,下面来实操一下,考虑下方位变变化:

要解决三个问题:1.求出蓝色五边形的参数方程;2.求出红色五边形的参数方程;3.求出蓝色五边形到红色五边形是"矩阵+向量"系列变化方程。先解决第一个,显然直接硬求参数方程是非常困难的,但是利用参数方程本质上是点集的特性,我们可以把蓝色五边形切割成多个三角形,然后使用伪矩阵表示出完整的点集,效果和参数方程一致,而且接口还和线性代数统一,先进行切割:

然后构造一个简单的三维三角形的伪向量,笔者这次构造一个更简单的:

这样可以把代数计算中除以2的那步省掉,直接得出结果,容易得出上方三角形伪向量为:[utu−ut0]\bigl[\begin{smallmatrix} ut \\ u-ut\\0 \end{smallmatrix}\bigr][utu−ut0]其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1,然后开始变化第一个三角形,投入的点组为(对应关系任意):(0,0,0)−−>(1,3,0),(1,0,0)−−>(5,2,0),(0,1,0)−−>(6,5,0)(0, 0, 0)-->(1, 3, 0), (1, 0, 0)-->(5, 2, 0),(0, 1, 0)-->(6, 5, 0)(0,0,0)−−>(1,3,0),(1,0,0)−−>(5,2,0),(0,1,0)−−>(6,5,0),变化方程为:
[a11a12a13a21a22a23a31a32a33][base]+[130]=[triangle1]
\left[
\begin{array}{c}
a_{11}&a_{12}&a_{13}\\
a_{21}&a_{22}&a_{23}\\
a_{31}&a_{32}&a_{33}
\end{array}
\right]
\left[
\begin{array}{c}
base
\end{array}
\right]
+
\left[
\begin{array}{c}
1\\
3\\
0
\end{array}
\right]
=
\left[
\begin{array}{c}
triangle1
\end{array}
\right]
a11a21a31a12a22a32a13a23a33[base]+130=[triangle1]
投入点组后,得出变化矩阵为:
[450−120000]
\left[
\begin{array}{c}
4&5&0\\
-1&2&0\\
0&0&0
\end{array}
\right]
4−10520000
同样的最后一列是不影响变化的未知数,可以认为是为了保持接口的一致性才添加了最后一列,其完全不影响实际变化,投入伪向量,得出三角形1的伪向量为:[1+5u−ut3+2u−3ut0]\bigl[\begin{smallmatrix} 1+5u-ut \\ 3+2u-3ut\\0 \end{smallmatrix}\bigr][1+5u−ut3+2u−3ut0]其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1,带入极值验证,得出端点为:(1,3,0),(6,5,0),(1,3,0),(5,2,0)(1, 3, 0), (6, 5, 0), (1, 3, 0), (5, 2, 0)(1,3,0),(6,5,0),(1,3,0),(5,2,0),结果正确。然后求第二个三角形,投入的点组为:(0,0,0)−−>(1,3,0),(1,0,0)−−>(6,5,0),(0,1,0)−−>(−1,6,0)(0, 0, 0)-->(1, 3, 0),(1, 0, 0)-->(6, 5, 0),(0, 1, 0)-->(-1, 6, 0)(0,0,0)−−>(1,3,0),(1,0,0)−−>(6,5,0),(0,1,0)−−>(−1,6,0),变化方程为:
[a11a12a13a21a22a23a31a32a33][base]+[130]=[triangle2]
\left[
\begin{array}{c}
a_{11}&a_{12}&a_{13}\\
a_{21}&a_{22}&a_{23}\\
a_{31}&a_{32}&a_{33}
\end{array}
\right]
\left[
\begin{array}{c}
base
\end{array}
\right]
+
\left[
\begin{array}{c}
1\\
3\\
0
\end{array}
\right]
=
\left[
\begin{array}{c}
triangle2
\end{array}
\right]
a11a21a31a12a22a32a13a23a33[base]+130=[triangle2]
投入点组后得出变化矩阵:
[5−20230000]
\left[
\begin{array}{c}
5&-2&0\\
2&3&0\\
0&0&0
\end{array}
\right]
520−230000
投入原伪向量,得出目标伪向量:[1+7ut−2u3−ut+3u0]\bigl[\begin{smallmatrix} 1+7ut-2u \\ 3-ut+3u\\0 \end{smallmatrix}\bigr][1+7ut−2u3−ut+3u0]其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1,带入极值验证,得出端点为:(1,3,0),(−1,6,0),(1,3,0),(6,5,0)(1, 3, 0), (-1, 6, 0), (1, 3, 0), (6, 5, 0)(1,3,0),(−1,6,0),(1,3,0),(6,5,0),结果正确,最后求第三个三角形伪向量,投入点组为:(0,0,0)−−>(1,3,0),(1,0,0)−−>(−1,6,0),(0,1,0)−−>(−2,2,0)(0, 0, 0)-->(1, 3, 0),(1, 0, 0)-->(-1, 6, 0),(0, 1, 0)-->(-2, 2, 0)(0,0,0)−−>(1,3,0),(1,0,0)−−>(−1,6,0),(0,1,0)−−>(−2,2,0),变化方程为:
[a11a12a13a21a22a23a31a32a33][base]+[130]=[triangle3]
\left[
\begin{array}{c}
a_{11}&a_{12}&a_{13}\\
a_{21}&a_{22}&a_{23}\\
a_{31}&a_{32}&a_{33}
\end{array}
\right]
\left[
\begin{array}{c}
base
\end{array}
\right]
+
\left[
\begin{array}{c}
1\\
3\\
0
\end{array}
\right]
=
\left[
\begin{array}{c}
triangle3
\end{array}
\right]
a11a21a31a12a22a32a13a23a33[base]+130=[triangle3]
这里说明一下笔者解上方方程的方法,简单到用口算都行,也就是说利用"简单三角形+变化矩阵+向量"的操作,我们使用口算都可以求出任意图形的参数方程,求解过程如下:
[a11a21a31]=[−160]−[130]
\left[
\begin{array}{c}
a_{11}\\
a_{21}\\
a_{31}
\end{array}
\right]
=
\left[
\begin{array}{c}
-1\\
6\\
0
\end{array}
\right]
-
\left[
\begin{array}{c}
1\\
3\\
0
\end{array}
\right]
a11a21a31=−160−130
[a11a21a31]=[−220]−[130]
\left[
\begin{array}{c}
a_{11}\\
a_{21}\\
a_{31}
\end{array}
\right]
=
\left[
\begin{array}{c}
-2\\
2\\
0
\end{array}
\right]
-
\left[
\begin{array}{c}
1\\
3\\
0
\end{array}
\right]
a11a21a31=−220−130
是不是非常简单?主要原因在于我们选择的基础三角形够简单,最后的第三列直接填全零就可以了,得出变化矩阵:
[−2−303−10000]
\left[
\begin{array}{c}
-2&-3&0\\
3&-1&0\\
0&0&0
\end{array}
\right]
−230−3−10000
投入原伪向量,得出目标伪向量:[1+ut−3u3+4ut−u0]\bigl[\begin{smallmatrix} 1+ut-3u \\ 3+4ut-u\\0 \end{smallmatrix}\bigr][1+ut−3u3+4ut−u0]其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1,带入极值验证,得出端点为:(1,3,0),(−2,2,0),(1,3,0),(−1,6,0)(1, 3, 0), (-2, 2, 0), (1, 3, 0), (-1, 6, 0)(1,3,0),(−2,2,0),(1,3,0),(−1,6,0),结果正确,最终我们得出不规则五边形的伪矩阵为:
[1+5u−ut1+7ut−2u1+ut−3u3+2u−3ut3−ut+3u3+4ut−u000]
\left[
\begin{array}{c}
1+5u-ut&1+7ut-2u&1+ut-3u\\
3+2u-3ut&3-ut+3u&3+4ut-u\\
0&0&0
\end{array}
\right]
1+5u−ut3+2u−3ut01+7ut−2u3−ut+3u01+ut−3u3+4ut−u0
其中0<=t<=1,0<=u<=10<=t<=1,0<=u<=10<=t<=1,0<=u<=1看起来很复杂,但是一步步拆分开是非常简单的,由于在三个三角形中都验证过结果了,因此上方伪矩阵表示的点集就一定是整体蓝色五边形的点集,伪矩阵目前只是一个伪向量的容器,拥有哪些能力笔者也不确定,不过根据其点集的本质和伪向量中得出的经验,伪矩阵应该是能够用来进行复杂几何元素的碰撞检测的,这个功能我们后面再探讨,现在按照同样的方法来求红色五边形的伪矩阵,先进行三角划分:

投入点组为:
| 点组 |
|---|
| 三角形1:(0,0,0)−−>(1,0,3),(1,0,0)−−>(5,0,2),(0,1,0)−−>(6,0,5)(0, 0, 0)-->(1, 0, 3),(1, 0, 0)-->(5, 0, 2),(0, 1, 0)-->(6, 0, 5)(0,0,0)−−>(1,0,3),(1,0,0)−−>(5,0,2),(0,1,0)−−>(6,0,5) |
| 三角形2:(0,0,0)−−>(1,0,3),(1,0,0)−−>(6,0,5),(0,1,0)−−>(−1,0,6)(0, 0, 0)-->(1, 0, 3),(1, 0, 0)-->(6, 0, 5),(0, 1, 0)-->(-1, 0, 6)(0,0,0)−−>(1,0,3),(1,0,0)−−>(6,0,5),(0,1,0)−−>(−1,0,6) |
| 三角形3:(0,0,0)−−>(1,0,3),(1,0,0)−−>(−1,0,6),(0,1,0)−−>(−2,0,2)(0, 0, 0)-->(1, 0, 3),(1, 0, 0)-->(-1, 0, 6),(0, 1, 0)-->(-2, 0, 2)(0,0,0)−−>(1,0,3),(1,0,0)−−>(−1,0,6),(0,1,0)−−>(−2,0,2) |
变化方程统一都为:
[a11a12a13a21a22a23a31a32a33][base]+[103]=[triangle]
\left[
\begin{array}{c}
a_{11}&a_{12}&a_{13}\\
a_{21}&a_{22}&a_{23}\\
a_{31}&a_{32}&a_{33}
\end{array}
\right]
\left[
\begin{array}{c}
base
\end{array}
\right]
+
\left[
\begin{array}{c}
1\\
0\\
3
\end{array}
\right]
=
\left[
\begin{array}{c}
triangle
\end{array}
\right]
a11a21a31a12a22a32a13a23a33[base]+103=[triangle]
容易发现,最终的伪矩阵为:
[1+5u−ut1+7ut−2u1+ut−3u0003+2u−3ut3−ut+3u3+4ut−u]
\left[
\begin{array}{c}
1+5u-ut&1+7ut-2u&1+ut-3u\\
0&0&0\\
3+2u-3ut&3-ut+3u&3+4ut-u\\
\end{array}
\right]
1+5u−ut03+2u−3ut1+7ut−2u03−ut+3u1+ut−3u03+4ut−u
其中0<=t<=1,0<=h<=10<=t<=1,0<=h<=10<=t<=1,0<=h<=1,带入极值验证一下,得出所有的不重复端点为:(1,0,3),(6,0,5),(−1,0,6),(−2,0,2),(5,0,2)(1, 0, 3), (6, 0, 5), (-1, 0, 6), (-2, 0, 2), (5, 0, 2)(1,0,3),(6,0,5),(−1,0,6),(−2,0,2),(5,0,2),结果正确,容易发现我们似乎可以使用初等行变化来实现xy,yz,xzxy, yz, xzxy,yz,xz平面上几何元素旋转的效果,自然而然的,我们产生了使用矩阵来操作伪矩阵的需求,线性代数还没有学到,但是我们可以利用编程思维来实现一个简单的算法,首先伪矩阵的每一列都是独立的一个伪向量,代表着复杂几何元素中的一个三角形,那么我们就可以使用一个循环遍历提取伪矩阵中的每一列,然后投入3*3的矩阵,变化完毕后再打包成新的伪矩阵,也就是这样的:
[a11a12a13a21a22a23a31a32a33][1+5u−ut3+2u−3ut0]=[1+5u−ut03+2u−3ut]
\left[
\begin{array}{c}
a_{11}&a_{12}&a_{13}\\
a_{21}&a_{22}&a_{23}\\
a_{31}&a_{32}&a_{33}
\end{array}
\right]
\left[
\begin{array}{c}
1+5u-ut\\
3+2u-3ut\\
0
\end{array}
\right]
=
\left[
\begin{array}{c}
1+5u-ut\\
0\\
3+2u-3ut
\end{array}
\right]
a11a21a31a12a22a32a13a23a331+5u−ut3+2u−3ut0=1+5u−ut03+2u−3ut
[a11a12a13a21a22a23a31a32a33][1+7ut−2u3−ut+3u0]=[1+7ut−2u03−ut+3u]
\left[
\begin{array}{c}
a_{11}&a_{12}&a_{13}\\
a_{21}&a_{22}&a_{23}\\
a_{31}&a_{32}&a_{33}
\end{array}
\right]
\left[
\begin{array}{c}
1+7ut-2u\\
3-ut+3u\\
0
\end{array}
\right]
=
\left[
\begin{array}{c}
1+7ut-2u\\
0\\
3-ut+3u
\end{array}
\right]
a11a21a31a12a22a32a13a23a331+7ut−2u3−ut+3u0=1+7ut−2u03−ut+3u
[a11a12a13a21a22a23a31a32a33][1+ut−3u3+4ut−u0]=[1+ut−3u03+4ut−u]
\left[
\begin{array}{c}
a_{11}&a_{12}&a_{13}\\
a_{21}&a_{22}&a_{23}\\
a_{31}&a_{32}&a_{33}
\end{array}
\right]
\left[
\begin{array}{c}
1+ut-3u\\
3+4ut-u\\
0
\end{array}
\right]
=
\left[
\begin{array}{c}
1+ut-3u\\
0\\
3+4ut-u
\end{array}
\right]
a11a21a31a12a22a32a13a23a331+ut−3u3+4ut−u0=1+ut−3u03+4ut−u
该算法的核心在于伪矩阵中的单列是完全独立的,再利用上一节中笔者提出的集合意义线性变化:一个矩阵操作整体几何元素等同于单独操作几何元素中的每一个点,就容易得出上方的算法了,可以发现最终的变化矩阵一定是相同的,因为整体上看是把整个五边形进行旋转,那么使用同样的矩阵自然就可以旋转五边形中的一部分,得出变化矩阵为:
[100000010]
\left[
\begin{array}{c}
1&0&0\\
0&0&0\\
0&1&0
\end{array}
\right]
100001000
在实际编程中,我们不需要存储完整的参数方程,而是只存储端点,具体来说就是把任意的几何元素都以三角形为单位进行切分,然后在程序中存储所有三角形的端点,最终再根据端点渲染出完整的三角形,几乎所有主流的建模软件,游戏引擎或是几何库都是采用这种操作,因此在后文,笔者也会采用这种不存储完整的参数方程,只记录端点的操作并结合Unity游戏引擎进行讲解,下面来看看三维体的情况,考虑下方三维体:

一个简单的正方体,让我们来看看在Unity游戏引擎中是如何表示正方体的:

要说明的是笔者把坐标系改成了左手系,和Unity中保持一致,从上图容易看出,就算是能够直接使用端点进行表示的简单正方体,在Unity中同样是使用三角形为几何单位的,核心就在于三角形可以使用"矩阵+向量"在三维中进行任意的变化,无论是形变还是位变,可以发现Unity将正方体切割成了12个三角形每一面都是等大的两个直角三角形,我们有理由推测Unity在底层存储的就是这12个三角形的端点,三三为一组进行渲染,然后得出一个完整正方体的外壳,但是容易发现总共要36个端点,每个端点需要3个浮点数表示,总计需要108个浮点数,不过有效的非重复端点就只有8个,因此必须要进行去重操作,否则开销会提升很多倍,难点在于要如何确定某个端点是属于哪一个三角形的,笔者想到的第一个策略就是利用映射来进行存储,也就是这样的:
endpoint = [[0.0, 0.0, 0.0], [2.0, 0.0, 0.0], [2.0, 0.0, -2.0], [0.0, 0.0, -2.0], [0.0, 2.0, 0.0], [2.0, 2.0, 0.0], [2.0, 2.0, -2.0], [0.0, 2.0, -2.0]]
cube = [[0, 1, 2], [0, 2, 3], [0, 1, 4], [1, 4, 5], [0, 3, 4], [3, 4, 7],
[2, 1, 5], [2, 6, 5], [2, 3, 6], [3, 6, 7], [6, 7, 5], [5, 7, 4]]
#上方使用了python进行表示,因为比较方便
简单来说笔者的策略就是只存储有效端点的坐标,然后使用另一个数组存储端点下标,在渲染时只需要遍历下方的下标数组就可以正确的进行三角形渲染了,总计需要24个浮点数和36个小整数,开销降低了不少,再加上在Python中有小整数缓存机制,因此小整数的开销可以忽略,在表示出几何元素后,下面开始考虑最简单的位变变化,在Unity中我们可以通过拖拽或是直接指定数据来让正方体的位置方式变化,在底层就是使用向量实现的,具体来说在拖拽时会不断循环的识别鼠标的移动速度和移动方向,然后以帧为单位进行不断的移动,在此处可以演示一下指定数据进行位移的方法,比如指定下方的数据:

显然只需要让正方体端点加上向量(5,5,7)(5, 5, 7)(5,5,7)就可以了,下面让我们来看看旋转变化,三维体的旋转比较复杂,在Unity中一个三维体可以绕自身的x,y,zx, y, zx,y,z轴进行旋转,没有提供绕外部轴线进行旋转的功能,原因很简单,因为该功能显然可以依靠平移+绕自身轴线旋转来实现,也就是说只需要平移和绕自身轴线旋转两种位置变化,就可以实现任意的位变变化了,因此我们在此处同样只考虑几何体绕自身轴线旋的情况,由于绘图困难,笔者直接就使用Unity进行图片展示了:

按照我们上方绘制的坐标系,这属于绕x轴进行旋转,旋转角为45度,问题就是:已知左侧正方体顶点,求右侧正方体顶点,我们抽出其中一个顶点来求出变化矩阵,绘制出侧视图:

在前面我们都是已知起始顶点和目标顶点,求变化矩阵,但是在实际的程序中,我们能够知道的就只是用户输入的旋转角度和旋转坐标轴,根据这两个数据,我们得求出旋转后的顶点坐标,上图就是用户指定了旋转坐标轴是x轴,旋转角是45度(正数角,逆时针旋转),也就是说我们得从旋转角度信息来求出变化矩阵,此时我们可以先通过三角函数求出目标点,然后再求出变化矩阵,考虑下方旋转

蓝色线段逆时针旋转bbb度,在计算机中,很容易就可以求出cosa,cosb,sina,sinbcosa, cosb, sina, sinbcosa,cosb,sina,sinb,那么再利用余弦角公式和正弦角公式,就可以得出cos(a+b),sin(a+b)cos(a+b),sin(a+b)cos(a+b),sin(a+b),高中知识,在此处笔者简单的证明一下,考虑下方图形:

直接使用代数计算证明会非常复杂,但是使用向量来表达就非常轻松,要让向量和三角函数cos,sincos,sincos,sin联系起来就必须使用向量的点乘和叉乘了, 向量的点乘和叉乘是两个非常重要的向量运算,有必要好好的讨论一下,因此笔者在本文后方专门开启了一段进行讨论,读者可以先跳过去看看。首先为了便于计算,令圆为单位圆,可以得出:
设:设a=(x1,y1),b=(x2,y2),c=(x3,y3)\mathbf{a} = (x_1, y_1),\mathbf{b} = (x_2, y_2),\mathbf{c} = (x_3, y_3)a=(x1,y1),b=(x2,y2),c=(x3,y3)
可得
cos∠1=a⋅b=x1x2+y1y2cos∠1 = \mathbf{a} \cdot \mathbf{b}=x_1x_2+y_1y_2cos∠1=a⋅b=x1x2+y1y2
cos∠2=b⋅c=x2x3+y2y3cos∠2=\mathbf{b} \cdot \mathbf{c}=x_2x_3+y_2y_3cos∠2=b⋅c=x2x3+y2y3
cos∠3=cos(∠1+∠2)=a⋅c=x1x3+y1y3cos∠3=cos(∠1+∠2) = \mathbf{a} \cdot \mathbf{c}=x_1x_3+y_1y_3cos∠3=cos(∠1+∠2)=a⋅c=x1x3+y1y3
在此处存在一个问题:“二维向量不存在严格意义上的叉乘,那么要如何表示出sin?”,也就是说我们得把叉乘在逻辑上迁移到二维中来,最终要得出二维叉乘的坐标式,要注意的是此时不能真正的叉乘出一个新的垂直于二维的向量,仅仅只是为了便于我们理解和进行代数操作而进行的逻辑迁移,考虑二维向量:
a=(x1,y1),b=(x2,y2)\mathbf{a} = (x_1, y_1),\mathbf{b} = (x_2, y_2)a=(x1,y1),b=(x2,y2)
在逻辑上我们对其进行扩充,加上zzz轴并令zzz坐标为0,得出新向量:
a=(x1,y1,0),b=(x2,y2,0)\mathbf{a} = (x_1, y_1, 0),\mathbf{b} = (x_2, y_2, 0)a=(x1,y1,0),b=(x2,y2,0)
那么可以得出坐标表示式:
a×b=∣a∣∣b∣sinα=(0,0,x1y2−y1x2)\mathbf{a}\times\mathbf{b}=|\mathbf{a}||\mathbf{b}|sin\alpha=(0, 0, x_1y_2-y_1x_2)a×b=∣a∣∣b∣sinα=(0,0,x1y2−y1x2)
因此得出:
sin∠1=a×b=x1y2−y1x2sin∠1 = \mathbf{a} \times \mathbf{b}=x_1y_2-y_1x_2sin∠1=a×b=x1y2−y1x2
sin∠2=b×c=x2y3−y2x3sin∠2 = \mathbf{b} \times \mathbf{c}=x_2y_3-y_2x_3sin∠2=b×c=x2y3−y2x3
sin∠3=sin(∠1+∠2)=a×c=x1y3−y1x3sin∠3 = sin(∠1+∠2) = \mathbf{a} \times \mathbf{c}=x_1y_3-y_1x_3sin∠3=sin(∠1+∠2)=a×c=x1y3−y1x3
然后就是简单的代数计算了,也就是说我们可以证明:
求证:cos∠3=cos(∠1+∠2)=cos∠1cos∠2−sin∠1sin∠2cos∠3=cos(∠1+∠2) = cos∠1cos∠2-sin∠1sin∠2cos∠3=cos(∠1+∠2)=cos∠1cos∠2−sin∠1sin∠2
解:
带入坐标式,得出:
cos∠1cos∠2−sin∠1sin∠2=(x1x2+y1y2)(x2x3+y2y3)−(x1y2−y1x2)(x2y3−y2x3)cos∠1cos∠2-sin∠1sin∠2=(x_1x_2+y_1y_2)(x_2x_3+y_2y_3)-(x_1y_2-y_1x_2)(x_2y_3-y_2x_3)cos∠1cos∠2−sin∠1sin∠2=(x1x2+y1y2)(x2x3+y2y3)−(x1y2−y1x2)(x2y3−y2x3)
=x1x22x3+x1x2y2y3+y1y2x2x3+y1y22y3−(x1x2y2y3−x1y22x3−y1x22y3+y1y2x2x3)=x_1x_2^2x_3+x_1x_2y_2y_3+y_1y_2x_2x_3+y_1y_2^2y_3-(x_1x_2y_2y_3-x_1y_2^2x_3-y_1x_2^2y_3+y_1y_2x_2x_3)=x1x22x3+x1x2y2y3+y1y2x2x3+y1y22y3−(x1x2y2y3−x1y22x3−y1x22y3+y1y2x2x3)
=x1x22x3+y1y22y3+x1y22x3+y1x22y3=x_1x_2^2x_3+y_1y_2^2y_3+x_1y_2^2x_3+y_1x_2^2y_3=x1x22x3+y1y22y3+x1y22x3+y1x22y3
=(x22+y22)(x1x3+y1y3)=(x_2^2+y_2^2)(x_1x_3+y_1y_3)=(x22+y22)(x1x3+y1y3)
=x1x3+y1y3=x_1x_3+y_1y_3=x1x3+y1y3
=cos∠3=cos∠3=cos∠3
然后是:
求证:sin∠3=sin(∠1+∠2)=sin∠1cos∠2+con∠1sin∠2sin∠3=sin(∠1+∠2) = sin∠1cos∠2+con∠1sin∠2sin∠3=sin(∠1+∠2)=sin∠1cos∠2+con∠1sin∠2
带入坐标式,得出:
sin∠1cos∠2+con∠1sin∠2=(x1y2−y1x2)(x2x3+y2y3)+(x1x2+y1y2)(x2y3−y2x3)sin∠1cos∠2+con∠1sin∠2=(x_1y_2-y_1x_2)(x_2x_3+y_2y_3)+(x_1x_2+y_1y_2)(x_2y_3-y_2x_3)sin∠1cos∠2+con∠1sin∠2=(x1y2−y1x2)(x2x3+y2y3)+(x1x2+y1y2)(x2y3−y2x3)
=x1y2x2x3+x1y22y3−y1x22x3−y1x2y2y3+x1x22y3−x1x2y2x3+y1y2x2y3−y1y22x3=x_1y_2x_2x_3+x_1y_2^2y_3-y_1x_2^2x_3-y_1x_2y_2y_3+x_1x_2^2y_3-x_1x_2y_2x_3+y_1y_2x_2y_3-y_1y_2^2x_3=x1y2x2x3+x1y22y3−y1x22x3−y1x2y2y3+x1x22y3−x1x2y2x3+y1y2x2y3−y1y22x3
=x1y22y3−y1x22x3+x1x22y3−y1y22x3=x_1y_2^2y_3-y_1x_2^2x_3+x_1x_2^2y_3-y_1y_2^2x_3=x1y22y3−y1x22x3+x1x22y3−y1y22x3
=(x1y3−y1x3)x22+(x1y3−y1x3)y22=(x_1y_3-y_1x_3)x_2^2+(x_1y_3-y_1x_3)y_2^2=(x1y3−y1x3)x22+(x1y3−y1x3)y22
=(x1y3−y1x3)(x22+y22)=(x_1y_3-y_1x_3)(x_2^2+y_2^2)=(x1y3−y1x3)(x22+y22)
=x1y3−y1x3=x_1y_3-y_1x_3=x1y3−y1x3
=sin∠3=sin∠3=sin∠3
对于非单位圆,我们可以先单位化再进行证明,至此证明完毕,写到这里就下不下了,剩余内容笔者移至了线性变化(3)中,在(3)中笔者将推导出通用的角度变化矩阵,探讨伪向量的点成,叉乘意义,特征与线性变化的本质和维度变化。
向量的点乘
向量的点乘是初中的知识,我们都知道对于两个向量,有:a⋅b=∣a∣∣b∣cosα=x1x2+y1y2+....+n1n2\mathbf{a} \cdot \mathbf{b} = |\mathbf{a}||\mathbf{b}|cos\alpha = x_1x_2+y_1y_2+....+n_1n_2a⋅b=∣a∣∣b∣cosα=x1x2+y1y2+....+n1n2,那么我们尝试从线性代数的视角来重新理解向量的点乘, 首先要明确的是a⋅b\mathbf{a} \cdot \mathbf{b}a⋅b只是一个人为定义的符号,真正具备几何意义的是后面的∣a∣∣b∣cosα|\mathbf{a}||\mathbf{b}|cos\alpha∣a∣∣b∣cosα,我们重点讨论该式的几何意义,考虑下方两条向量:

首先∣b∣cosα|\mathbf{b}|cos\alpha∣b∣cosα显然就意味着L1的长度,也就是线段b在线段a上的投影,那么∣a∣∣b∣cosα|\mathbf{a}||\mathbf{b}|cos\alpha∣a∣∣b∣cosα就是一条线段在另一条线段上的投影乘以另一条线段本身的长度,注意到有可能求出负数,而正负是由两条向量的夹角决定的,具体来说夹角是锐角就是正数,夹角是钝角就会是负数,夹角为90度时就会得出0,我们发现点乘可以在几何上去除向量的方向属性,仅得出一个单纯的值,从数字值来看是很难得出点乘的意义的,我们得从物理的角度来分析,包括叉乘也是如此,对于这两个向量的运算,我们得在物理的角度为其赋予现实意义。首先向量点乘的核心物理意义就是做功,考虑下方物理场景:

上图正方体受只自身重力G,拉力F,不考虑摩擦力,在拉力F的作用下向右移动距离d,那么此时就有拉力F做的有效功为:∣s∣∣F∣cosα|\mathbf{s}||\mathbf{F}|cos\alpha∣s∣∣F∣cosα,力乘以沿力方向作用的距离得出功,这就是向量点乘的核心意义,而从线性代数视角理解向量点乘的关键就在于后面的式子:x1x2+y1y2+....+n1n2x_1x_2+y_1y_2+....+n_1n_2x1x2+y1y2+....+n1n2,首先我们得证明该式的正确性,为了证明在任意维度中该式子都是正确的,我们先考虑任意两条二维向量:

要证明的是∣a∣∣b∣cosα=x1x2+y1y2|\mathbf{a}||\mathbf{b}|cos\alpha = x_1x_2+y_1y_2∣a∣∣b∣cosα=x1x2+y1y2,将坐标轴旋转,令向量a位于新坐标轴的x轴上,容易发现坐标变化为:(x1,y1)−−>(x12+y12,0),(x2,y2)−−>(x22+y22cosα+x22+y22sinα(x_1, y_1)-->(\sqrt{x_1^2+y_1^2}, 0),(x_2, y_2)-->(\sqrt{x_2^2+y_2^2}cos\alpha+\sqrt{x_2^2+y_2^2}sin\alpha(x1,y1)−−>(x12+y12,0),(x2,y2)−−>(x22+y22cosα+x22+y22sinα,那么在新的坐标轴中容易证明∣a∣∣b∣cosα=x12+y12x22+y22cosα=x12+y12x22+y22cosα+0x22+y22sinα|\mathbf{a}||\mathbf{b}|cos\alpha=\sqrt{x_1^2+y_1^2}\sqrt{x_2^2+y_2^2}cos\alpha=\sqrt{x_1^2+y_1^2}\sqrt{x_2^2+y_2^2}cos\alpha+0\sqrt{x_2^2+y_2^2}sin\alpha∣a∣∣b∣cosα=x12+y12x22+y22cosα=x12+y12x22+y22cosα+0x22+y22sinα,可以发现,该式绝对成立且成立的条件只和两向量的模以及向量之间的夹角有关,这些量不随坐标轴的旋转而改变,因此可以证明在原坐标轴中必然有∣a∣∣b∣cosα=x1x2+y1y2|\mathbf{a}||\mathbf{b}|cos\alpha = x_1x_2+y_1y_2∣a∣∣b∣cosα=x1x2+y1y2,在维度升高时,我们可以令两向量构成一张平面,然后使用二维的证明方法就可以证明出结论。利用该式得出等价的矩阵形式(以三维向量为例):
[x1y1z1][x2y2z2]
\left[
\begin{array}{c}
x_1&y_1&z_1
\end{array}
\right]
\left[
\begin{array}{c}
x_2\\
y_2\\
z_2
\end{array}
\right]
[x1y1z1]x2y2z2
利用向量数乘的两种形式(1.a⋅b=∣a∣∣b∣cosα=x1x2+y1y2+....+n1n2\mathbf{a} \cdot \mathbf{b} = |\mathbf{a}||\mathbf{b}|cos\alpha = x_1x_2+y_1y_2+....+n_1n_2a⋅b=∣a∣∣b∣cosα=x1x2+y1y2+....+n1n2,2.矩阵形式),容易推导出向量数乘满足运算律:
| 向量数乘运算律 |
|---|
| 1.a⋅b=∣a∣∣b∣cosα=∣b∣∣a∣cosα=b⋅a\mathbf{a} \cdot \mathbf{b} = |\mathbf{a}||\mathbf{b}|cos\alpha = |\mathbf{b}||\mathbf{a}|cos\alpha = \mathbf{b} \cdot \mathbf{a}a⋅b=∣a∣∣b∣cosα=∣b∣∣a∣cosα=b⋅a |
| 2.ca⋅b=cb⋅ac\mathbf{a} \cdot \mathbf{b} = c\mathbf{b} \cdot \mathbf{a}ca⋅b=cb⋅a |
| 3.a⋅(b+c)=ab+ac\mathbf{a} \cdot (\mathbf{b}+ \mathbf{c}) = \mathbf{a}\mathbf{b}+\mathbf{a}\mathbf{c}a⋅(b+c)=ab+ac |
| 4.若a=b\mathbf{a} = \mathbf{b}a=b,则a⋅c=b⋅c\mathbf{a}\cdot \mathbf{c} = \mathbf{b}\cdot \mathbf{c}a⋅c=b⋅c |
| 5.注意:(a⋅b)⋅c!=a⋅(b⋅c)(\mathbf{a} \cdot \mathbf{b})\cdot \mathbf{c} != \mathbf{a} \cdot (\mathbf{b}\cdot \mathbf{c})(a⋅b)⋅c!=a⋅(b⋅c) |
| 6.注意:ua⋅b⋅c=a⋅(ub)⋅cu\mathbf{a} \cdot \mathbf{b}\cdot \mathbf{c} = \mathbf{a} \cdot (u\mathbf{b})\cdot \mathbf{c}ua⋅b⋅c=a⋅(ub)⋅c |
| 7.注意:ua⋅(b1+b2)⋅c=(uab1+uab2)⋅cu\mathbf{a} \cdot (\mathbf{b_1}+\mathbf{b_2})\cdot \mathbf{c} = (u\mathbf{a}\mathbf{b_1}+u\mathbf{a}\mathbf{b_2}) \cdot \mathbf{c}ua⋅(b1+b2)⋅c=(uab1+uab2)⋅c |
要注意的是第五条,当点乘的向量个数大于2时不满足结合律,必须按顺序进行点乘,因为此时交换顺序后夹角的值和向量的模都会变化,比如在(a⋅b)⋅c(\mathbf{a} \cdot \mathbf{b})\cdot \mathbf{c}(a⋅b)⋅c中要计算的夹角是a,b\mathbf{a}, \mathbf{b}a,b之间的夹角,得出的结果是对c\mathbf{c}c的数乘,但是在a⋅(b⋅c)\mathbf{a} \cdot (\mathbf{b}\cdot \mathbf{c})a⋅(b⋅c)中计算的夹角是b,c\mathbf{b}, \mathbf{c}b,c的夹角,得出的是对a\mathbf{a}a的数乘,最终结果的方向和模都是不同的,也就是说当点乘向量的个数大于2时,不满足向量的结合律,但是交换律和分配律依旧满足。
向量的叉乘
向量的叉乘是比较难理解的,其定义式为:a×b=∣a∣∣b∣sinαe\mathbf{a} \times \mathbf{b} = |\mathbf{a}||\mathbf{b}|sin\alpha\mathbf{e}a×b=∣a∣∣b∣sinαe,后面的那个e\mathbf{e}e是一个单位向量,该向量垂直于a,b\mathbf{a},\mathbf{b}a,b所构成的平面,具体是向上还是向下需要使用右手法则进行判断,容易发现在纯二维中是不存在向量叉乘的,因为二维就是个平面,无法叉乘出一条垂直于二维平面的向量,但是在二维中可以利用叉乘的思路来解决某些复杂问题,这一点我们后面再讨论,下面先来推导出叉乘的坐标形式,在大部分教材上只会告诉你可以使用行列式来记忆叉乘的坐标形式,不会告诉你如何推导,笔者并不喜欢这一点,因此在此处我们自己尝试推导出叉乘的坐标式,首先要明确的是a×b\mathbf{a} \times \mathbf{b}a×b就只是个符号,真正具备意义的是后面的 ∣a∣∣b∣sinαe|\mathbf{a}||\mathbf{b}|sin\alpha\mathbf{e}∣a∣∣b∣sinαe,我们先推导标量∣a∣∣b∣sinα|\mathbf{a}||\mathbf{b}|sin\alpha∣a∣∣b∣sinα的坐标值,以三维为例,有∣a∣=x12+y12+z12,∣b∣=x22+y22+z22|\mathbf{a}| = \sqrt{x_1^2+y_1^2+z_1^2},|\mathbf{b}| = \sqrt{x_2^2+y_2^2+z_2^2}∣a∣=x12+y12+z12,∣b∣=x22+y22+z22,那么关键自然就在于将sinαsin\alphasinα也使用坐标进行表示,我们可以利用三角函数和向量点乘来进行转换,我们使用c1c_1c1表示∣a∣|\mathbf{a}|∣a∣,c2c_2c2表示∣b∣|\mathbf{b}|∣b∣,得出:
c1c2sinα=c1c21−cosα2=c12c22−(c1c2cosα)2c_1c_2sin\alpha = c_1c_2\sqrt{1-cos\alpha^2}=\sqrt{c_1^2c_2^2-(c_1c_2cos\alpha)^2}c1c2sinα=c1c21−cosα2=c12c22−(c1c2cosα)2
由于c1c2cosα=a⋅b=x1x2+y1y2+z1z2c_1c_2cos\alpha=\mathbf{a} \cdot \mathbf{b}=x_1x_2+y_1y_2+z_1z_2c1c2cosα=a⋅b=x1x2+y1y2+z1z2,因此我们可以将上式完全使用坐标表示,得出:
c12c22−(c1c2cosα)2=(x12+y12+z12)(x22+y22+z22)−(x1x2+y1y2+z1z2)2\sqrt{c_1^2c_2^2-(c_1c_2cos\alpha)^2}=\sqrt{(x_1^2+y_1^2+z_1^2)(x_2^2+y_2^2+z_2^2)-(x_1x_2+y_1y_2+z_1z_2)^2}c12c22−(c1c2cosα)2=(x12+y12+z12)(x22+y22+z22)−(x1x2+y1y2+z1z2)2
上式子化简后得出(化简过程中的式子特别长,笔者就不展示了):
(x1y2−y1x2)2+(x1z2−z1x2)2+(y1z2−z1y2)2\sqrt{(x_1y_2-y_1x_2)^2+(x_1z_2-z_1x_2)^2+(y_1z_2-z_1y_2)^2}(x1y2−y1x2)2+(x1z2−z1x2)2+(y1z2−z1y2)2
显然这就是向量求模的式子,那么就可以得出叉乘后得出向量的x,y,zx, y, zx,y,z坐标表示,不过我们还无法确定顺序,此时我们可以利用向量90度点乘得出0的特性来确定具体顺序,具体操作就是让上式化为多个不同的坐标式后与a,b\mathbf{a},\mathbf{b}a,b点乘,最终都得出0的那个就是正确顺序,要注意的是,在()中的数也可以调换顺序,因为有(a−b)2=(b−a)2(a-b)^2 = (b-a)^2(a−b)2=(b−a)2,情况非常多,但是我们可以排除掉点乘出现平方项的情况,最终得出的有效情况必须是这种形式的:
(y1z2−z1y2,x1z2−z1x2,x1y2−y1x2)(y_1z_2-z_1y_2,x_1z_2-z_1x_2,x_1y_2-y_1x_2)(y1z2−z1y2,x1z2−z1x2,x1y2−y1x2)
然后尝试点乘(x1,y1,z1)(x_1, y_1, z_1)(x1,y1,z1),容易得出正确顺序为:
(y1z2−z1y2,z1x2−x1z2,x1y2−y1x2)(y_1z_2-z_1y_2,z_1x_2-x_1z_2,x_1y_2-y_1x_2)(y1z2−z1y2,z1x2−x1z2,x1y2−y1x2)
至此我们利用三角函数和向量点乘在纯代数角度推导出了向量叉乘的坐标形式,下面让我们从实际意义的角度来探讨向量叉乘,首先由其代数形式的值∣a∣∣b∣sinα|\mathbf{a}||\mathbf{b}|sin\alpha∣a∣∣b∣sinα容易看出,求出了两向量所构成的平行四边形的面积,这是一个高中的知识,让我们来推导一下,考虑下方任意三角形:

此时容易得出三角形面积为(b1+b2)h2\frac{(b_1+b_2)h}{2}2(b1+b2)h,由于sinα=hasin\alpha = \frac{h}{a}sinα=ah,因此得出h=asinαh = asin\alphah=asinα,带入到面积式中,得出新的面积表示式:(b1+b2)asinα2\frac{(b_1+b_2)asin\alpha}{2}2(b1+b2)asinα,即:absinα2\frac{absin\alpha}{2}2absinα,就是我们高中学到的那条式子,笔者只是展示出了被藏起来的推导过程,又由于两个全等三角形可以构成一个平行四边形,因此absinαabsin\alphaabsinα得出的就是边长为a,ba, ba,b,两边夹角为α\alphaα的平行四边形面积了,这意味着向量叉乘最终得出的向量∣a∣∣b∣sinαe|\mathbf{a}||\mathbf{b}|sin\alpha\mathbf{e}∣a∣∣b∣sinαe就是一条垂直于向量∣a∣∣b∣|\mathbf{a}||\mathbf{b}|∣a∣∣b∣构成的平面(具体方向由右手法则确定)且模为初始向量构成的平行四边形的面积,至此我们就在代数与几何上得出了向量叉乘的实际意义,下面来看看向量叉乘满足的运算律,首先由于叉乘最终的结果是向量,其方向由右手法则确定,因此向量叉乘不满足交换律,也就是:a×b!=b×a\mathbf{a} \times \mathbf{b} != \mathbf{b} \times \mathbf{a}a×b!=b×a,得出的结果值相同但是方向相反,但是显然标量不会影响结果的方向,因此有:ua×b=a×(ub)u\mathbf{a} \times \mathbf{b} = \mathbf{a} \times (u\mathbf{b})ua×b=a×(ub),难点在于分配律,考虑下方情况:
a×(b+c),a×b+a×c\mathbf{a} \times (\mathbf{b}+\mathbf{c}),\mathbf{a} \times \mathbf{b} + \mathbf{a} \times \mathbf{c}a×(b+c),a×b+a×c
首先判断方向是否相同,使用几何进行判断:

容易发现以共线向量为分割,两侧向量叉乘的结果向量方向不同,但是同侧向量叉乘的结果向量方向相同,这意味着在判断分配律时会出现不同的方向朝向,比如:

因此我们分情况讨论,情况分别是1.同侧,2同侧且存在0侧,3.异侧,4.异侧且存在零侧;先考虑同侧的情况:

此时必然有方向相同,那么只需要证明值是否相同,我们使用在上文推导出的坐标式来证明:
设a=(x1,y1,z1),b=(x2,y2,z2),c=(x3,y3,z3)\mathbf{a} = (x_1, y_1, z_1),\mathbf{b} = (x_2, y_2, z_2),\mathbf{c} = (x_3, y_3, z_3)a=(x1,y1,z1),b=(x2,y2,z2),c=(x3,y3,z3)
那么可以得出:a×b+a×c\mathbf{a} \times \mathbf{b} + \mathbf{a} \times \mathbf{c}a×b+a×c的x坐标值为:y1z2−z1y2+y1z3−z1y3y_1z_2-z_1y_2+y_1z_3-z_1y_3y1z2−z1y2+y1z3−z1y3
可以得出:a×(b+c)\mathbf{a} \times (\mathbf{b}+\mathbf{c})a×(b+c)的x坐标为:y1(z2+z3)−z1(y2+y3)=y1z2−z1y2+y1z3−z1y3y_1(z_2+z_3)-z_1(y_2+y_3) =y_1z_2-z_1y_2+y_1z_3-z_1y_3y1(z2+z3)−z1(y2+y3)=y1z2−z1y2+y1z3−z1y3
推而广之,设:a=(x1,y1,z1),b=(x2,y2,z2),c=(x3,y3,z3),d=(x4,y4,z4).....n=(xn,yn,zn)\mathbf{a} = (x_1, y_1, z_1),\mathbf{b} = (x_2, y_2, z_2),\mathbf{c} = (x_3, y_3, z_3), \mathbf{d} = (x_4, y_4, z_4).....\mathbf{n} = (x_n, y_n, z_n)a=(x1,y1,z1),b=(x2,y2,z2),c=(x3,y3,z3),d=(x4,y4,z4).....n=(xn,yn,zn)
那么有a×b+a×c+...+a×n\mathbf{a} \times \mathbf{b} + \mathbf{a} \times \mathbf{c}+...+\mathbf{a} \times \mathbf{n}a×b+a×c+...+a×n的x坐标值为:y1(z2+z3)−z1(y2+y3)=y1z2−z1y2+y1z3−z1y3+...+y1zn−z1yny_1(z_2+z_3)-z_1(y_2+y_3) =y_1z_2-z_1y_2+y_1z_3-z_1y_3+...+y_1z_n-z_1y_ny1(z2+z3)−z1(y2+y3)=y1z2−z1y2+y1z3−z1y3+...+y1zn−z1yn
且:a×(b+c+...+n)\mathbf{a} \times (\mathbf{b}+\mathbf{c}+...+\mathbf{n})a×(b+c+...+n)的x坐标为y1(z2+z3+...+zn)−z1(y2+y3+...+yn)=y1(z2+z3)−z1(y2+y3)=y1z2−z1y2+y1z3−z1y3+...+y1zn−z1yny_1(z_2+z_3+...+z_n)-z_1(y_2+y_3+...+y_n) =y_1(z_2+z_3)-z_1(y_2+y_3) =y_1z_2-z_1y_2+y_1z_3-z_1y_3+...+y_1z_n-z_1y_ny1(z2+z3+...+zn)−z1(y2+y3+...+yn)=y1(z2+z3)−z1(y2+y3)=y1z2−z1y2+y1z3−z1y3+...+y1zn−z1yn
由此得出,分配律的值必然相同(y, z的算法是一模一样的),那么只需要证明方向一致,就可以证明分配律的正确性了,同侧时方向一致是必然的,关键在于异侧,考虑下方情况:

利用三角函数中的∣sinα∣=∣cos(α−π2)∣|sin\alpha| = |cos(\alpha-\frac{\pi}{2})|∣sinα∣=∣cos(α−2π)∣和叉乘的代数式∣a∣∣b∣sinαe|\mathbf{a}||\mathbf{b}|sin\alpha\mathbf{e}∣a∣∣b∣sinαe,我们可以将红色向量投影到灰色线段上,如果任意时刻在平行四边形中都存在向量b+c\mathbf{b}+\mathbf{c}b+c投影的方向和b\mathbf{b}b与a\mathbf{a}a中的较长投影位于同侧的话,那么就可以证明方向的一致性,我们引入坐标轴进行表示,考虑下方平行四边形:

此时容易得知各个向量的xxx坐标就是投影的结果,那么两向量之和得出的红色向量的xxx坐标就一定会位于原向量投影中较长的那一侧,比如在负数那侧长的话,(x1+x2)(x_1+x_2)(x1+x2)就会得出负数,正数那侧长的话(x1+x2)(x_1+x_2)(x1+x2)就会得出正数,由此可证,向量叉乘满足分配律,即:
a×(b+c+...+n)=a×b+a×c+...+a×n\mathbf{a} \times (\mathbf{b}+\mathbf{c}+...+\mathbf{n})=\mathbf{a} \times \mathbf{b} + \mathbf{a} \times \mathbf{c}+...+\mathbf{a} \times \mathbf{n}a×(b+c+...+n)=a×b+a×c+...+a×n
最终我们可以总结出:在向量点乘满足交换律和分配律,不满足结合律;向量叉乘满足分配律,不满足交换律和结合律,最后还要补充一个实用的式子:
a×b⋅e1=[(y1z2−z1y2)i+(z1x2−x1z2)j+(x1y2−y1x2)k]⋅(i+j+k)=(y1z2−z1y2)+(z1x2−x1z2)+(x1y2−y1x2)\mathbf{a} \times \mathbf{b}\cdot \mathbf{e_1}=[(y_1z_2-z_1y_2)\mathbf{i}+(z_1x_2-x_1z_2)\mathbf{j}+(x_1y_2-y_1x_2)\mathbf{k}]\cdot(\mathbf{i}+\mathbf{j}+\mathbf{k})=(y_1z_2-z_1y_2)+(z_1x_2-x_1z_2)+(x_1y_2-y_1x_2)a×b⋅e1=[(y1z2−z1y2)i+(z1x2−x1z2)j+(x1y2−y1x2)k]⋅(i+j+k)=(y1z2−z1y2)+(z1x2−x1z2)+(x1y2−y1x2)
265

被折叠的 条评论
为什么被折叠?



