Import Upstream version 20180207
[hcoop/debian/mlton.git] / regression / testMatrix.sml
1
2 exception Error
3
4 fun translateXYZ (translateX : real, translateY : real, translateZ : real) =
5 ((1.0, 0.0, 0.0, translateX),
6 (0.0, 1.0, 0.0, translateY),
7 (0.0, 0.0, 1.0, translateZ),
8 (0.0, 0.0, 0.0, 1.0))
9
10 fun transformPoint matr {x, y, z} =
11 let
12 val ((in00, in01, in02, in03),
13 (in10, in11, in12, in13),
14 (in20, in21, in22, in23),
15 (in30, in31, in32, in33)) = matr
16
17 val w = x * in30 + y * in31 + z * in32 + in33
18 in
19 if Real.== (0.0, w) then
20 raise Error
21 else
22 {x = ((in00 * x) + (in01 * y) + (in02 * z) + in03) / w,
23 y = ((in10 * x) + (in11 * y) + (in12 * z) + in13) / w,
24 z = ((in20 * x) + (in21 * y) + (in22 * z) + in23) / w}
25 end
26
27 fun Point3DToString {x, y, z} =
28 "{x = " ^ (Real.toString x) ^
29 ", y = " ^ (Real.toString y) ^
30 ", z = " ^ (Real.toString z) ^
31 "}\n"
32
33 val m = translateXYZ (2.0, 3.0, 4.0)
34 val p = {x = 1.0, y = 2.0, z = 3.0}
35 val _ = print (Point3DToString p)
36 val p' = transformPoint m p
37 val _ = print (Point3DToString p')