1 type Matrix4<T> = struct 2 m11 : T 3 m12 : T 4 m13 : T 5 m14 : T 6 m21 : T 7 m22 : T 8 m23 : T 9 m24 : T 10 m31 : T 11 m32 : T 12 m33 : T 13 m34 : T 14 m41 : T 15 m42 : T 16 m43 : T 17 m44 : T 18 19 def transpose = Matrix4 m11 m21 m31 m41 20 m12 m22 m32 m42 21 m13 m23 m33 m43 22 m14 m24 m34 m44 23 24 def to_string = 25 "$m11 $m12 $m13 $m14 $m21 $m22 $m23 $m24 $m31 $m32 $m33 $m34 $m41 $m42 $m43 $m44" 26 27 def display = 28 "$m11 $m12 $m13 $m14\n$m21 $m22 $m23 $m24\n$m31 $m32 $m33 $m34\n$m41 $m42 $m43 $m44" 29 30 type Matrix4<T> where T : Number 31 def (*) rhs = 32 let r11 = m11 * rhs.m11 + m12 * rhs.m21 + m13 * rhs.m31 + m14 * rhs.m41 33 let r12 = m11 * rhs.m12 + m12 * rhs.m22 + m13 * rhs.m32 + m14 * rhs.m42 34 let r13 = m11 * rhs.m13 + m12 * rhs.m23 + m13 * rhs.m33 + m14 * rhs.m43 35 let r14 = m11 * rhs.m14 + m12 * rhs.m24 + m13 * rhs.m34 + m14 * rhs.m44 36 let r21 = m21 * rhs.m11 + m22 * rhs.m21 + m23 * rhs.m31 + m24 * rhs.m41 37 let r22 = m21 * rhs.m12 + m22 * rhs.m22 + m23 * rhs.m32 + m24 * rhs.m42 38 let r23 = m21 * rhs.m13 + m22 * rhs.m23 + m23 * rhs.m33 + m24 * rhs.m43 39 let r24 = m21 * rhs.m14 + m22 * rhs.m24 + m23 * rhs.m34 + m24 * rhs.m44 40 let r31 = m31 * rhs.m11 + m32 * rhs.m21 + m33 * rhs.m31 + m34 * rhs.m41 41 let r32 = m31 * rhs.m12 + m32 * rhs.m22 + m33 * rhs.m32 + m34 * rhs.m42 42 let r33 = m31 * rhs.m13 + m32 * rhs.m23 + m33 * rhs.m33 + m34 * rhs.m43 43 let r34 = m31 * rhs.m14 + m32 * rhs.m24 + m33 * rhs.m34 + m34 * rhs.m44 44 let r41 = m41 * rhs.m11 + m42 * rhs.m21 + m43 * rhs.m31 + m44 * rhs.m41 45 let r42 = m41 * rhs.m12 + m42 * rhs.m22 + m43 * rhs.m32 + m44 * rhs.m42 46 let r43 = m41 * rhs.m13 + m42 * rhs.m23 + m43 * rhs.m33 + m44 * rhs.m43 47 let r44 = m41 * rhs.m14 + m42 * rhs.m24 + m43 * rhs.m34 + m44 * rhs.m44 48 49 Matrix4 r11 r12 r13 r14 50 r21 r22 r23 r24 51 r31 r32 r33 r34 52 r41 r42 r43 r44 53 54 def (*) (rhs : Vector4<T>) = 55 let x = m11 * rhs.x + m12 * rhs.y + m13 * rhs.z + m14 * rhs.w 56 let y = m21 * rhs.x + m22 * rhs.y + m23 * rhs.z + m24 * rhs.w 57 let z = m31 * rhs.x + m32 * rhs.y + m33 * rhs.z + m34 * rhs.w 58 let w = m41 * rhs.x + m42 * rhs.y + m43 * rhs.z + m44 * rhs.w 59 60 Vector4 x y z w 61 62 def (/) (rhs : T) = 63 let r11 = m11 / rhs 64 let r12 = m12 / rhs 65 let r13 = m13 / rhs 66 let r14 = m14 / rhs 67 let r21 = m21 / rhs 68 let r22 = m22 / rhs 69 let r23 = m23 / rhs 70 let r24 = m24 / rhs 71 let r31 = m31 / rhs 72 let r32 = m32 / rhs 73 let r33 = m33 / rhs 74 let r34 = m34 / rhs 75 let r41 = m41 / rhs 76 let r42 = m42 / rhs 77 let r43 = m43 / rhs 78 let r44 = m44 / rhs 79 80 Matrix4 r11 r12 r13 r14 81 r21 r22 r23 r24 82 r31 r32 r33 r34 83 r41 r42 r43 r44 84 85 def rotation = Matrix3 m11 m12 m13 86 m21 m22 m23 87 m31 m32 m33 88 89 def determinant = 90 let b = Matrix3 m22 m23 m24 m32 m33 m34 m42 m43 m44 91 let c = Matrix3 m21 m23 m24 m31 m33 m34 m41 m43 m44 92 let d = Matrix3 m21 m22 m24 m31 m32 m34 m41 m42 m44 93 let e = Matrix3 m21 m22 m23 m31 m32 m33 m41 m42 m43 94 let db = b.determinant 95 let dc = c.determinant 96 let dd = d.determinant 97 let de = e.determinant 98 99 m11 * db - m12 * dc + m13 * dd - m14 * de 100 101 def adjugate = 102 let r11 = -m24 * m33 * m42 103 + m23 * m34 * m42 104 + m24 * m32 * m43 105 - m22 * m34 * m43 106 - m23 * m32 * m44 107 + m22 * m33 * m44 108 let r12 = m14 * m33 * m42 109 - m13 * m34 * m42 110 - m14 * m32 * m43 111 + m12 * m34 * m43 112 + m13 * m32 * m44 113 - m12 * m33 * m44 114 let r13 = -m14 * m23 * m42 115 + m13 * m24 * m42 116 + m14 * m22 * m43 117 - m12 * m24 * m43 118 - m13 * m22 * m44 119 + m12 * m23 * m44 120 let r14 = m14 * m23 * m32 121 - m13 * m24 * m32 122 - m14 * m22 * m33 123 + m12 * m24 * m33 124 + m13 * m22 * m34 125 - m12 * m23 * m34 126 let r21 = m24 * m33 * m41 127 - m23 * m34 * m41 128 - m24 * m31 * m43 129 + m21 * m34 * m43 130 + m23 * m31 * m44 131 - m21 * m33 * m44 132 let r22 = -m14 * m33 * m41 133 + m13 * m34 * m41 134 + m14 * m31 * m43 135 - m11 * m34 * m43 136 - m13 * m31 * m44 137 + m11 * m33 * m44 138 let r23 = m14 * m23 * m41 139 - m13 * m24 * m41 140 - m14 * m21 * m43 141 + m11 * m24 * m43 142 + m13 * m21 * m44 143 - m11 * m23 * m44 144 let r24 = -m14 * m23 * m31 145 + m13 * m24 * m31 146 + m14 * m21 * m33 147 - m11 * m24 * m33 148 - m13 * m21 * m34 149 + m11 * m23 * m34 150 let r31 = -m24 * m32 * m41 151 + m22 * m34 * m41 152 + m24 * m31 * m42 153 - m21 * m34 * m42 154 - m22 * m31 * m44 155 + m21 * m32 * m44 156 let r32 = m14 * m32 * m41 157 - m12 * m34 * m41 158 - m14 * m31 * m42 159 + m11 * m34 * m42 160 + m12 * m31 * m44 161 - m11 * m32 * m44 162 let r33 = -m14 * m22 * m41 163 + m12 * m24 * m41 164 + m14 * m21 * m42 165 - m11 * m24 * m42 166 - m12 * m21 * m44 167 + m11 * m22 * m44 168 let r34 = m14 * m22 * m31 169 - m12 * m24 * m31 170 - m14 * m21 * m32 171 + m11 * m24 * m32 172 + m12 * m21 * m34 173 - m11 * m22 * m34 174 let r41 = m23 * m32 * m41 175 - m22 * m33 * m41 176 - m23 * m31 * m42 177 + m21 * m33 * m42 178 + m22 * m31 * m43 179 - m21 * m32 * m43 180 let r42 = -m13 * m32 * m41 181 + m12 * m33 * m41 182 + m13 * m31 * m42 183 - m11 * m33 * m42 184 - m12 * m31 * m43 185 + m11 * m32 * m43 186 let r43 = m13 * m22 * m41 187 - m12 * m23 * m41 188 - m13 * m21 * m42 189 + m11 * m23 * m42 190 + m12 * m21 * m43 191 - m11 * m22 * m43 192 let r44 = -m13 * m22 * m31 193 + m12 * m23 * m31 194 + m13 * m21 * m32 195 - m11 * m23 * m32 196 - m12 * m21 * m33 197 + m11 * m22 * m33 198 199 Matrix4 r11 r12 r13 r14 200 r21 r22 r23 r24 201 r31 r32 r33 r34 202 r41 r42 r43 r44 203 204 type Matrix4<T> where T : Real 205 def inverse = adjugate / determinant 206 207 type Matrix3<T> where T : Number 208 def to_matrix4 = Matrix4<T> m11 m12 m13 0 209 m21 m22 m23 0 210 m31 m32 m33 0 211 0 0 0 1 212 213 object Matrix4<T> = 214 val identity = Matrix4<T> 1 0 0 0 215 0 1 0 0 216 0 0 1 0 217 0 0 0 1 218 219 object Matrix4 = 220 def parse (s : String) = 221 let xs = s.split ' ' |> map { f32.parse _ } 222 223 Matrix4 xs[0] xs[1] xs[2] xs[3] 224 xs[4] xs[5] xs[6] xs[7] 225 xs[8] xs[9] xs[10] xs[11] 226 xs[12] xs[13] xs[14] xs[15] 227