1 module matrix 2 3 let are_similar (x : f32) (y : f32) = x / y - 1 |> abs < 0.001 4 5 let are_similar (u : Vector4<f32>) (v : Vector4<f32>) = 6 are_similar u.x v.x && are_similar u.y v.y 7 && are_similar u.z v.z && are_similar u.w v.w 8 9 do # times 10 let rotate_matrix = rotate_y (f32.pi / 2) 11 let translate_matrix = translate 5 6 7 12 let matrix = translate_matrix * rotate_matrix 13 let v = Vector4 1 2 3 1 14 15 let result = matrix * v 16 17 assert are_similar result (Vector4 8 8 6 1) 18 19 do # times_order 20 let rotate_matrix = rotate_y (f32.pi / 2) 21 let translate_matrix = translate 5 6 7 22 let matrix = translate_matrix * rotate_matrix 23 let v = Vector4 1 2 3 1 24 25 let rotate_result = rotate_matrix * v 26 let translate_result = translate_matrix * rotate_result 27 let result = matrix * v 28 29 assert are_similar result translate_result 30 31 do # inverse 32 let rotate_matrix = rotate_y (f32.pi / 2) 33 let translate_matrix = translate 5 6 7 34 let matrix = translate_matrix * rotate_matrix 35 let v = Vector4 1 2 3 1 36 37 let forward = matrix * v 38 let backward = matrix.inverse * forward 39 40 assert are_similar backward v 41