回 帖 发 新 帖 刷新版面

主题:[讨论]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个回复)

11 楼

楼主认识到这一点不错啊,会不会考虑下转到数学系来,呵~
我只能算是数学爱好者,算不上数学非常好,可能只是那点感觉挺好

不过说回来,数学专业的没工科的好找工作,练了一身的九阳神功,却不会使刀弄枪,上了战场还是不行~

12 楼

哇塞,如此说来,这位兄弟是数学专业的?看来本论坛里,论数学就您第一了,以后多多指点啊,嘿嘿,现在看图形学,一眼看过去全是微分方程,汗毛直竖啊!

13 楼

老一辈搞计算机的都是从数学学起,要说理论知识那是一套一套的。
现在很多所谓懂计算机的都只能编点应用软件了,比如我。现在其它方面体会还不深,但学计算机图形的话一定要熟悉线性代数的。

14 楼

不知AMD的3dnow技术是否也提供了类似向量乘法的指令?

15 楼

这个就不晓得了
[em8]

16 楼

[quote]3dnow技术[/quote]

技术?or CPU指令?

17 楼

[quote][quote]3dnow技术[/quote]

技术?or CPU指令?[/quote]

[em8][em8]哎,当然是一种指令了,学了这么多,我感觉自己还是很菜啊,我到底应该怎么办呢?[em8][em8]

18 楼

[quote][quote]3dnow技术[/quote]

技术?or CPU指令?[/quote]


[em8] 俺用词不当了,hoho
我看到intel的SSE就马上想到AMD的3dNow!了,估计应该有类似的指令。

我来回复

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