主题:[讨论]Cramer法则的Donald Knuth推论及其在计算机图形学中的应用
大家都知道,Cramer法则,是用于求解非齐次线性方程组的.一位逻辑学家Donald Knuth对克菜姆法则进行了推广,得出了解三元向量方程的方法,下面就是这一推论(我数学不好,论述不清楚,请见谅)
设有四个向量:V1,V2,V3,B
有 V1 * x + V2 * y + V3 * z = B (x,y,z是实数)
那么有:D = V1 · ( V2 X V3 )
D1 = B · ( V2 X V3 )
D2 = V3 · ( V1 X B )
D3 = V2 · ( V1 X B )
(·是点积,X是叉积)
x = D1 / D
y = D2 / D
z = D3 / D
这一推论的证明非常简单,把向量展开运用克菜姆法则就OK了(这里的向量都是三维向量)
大家一定会奇怪,这有什么用呢?计算机图形中,常常要解决向量的问题,INTEL的CPU专门为向量,矩阵的计算提供了SSE指令,所以,运用上面的推论比运用克菜姆法则在计算机运算中更有效率
一个例子:大家都玩过CS吧?当您按下鼠标时,枪里的子弹将飞向敌人,这是怎么实现的呢?
要知道,3D游戏里的模型全是由许许多多的三角形组成的,按下鼠标时,程序获取一个坐标点,根据这个点计算出一条射线,然后,遍历所有的敌人,看每一个敌人是否被击中,也就是判断是否有一个三角形与射线相交.
设射线的原点是origin, 方向是dir 于是得射线方程 f(t) = origin + dir * t
t是一个实数.
再假设一个三角形的三个点是v0, v1, v2 三角形所在平面的点可表示为p(u,v)
u,v是实数 p( u, v ) = v0 + (v1 - v0)*u + (v2 - v0)*v
u,v也叫重心坐标.
这样,假设射线与三角面相交于点p则有
f(t) = p(u,v)
origin + dir * t = v0 + (v1 - v0)*u + (v2 - v0)*v
=> origin - v0 = (v1 - v0)*u + (v2 - v0)*v - dir * t
好了,这就组成了一个三元一次向量方程,用上面的推论就可以解出u,v,t从而判断射线与三角面是否相交
设有四个向量:V1,V2,V3,B
有 V1 * x + V2 * y + V3 * z = B (x,y,z是实数)
那么有:D = V1 · ( V2 X V3 )
D1 = B · ( V2 X V3 )
D2 = V3 · ( V1 X B )
D3 = V2 · ( V1 X B )
(·是点积,X是叉积)
x = D1 / D
y = D2 / D
z = D3 / D
这一推论的证明非常简单,把向量展开运用克菜姆法则就OK了(这里的向量都是三维向量)
大家一定会奇怪,这有什么用呢?计算机图形中,常常要解决向量的问题,INTEL的CPU专门为向量,矩阵的计算提供了SSE指令,所以,运用上面的推论比运用克菜姆法则在计算机运算中更有效率
一个例子:大家都玩过CS吧?当您按下鼠标时,枪里的子弹将飞向敌人,这是怎么实现的呢?
要知道,3D游戏里的模型全是由许许多多的三角形组成的,按下鼠标时,程序获取一个坐标点,根据这个点计算出一条射线,然后,遍历所有的敌人,看每一个敌人是否被击中,也就是判断是否有一个三角形与射线相交.
设射线的原点是origin, 方向是dir 于是得射线方程 f(t) = origin + dir * t
t是一个实数.
再假设一个三角形的三个点是v0, v1, v2 三角形所在平面的点可表示为p(u,v)
u,v是实数 p( u, v ) = v0 + (v1 - v0)*u + (v2 - v0)*v
u,v也叫重心坐标.
这样,假设射线与三角面相交于点p则有
f(t) = p(u,v)
origin + dir * t = v0 + (v1 - v0)*u + (v2 - v0)*v
=> origin - v0 = (v1 - v0)*u + (v2 - v0)*v - dir * t
好了,这就组成了一个三元一次向量方程,用上面的推论就可以解出u,v,t从而判断射线与三角面是否相交