Home My Page Projects Code Snippets Project Openings 3D graphics for Standard ML
Summary Activity SCM

SCM Repository

[sml3d] Annotation of /src/common/vec3f.sml
ViewVC logotype

Annotation of /src/common/vec3f.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (view) (download)
Original Path: src/math/vec3f.sml

1 : jhr 1 (* vec3f.sml
2 :     *
3 :     * COPYRIGHT (c) 2006 John Reppy (http://www.cs.uchicago.edu/~jhr)
4 :     * All rights reserved.
5 :     *
6 :     * Operations on vectors in R^3 (float version).
7 :     *)
8 :    
9 :     structure Vec3f : sig
10 :    
11 :     type float = FP.float
12 :    
13 :     type vec3f = {x : float, y : float, z : float}
14 :     type vec4f = {x : float, y : float, z : float, w : float}
15 :    
16 :     val unpack : vec3f -> (float * float * float)
17 :     val pack : (float * float * float) -> vec3f
18 :     val toList : vec3f -> float list
19 :    
20 :     (* functional update *)
21 :     val setX : vec3f * float -> vec3f
22 :     val setY : vec3f * float -> vec3f
23 :     val setZ : vec3f * float -> vec3f
24 :    
25 :     (* lift a 3D vector into homogeneous space *)
26 :     val vector : vec3f -> vec4f
27 :     val point : vec3f -> vec4f
28 :    
29 :     val zero : vec3f
30 :    
31 :     (* standard basis vectors *)
32 :     val e1 : vec3f
33 :     val e2 : vec3f
34 :     val e3 : vec3f
35 :    
36 :     val toString : vec3f -> string
37 :    
38 :     val neg : vec3f -> vec3f
39 :     val add : (vec3f * vec3f) -> vec3f
40 :     val sub : (vec3f * vec3f) -> vec3f
41 :     val mul : (vec3f * vec3f) -> vec3f
42 :    
43 :     val scale : (float * vec3f) -> vec3f
44 :    
45 :     (* adds (u, s, v) = u + s*v *)
46 :     val adds : (vec3f * float * vec3f) -> vec3f
47 :    
48 :     (* lerp (u, t, v) = (1-t)*u + t*v; we assume that 0 <= t <= 1 *)
49 :     val lerp : (vec3f * float * vec3f) -> vec3f
50 :    
51 :     val dot : (vec3f * vec3f) -> float
52 :     val cross : (vec3f * vec3f) -> vec3f
53 :     val normalize : vec3f -> vec3f
54 :     val length : vec3f -> float
55 :     val lengthSq : vec3f -> float (* length squared *)
56 :     val lengthAndDir : vec3f -> (float * vec3f) (* length and normal vector *)
57 :     val distanceSq : (vec3f * vec3f) -> float (* distance squared *)
58 :    
59 :     (* iterators *)
60 :     val map : (float -> 'a) -> vec3f -> {x : 'a, y : 'a, z : 'a}
61 :     val app : (float -> unit) -> vec3f -> unit
62 :    
63 :     (* rays *)
64 :     type rayf = {orig : vec3f, dir : vec3f}
65 :    
66 :     val rayToPoint : (rayf * float) -> vec3f
67 :    
68 :     end = struct
69 :    
70 :     structure Math = Real32.Math
71 :    
72 :     type float = FP.float
73 :    
74 :     val epsilon : float = 1.0e~6
75 :    
76 :     type vec3f = {x : float, y : float, z : float}
77 :    
78 :     type vec4f = {x : float, y : float, z : float, w : float}
79 :    
80 :     open Vec3
81 :    
82 :     (* lift a 3D vector into homogeneous space *)
83 :     fun vector {x, y, z} : vec4f = {x=x, y=y, z=z, w=0.0}
84 :     fun point {x, y, z} : vec4f = {x=x, y=y, z=z, w=1.0}
85 :    
86 :     val zero : vec3f = {x=0.0, y = 0.0, z = 0.0}
87 :    
88 :     val e1 : vec3f = {x = 1.0, y = 0.0, z = 0.0}
89 :     val e2 : vec3f = {x = 0.0, y = 1.0, z = 0.0}
90 :     val e3 : vec3f = {x = 0.0, y = 0.0, z = 1.0}
91 :    
92 :     fun toString ({x, y, z} : vec3f) = concat[
93 :     "<", Real32.toString x, ",", Real32.toString y, ",", Real32.toString z, ">"
94 :     ]
95 :    
96 :     fun neg ({x, y, z} : vec3f) = {x = ~x, y = ~y, z = ~z}
97 :    
98 :     fun add ({x=x1, y=y1, z=z1} : vec3f, {x=x2, y=y2, z=z2}) =
99 :     {x=x1+x2, y=y1+y2, z=z1+z2}
100 :    
101 :     fun sub ({x=x1, y=y1, z=z1} : vec3f, {x=x2, y=y2, z=z2}) =
102 :     {x=x1-x2, y=y1-y2, z=z1-z2}
103 :    
104 :     fun mul ({x=x1, y=y1, z=z1} : vec3f, {x=x2, y=y2, z=z2}) =
105 :     {x=x1*x2, y=y1*y2, z=z1*z2}
106 :    
107 :     fun scale (s, {x, y, z} : vec3f) = {x = s*x, y = s*y, z = s*z}
108 :    
109 :     fun adds (v1, s, v2) = add(v1, scale(s, v2))
110 :    
111 :     fun lerp (v1, t, v2) = add(scale(1.0-t, v1), scale(t, v2))
112 :    
113 :     fun dot ({x=x1, y=y1, z=z1} : vec3f, {x=x2, y=y2, z=z2}) =
114 :     (x1*x2 + y1*y2 +z1*z2)
115 :    
116 :     fun cross ({x=x1, y=y1, z=z1} : vec3f, {x=x2, y=y2, z=z2}) = {
117 :     x = y1*z2 - z1*y2,
118 :     y = z1*x2 - x1*z2,
119 :     z = x1*y1 - y1*x2
120 :     }
121 :    
122 :     fun lengthSq (v : vec3f) = dot(v, v)
123 :    
124 :     fun length v = Math.sqrt(lengthSq v)
125 :    
126 :     fun distanceSq (u : vec3f, v) = lengthSq (sub (u, v))
127 :    
128 :     fun lengthAndDir (v as {x, y, z}) = let
129 :     val l = length v
130 :     in
131 :     if (l < epsilon)
132 :     then (l, scale(1.0 / l, v))
133 :     else (l, v)
134 :     end
135 :    
136 :     fun normalize v = #2(lengthAndDir v)
137 :    
138 :     (* rays *)
139 :     type rayf = {orig : vec3f, dir : vec3f}
140 :    
141 :     fun rayToPoint ({orig, dir}, s) = adds(orig, s, dir)
142 :    
143 :     end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0