回 帖 发 新 帖 刷新版面

主题:[讨论]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从而判断射线与三角面是否相交

回复列表 (共18个回复)

沙发

顶一下。
我的线性代数基本是白学了,现在除了知道矩阵乘法外很少知道其它东西。看这方面的文章很吃力。
就楼主这些文字,我看了半个多小时,总算是弄明白了(至少是我认为自己明白了)。
写下自己的理解。

判断一条射线是否与一个三角形相交。
设射线方程为f(t) = origin + dir * t;,其中origin表示射线的端点,dir表示射线的方向向量,t为非负实数,即t>=0。
设三角形所在平面方程为p(u, v) = v0 + u(v1-v0) + v(v2-v0),其中v0, v1, v2是三角形的三顶点,均是三维向量,(v1-v0)可表示顶点v0到顶点v1的方向,(v2-v0)表示顶点v0到顶点v2的方向。因为(v1-v0)和(v2-v0)不相交,可构成一个平面坐标系(但不一定是平面直角坐标系),于是u(v1-v0) + v(v2-v0) + v0就表示了一个平面。其中u, v为实数,如果u, v所表示的点在三角形内部(包括边界),则有0<=u<=1,0<=v<=1。
如果射线和三角形所在的平面相交,则方程f(t) = p(u, v)有解。
如何解这个方程呢?先将方程变形:
f(t) = p(u,v)
=> origin + dir * t = v0 + u(v1-v0) + v(v2-v0)
=> origin - v0    = u(v1 - v0) + u(v2 - v0) - t * dir
即(v1-v0) * u + (v2-v0) * v + dir * t = origin - v0
可以套上“V1 * x + V2 * y + V3 * z = B”的形式。u, v, t分别相当于这里的x, y, z。然后,分别计算D, D1, D2, D3,就可以得到x, y, z的值了。方程得解。
于是得到射线与三角形所在平面的交点。如果这个解满足t>=0且0<=u<=1且0<=v<=1,那么就说明射线与三角形相交。

由于复杂的三维图形都由简单的三角形构成,所以枚举一个复杂三维图形的每一三角形,看它们是否与一射线相交,就可以知道该复杂三维图形是否与该射线相交了。从而完成了“判定子弹是否会击中目标”的任务。

要点就在于楼主最先提出的那个推论,比起高斯消元法,使用向量运算可以更加充分的利用现有硬件的优势,更适合用于需要处理大量数据的计算机图形领域。

板凳

x
(V1,V2,V3)[ y ] = B
            z

3*3的矩阵求逆,飞快的吧,比起求混和积不是要快很多?直接消元多快

3 楼

[quote]x
(V1,V2,V3)[ y ] = B
            z

3*3的矩阵求逆,飞快的吧,比起求混和积不是要快很多?直接消元多快[/quote]

高!

4 楼

eastcowboy 也很高明

5 楼

哇,学计算机还要学线性代数?我最恨数学了,因为数学最没用,学数学,还不如学马列毛邓呢!

6 楼

[quote]哇,学计算机还要学线性代数?我最恨数学了,因为数学最没用,学数学,还不如学马列毛邓呢![/quote]
如果数学没有用,那么你现在还计算器、手机的什么都用不上,回原始社会吧

7 楼

顶楼主,加个精

8 楼

-_-|  真的看不懂上面的东西与CS有什么关系呢

9 楼

三维的平移啊旋转啊观察,都跟矩阵有关系,线代是最基础的了;我们专业是开的高代,差不多吧,到更高水平,抽象代数,近世代数就更恐怖了

10 楼

[quote]三维的平移啊旋转啊观察,都跟矩阵有关系,线代是最基础的了;我们专业是开的高代,差不多吧,到更高水平,抽象代数,近世代数就更恐怖了[/quote]
不错啊,这位朋友的数学真的是非常的不错啊,我们要向他学习,因为计算机学来学去还是学数学
[em8]

我来回复

您尚未登录,请登录后再回复。点此登录或注册