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 14 - (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 : jhr 14 val nth : vec3f * int -> float
30 :    
31 : jhr 1 val zero : vec3f
32 :    
33 :     (* standard basis vectors *)
34 :     val e1 : vec3f
35 :     val e2 : vec3f
36 :     val e3 : vec3f
37 :    
38 :     val toString : vec3f -> string
39 :    
40 :     val neg : vec3f -> vec3f
41 :     val add : (vec3f * vec3f) -> vec3f
42 :     val sub : (vec3f * vec3f) -> vec3f
43 :     val mul : (vec3f * vec3f) -> vec3f
44 :    
45 :     val scale : (float * vec3f) -> vec3f
46 :    
47 :     (* adds (u, s, v) = u + s*v *)
48 :     val adds : (vec3f * float * vec3f) -> vec3f
49 :    
50 :     (* lerp (u, t, v) = (1-t)*u + t*v; we assume that 0 <= t <= 1 *)
51 :     val lerp : (vec3f * float * vec3f) -> vec3f
52 :    
53 :     val dot : (vec3f * vec3f) -> float
54 :     val cross : (vec3f * vec3f) -> vec3f
55 :     val normalize : vec3f -> vec3f
56 :     val length : vec3f -> float
57 :     val lengthSq : vec3f -> float (* length squared *)
58 :     val lengthAndDir : vec3f -> (float * vec3f) (* length and normal vector *)
59 :     val distanceSq : (vec3f * vec3f) -> float (* distance squared *)
60 :    
61 :     (* iterators *)
62 :     val map : (float -> 'a) -> vec3f -> {x : 'a, y : 'a, z : 'a}
63 :     val app : (float -> unit) -> vec3f -> unit
64 :    
65 :     (* rays *)
66 :     type rayf = {orig : vec3f, dir : vec3f}
67 :    
68 :     val rayToPoint : (rayf * float) -> vec3f
69 :    
70 :     end = struct
71 :    
72 :     structure Math = Real32.Math
73 :    
74 :     type float = FP.float
75 :    
76 : jhr 14 val epsilon : float = 1.0e~5
77 : jhr 1
78 : jhr 14 type vec3f = float Vec3.vec3
79 :     type vec4f = float Vec4.vec4
80 : jhr 1
81 :     open Vec3
82 :    
83 :     (* lift a 3D vector into homogeneous space *)
84 :     fun vector {x, y, z} : vec4f = {x=x, y=y, z=z, w=0.0}
85 :     fun point {x, y, z} : vec4f = {x=x, y=y, z=z, w=1.0}
86 :    
87 :     val zero : vec3f = {x=0.0, y = 0.0, z = 0.0}
88 :    
89 :     val e1 : vec3f = {x = 1.0, y = 0.0, z = 0.0}
90 :     val e2 : vec3f = {x = 0.0, y = 1.0, z = 0.0}
91 :     val e3 : vec3f = {x = 0.0, y = 0.0, z = 1.0}
92 :    
93 :     fun toString ({x, y, z} : vec3f) = concat[
94 :     "<", Real32.toString x, ",", Real32.toString y, ",", Real32.toString z, ">"
95 :     ]
96 :    
97 :     fun neg ({x, y, z} : vec3f) = {x = ~x, y = ~y, z = ~z}
98 :    
99 :     fun add ({x=x1, y=y1, z=z1} : vec3f, {x=x2, y=y2, z=z2}) =
100 :     {x=x1+x2, y=y1+y2, z=z1+z2}
101 :    
102 :     fun sub ({x=x1, y=y1, z=z1} : vec3f, {x=x2, y=y2, z=z2}) =
103 :     {x=x1-x2, y=y1-y2, z=z1-z2}
104 :    
105 :     fun mul ({x=x1, y=y1, z=z1} : vec3f, {x=x2, y=y2, z=z2}) =
106 :     {x=x1*x2, y=y1*y2, z=z1*z2}
107 :    
108 :     fun scale (s, {x, y, z} : vec3f) = {x = s*x, y = s*y, z = s*z}
109 :    
110 :     fun adds (v1, s, v2) = add(v1, scale(s, v2))
111 :    
112 :     fun lerp (v1, t, v2) = add(scale(1.0-t, v1), scale(t, v2))
113 :    
114 :     fun dot ({x=x1, y=y1, z=z1} : vec3f, {x=x2, y=y2, z=z2}) =
115 :     (x1*x2 + y1*y2 +z1*z2)
116 :    
117 :     fun cross ({x=x1, y=y1, z=z1} : vec3f, {x=x2, y=y2, z=z2}) = {
118 :     x = y1*z2 - z1*y2,
119 :     y = z1*x2 - x1*z2,
120 :     z = x1*y1 - y1*x2
121 :     }
122 :    
123 :     fun lengthSq (v : vec3f) = dot(v, v)
124 :    
125 :     fun length v = Math.sqrt(lengthSq v)
126 :    
127 :     fun distanceSq (u : vec3f, v) = lengthSq (sub (u, v))
128 :    
129 :     fun lengthAndDir (v as {x, y, z}) = let
130 :     val l = length v
131 :     in
132 :     if (l < epsilon)
133 : jhr 14 then (l, v)
134 :     else (l, scale(1.0 / l, v))
135 : jhr 1 end
136 :    
137 :     fun normalize v = #2(lengthAndDir v)
138 :    
139 :     (* rays *)
140 :     type rayf = {orig : vec3f, dir : vec3f}
141 :    
142 :     fun rayToPoint ({orig, dir}, s) = adds(orig, s, dir)
143 :    
144 :     end

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