這段代碼添加了一個常量單位矩陣和幾個構造函數。默認的構造函數通過把單位矩陣傳遞給拷貝構造函數,將成員初始化為單位矩陣。第二個構造函數就是拷貝構造函數??截悩嬙旌瘮凳峭ㄟ^一個參數調用的構造函數,參數的類型與被構造的對象的類型相同??截悩嬙旌瘮祻椭茀档乃谐蓡T數據,所以被創(chuàng)建的對象與參數完全相同。最后一個構造函數接受4個參數,前3個參數是代表每個軸的向量,最后一個參數是代表原點的向量。
8.5.3 矩陣乘法和矩陣與向量的乘法
Matrix類最重要的方法是其乘法方法。乘法用于組合矩陣和頂點位置的變化。只有當第一個矩陣的寬度和第二個矩陣的高度相同時,才可以執(zhí)行矩陣乘法。矩陣乘法和矩陣與向量的乘法是使用相同的算法執(zhí)行的。
乘法的定義如下。
C是乘法的結果,i是矩陣A中的行數,k是矩陣B中的列數。j是i和k的可能的和的數量。在矩陣乘法中,相乘矩陣原來的形狀不同,結果矩陣的形狀也會不同。同樣,不要因為這些數學公式看上去讓人生畏而感到擔心,因為知道如何和何時使用矩陣才是這里最重要的。
在我們的矩陣中,如果包含了最后一列[0,0,0,1],那么它的寬度與高度相等。因此,根據矩陣乘法的定義,編寫矩陣乘法的代碼如下所示。
public static Matrix operator *(Matrix mA, Matrix mB)
{
Matrix result = new Matrix();
result._m11 = mA._m11 * mB._m11 + mA._m12 * mB._m21 + mA._m13 * mB._m31;
result._m12 = mA._m11 * mB._m12 + mA._m12 * mB._m22 + mA._m13 * mB._m32;
result._m13 = mA._m11 * mB._m13 + mA._m12 * mB._m23 + mA._m13 * mB._m33;
result._m21 = mA._m21 * mB._m11 + mA._m22 * mB._m21 + mA._m23 * mB._m31;
result._m22 = mA._m21 * mB._m12 + mA._m22 * mB._m22 + mA._m23 * mB._m32;
result._m23 = mA._m21 * mB._m13 + mA._m22 * mB._m23 + mA._m23 * mB._m33;
result._m31 = mA._m31 * mB._m11 + mA._m32 * mB._m21 + mA._m33 * mB._m31;
result._m32 = mA._m31 * mB._m12 + mA._m32 * mB._m22 + mA._m33 * mB._m32;
result._m33 = mA._m31 * mB._m13 + mA._m32 * mB._m23 + mA._m33 * mB._m33;
result._m41 = mA._m41 * mB._m11 + mA._m42 * mB._m21 + mA._m43 * mA._m31 +
mB._m41;
result._m42 = mA._m41 * mB._m12 + mA._m42 * mB._m22 + mA._m43 * mB._m32 +
mB._m42;
result._m43 = mA._m41 * mB._m13 + mA._m42 * mB._m23 + mA._m43 * mB._m33 +
mB._m43;
return result;
}
向量與矩陣的乘法類似。
public static Vector operator *(Vector v, Matrix m)
{
return new Vector(v.X * m._m11 + v.Y * m._m21 + v.Z * m._m31 + m._m41,
v.X * m._m12 + v.Y * m._m22 + v.Z * m._m32 + m._m42,
v.X * m._m13 + v.Y * m._m23 + v.Z * m._m33 + m._m43);
}