1. 数学分析
1) 参数化直线
还记得我们在学习向量时介绍的位移向量吗?参数化直线的原理和他相同。其实所谓参数化直线,就是通过一个参数t来表示直线上的一个线段,当t为0时,则取线段的一端的端点,当t取1时,则取到另一端的端点。如图:
核心原理就是向量加法的几何意义,Vd是加数,通过t(从0到1)去乘以这个Vd,则可以描述向量p,而p在某个t时的坐标值,就是从点P1到点P2的线段在t时的坐标值。注意这里我们使用的是图中的p = p1 + t * vd,这样t的取值是0到1,如果是p = p1 + t * v',那t的取值就是0到|Vd|,还需要去先算|Vd|,没有必要这么做,而且0和1是特殊的数字,运算方便。
所以参数化方程为:P(x,y,z) = p0 + v*t
我们为什么要用参数化的形式表示线段呢,因为在求两个线段的交点时,只要求两个参数方程组成的方程组,并求出t1和t2,只要他们都在0到1之间,那么就可以知道他们是有交点的。比如:
线段1:
x = 1 + 2*t1;
y = 3 + 4*t1;
线段2:
x = 5 + 6*t2;
y = 7 + 8*t2;
四个方程,四个未知数,可求得t1,t2,如果他们都在0和1之间,那他们相交。
具体怎么求?忘记上一章所讲的求逆矩阵的吗?要先算出行列式,然后。。。
注意,这里我们有很多的情况还没有考虑,比如:
1. 两条直线平行,没有交点
2. 两条线段在同一直线上,但互不重叠
3. 两条线段在同一直线上,部分重叠
4. 两条线段在同一直线上,只有一点重叠
在我的实现函数中,我把这4种特殊情况都看做是不相交或者说是无意义,当他们平行或共线时都会返回回传码0。因为这时计算出来的t1和t2以及交点都是没有任何意义的。
2) 3D平面
我们如何定义一个3D平面呢,看下图:
如果你认真看图了,那么无需我多说了,只要有一个点P0,和平面的法线向量n,就可以确定一个平面了。
定义:对于空间中的任意一点P,如果线段P->P0与法线向量n垂直,则点P在平面上。
还记得向量点积吗?其最最重要的性质就是其几何意义:可以确定两个向量之间的夹角。当两个向量的点积为0时,这两个向量互相垂直。
所以:n.(P->P0) = 0
展开:<a, b, c> . <x-x0, y-y0, z-z0> = 0