SCM Repository
Annotation of /trunk/src/lib/diderot.c
Parent Directory
|
Revision Log
Revision 444 - (view) (download) (as text)
1 : | jhr | 439 | /*! \file diderot.c |
2 : | * | ||
3 : | * \author John Reppy | ||
4 : | */ | ||
5 : | |||
6 : | /* | ||
7 : | * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu) | ||
8 : | * All rights reserved. | ||
9 : | */ | ||
10 : | |||
11 : | #include "diderot.h" | ||
12 : | #include <teem/nrrd.h> | ||
13 : | |||
14 : | /* load image data from Nrrd files */ | ||
15 : | Status_t Diderot_LoadImage1D (Diderot_string_t name, Diderot_image1D_t *img); | ||
16 : | Status_t Diderot_LoadImage2D (Diderot_string_t name, Diderot_image2D_t *img); | ||
17 : | Status_t Diderot_LoadImage3D (Diderot_string_t name, Diderot_image3D_t *img) | ||
18 : | { | ||
19 : | Nrrd *nin = loadNrrdFile (name); | ||
20 : | |||
21 : | img->dim = 3; | ||
22 : | img->size[0] = nin->axis[0].size; | ||
23 : | img->size[1] = nin->axis[1].size; | ||
24 : | img->size[2] = nin->axis[2].size; | ||
25 : | img->data = nin->data; | ||
26 : | |||
27 : | loadTransformMatrix (nin, transformMatrix); | ||
28 : | InvertM (transformMatrix, inverseMatrix); | ||
29 : | |||
30 : | } | ||
31 : | |||
32 : | /* functions to get input-parameter values */ | ||
33 : | extern Status_t Diderot_InputString (const char *, const char **, bool); | ||
34 : | extern Status_t Diderot_InputReal (const char *, Diderot_real_t *, bool); | ||
35 : | extern Status_t Diderot_InputVec3 (const char *, Diderot_vec3_t *v); | ||
36 : | |||
37 : | /* Transformation matrix operations */ | ||
38 : | |||
39 : | STATIC_INLINE Diderot_real_t DetM3x3 ( | ||
40 : | Diderot_real_t a, Diderot_real_t b, Diderot_real_t c, | ||
41 : | Diderot_real_t d, Diderot_real_t e, Diderot_real_t f, | ||
42 : | Diderot_real_t g, Diderot_real_t h, Diderot_real_t i) | ||
43 : | { | ||
44 : | return ( (a)*(e)*(i) | ||
45 : | + (d)*(h)*(c) | ||
46 : | + (g)*(b)*(f) | ||
47 : | - (g)*(e)*(c) | ||
48 : | - (d)*(b)*(i) | ||
49 : | - (a)*(h)*(f)); | ||
50 : | } | ||
51 : | |||
52 : | jhr | 444 | Diderot_real_t DetM4x4 (Diderot_Mat4x4_t m) |
53 : | jhr | 439 | { |
54 : | return (m[ 0] * DetM3x3(m[ 5], m[ 6], m[ 7], | ||
55 : | m[ 9], m[10], m[11], | ||
56 : | m[13], m[14], m[15]) | ||
57 : | - m[ 1] * DetM3x3(m[ 4], m[ 6], m[ 7], | ||
58 : | m[ 8], m[10], m[11], | ||
59 : | m[12], m[14], m[15]) | ||
60 : | + m[ 2] * DetM3x3(m[ 4], m[ 5], m[ 7], | ||
61 : | m[ 8], m[ 9], m[11], | ||
62 : | m[12], m[13], m[15]) | ||
63 : | - m[ 3] * DetM3x3(m[ 4], m[ 5], m[ 6], | ||
64 : | m[ 8], m[ 9], m[10], | ||
65 : | m[12], m[13], m[14])); | ||
66 : | |||
67 : | jhr | 443 | } |
68 : | |||
69 : | /*! \brief compute the inverse of \arg m, storing the result in \arg i. | ||
70 : | * \param m the matrix to invert | ||
71 : | * \param i the inverted matrix | ||
72 : | */ | ||
73 : | jhr | 444 | void InvertM4x4 (Diderot_Mat4x4_t i, Diderot_Mat4x4_t m) |
74 : | jhr | 439 | { |
75 : | Diderot_real_t scale = 1.0 / DetM4x4(m); | ||
76 : | |||
77 : | i[0] = DetM3x3(m[5],m[ 6],m[ 7], | ||
78 : | m[ 9],m[10],m[11], | ||
79 : | m[13],m[14],m[15]) * scale; | ||
80 : | |||
81 : | i[ 1] = -DetM3x3(m[ 1],m[ 2],m[ 3], | ||
82 : | m[ 9],m[10],m[11], | ||
83 : | m[13],m[14],m[15]) * scale; | ||
84 : | |||
85 : | i[ 2] = DetM3x3(m[ 1],m[ 2],m[ 3], | ||
86 : | m[ 5],m[ 6],m[ 7], | ||
87 : | m[13],m[14],m[15]) * scale; | ||
88 : | |||
89 : | i[ 3] = -DetM3x3(m[ 1],m[ 2],m[ 3], | ||
90 : | m[ 5],m[ 6],m[ 7], | ||
91 : | m[ 9],m[10],m[11]) * scale; | ||
92 : | |||
93 : | i[ 4] = -DetM3x3(m[ 4],m[ 6],m[ 7], | ||
94 : | m[ 8],m[10],m[11], | ||
95 : | m[12],m[14],m[15]) * scale; | ||
96 : | |||
97 : | i[ 5] = DetM3x3(m[ 0],m[ 2],m[ 3], | ||
98 : | m[ 8],m[10],m[11], | ||
99 : | m[12],m[14],m[15]) * scale; | ||
100 : | |||
101 : | i[ 6] = -DetM3x3(m[ 0],m[ 2],m[ 3], | ||
102 : | m[ 4],m[ 6],m[ 7], | ||
103 : | m[12],m[14],m[15]) * scale; | ||
104 : | |||
105 : | i[ 7] = DetM3x3(m[ 0],m[ 2],m[ 3], | ||
106 : | m[ 4],m[ 6],m[ 7], | ||
107 : | m[ 8],m[10],m[11]) * scale; | ||
108 : | |||
109 : | i[ 8] = DetM3x3(m[ 4],m[ 5],m[ 7], | ||
110 : | m[ 8],m[ 9],m[11], | ||
111 : | m[12],m[13],m[15]) * scale; | ||
112 : | |||
113 : | i[ 9] = -DetM3x3(m[ 0],m[ 1],m[ 3], | ||
114 : | m[ 8],m[ 9],m[11], | ||
115 : | m[12],m[13],m[15]) * scale; | ||
116 : | |||
117 : | i[10] = DetM3x3(m[ 0],m[ 1],m[ 3], | ||
118 : | m[ 4],m[ 5],m[ 7], | ||
119 : | m[12],m[13],m[15]) * scale; | ||
120 : | |||
121 : | i[11] = -DetM3x3(m[ 0],m[ 1],m[ 3], | ||
122 : | m[ 4],m[ 5],m[ 7], | ||
123 : | m[ 8],m[ 9],m[11]) * scale; | ||
124 : | |||
125 : | i[12] = -DetM3x3(m[ 4],m[ 5],m[ 6], | ||
126 : | m[ 8],m[ 9],m[10], | ||
127 : | m[12],m[13],m[14]) * scale; | ||
128 : | |||
129 : | i[13] = DetM3x3(m[ 0],m[ 1],m[ 2], | ||
130 : | m[ 8],m[ 9],m[10], | ||
131 : | m[12],m[13],m[14]) * scale; | ||
132 : | |||
133 : | i[14] = -DetM3x3(m[ 0],m[ 1],m[ 2], | ||
134 : | m[ 4],m[ 5],m[ 6], | ||
135 : | m[12],m[13],m[14]) * scale; | ||
136 : | |||
137 : | i[15] = DetM3x3(m[ 0],m[ 1],m[ 2], | ||
138 : | m[ 4],m[ 5],m[ 6], | ||
139 : | m[ 8],m[ 9],m[10]) * scale; | ||
140 : | |||
141 : | } | ||
142 : | jhr | 443 | |
143 : | /*! \brief compute the inverse transpose of \arg m, storing the result in \arg i. | ||
144 : | * \param m the matrix to invert | ||
145 : | * \param i the inverted matrix | ||
146 : | */ | ||
147 : | void InvertTransposeM4x4 (Matrix4x4_t i, Matrix4x4_t m) | ||
148 : | { | ||
149 : | Diderot_real_t scale = 1.0 / DetM4x4(m); | ||
150 : | |||
151 : | i[0] = DetM3x3(m[5],m[ 6],m[ 7], | ||
152 : | m[ 9],m[10],m[11], | ||
153 : | m[13],m[14],m[15]) * scale; | ||
154 : | |||
155 : | i[ 4] = -DetM3x3(m[ 1],m[ 2],m[ 3], | ||
156 : | m[ 9],m[10],m[11], | ||
157 : | m[13],m[14],m[15]) * scale; | ||
158 : | |||
159 : | i[ 8] = DetM3x3(m[ 1],m[ 2],m[ 3], | ||
160 : | m[ 5],m[ 6],m[ 7], | ||
161 : | m[13],m[14],m[15]) * scale; | ||
162 : | |||
163 : | i[12] = -DetM3x3(m[ 1],m[ 2],m[ 3], | ||
164 : | m[ 5],m[ 6],m[ 7], | ||
165 : | m[ 9],m[10],m[11]) * scale; | ||
166 : | |||
167 : | i[ 1] = -DetM3x3(m[ 4],m[ 6],m[ 7], | ||
168 : | m[ 8],m[10],m[11], | ||
169 : | m[12],m[14],m[15]) * scale; | ||
170 : | |||
171 : | i[ 5] = DetM3x3(m[ 0],m[ 2],m[ 3], | ||
172 : | m[ 8],m[10],m[11], | ||
173 : | m[12],m[14],m[15]) * scale; | ||
174 : | |||
175 : | i[ 9] = -DetM3x3(m[ 0],m[ 2],m[ 3], | ||
176 : | m[ 4],m[ 6],m[ 7], | ||
177 : | m[12],m[14],m[15]) * scale; | ||
178 : | |||
179 : | i[ 7] = DetM3x3(m[ 0],m[ 2],m[ 3], | ||
180 : | m[ 4],m[ 6],m[ 7], | ||
181 : | m[ 8],m[10],m[11]) * scale; | ||
182 : | |||
183 : | i[ 2] = DetM3x3(m[ 4],m[ 5],m[ 7], | ||
184 : | m[ 8],m[ 9],m[11], | ||
185 : | m[12],m[13],m[15]) * scale; | ||
186 : | |||
187 : | i[ 6] = -DetM3x3(m[ 0],m[ 1],m[ 3], | ||
188 : | m[ 8],m[ 9],m[11], | ||
189 : | m[12],m[13],m[15]) * scale; | ||
190 : | |||
191 : | i[10] = DetM3x3(m[ 0],m[ 1],m[ 3], | ||
192 : | m[ 4],m[ 5],m[ 7], | ||
193 : | m[12],m[13],m[15]) * scale; | ||
194 : | |||
195 : | i[14] = -DetM3x3(m[ 0],m[ 1],m[ 3], | ||
196 : | m[ 4],m[ 5],m[ 7], | ||
197 : | m[ 8],m[ 9],m[11]) * scale; | ||
198 : | |||
199 : | i[ 3] = -DetM3x3(m[ 4],m[ 5],m[ 6], | ||
200 : | m[ 8],m[ 9],m[10], | ||
201 : | m[12],m[13],m[14]) * scale; | ||
202 : | |||
203 : | i[ 7] = DetM3x3(m[ 0],m[ 1],m[ 2], | ||
204 : | m[ 8],m[ 9],m[10], | ||
205 : | m[12],m[13],m[14]) * scale; | ||
206 : | |||
207 : | i[11] = -DetM3x3(m[ 0],m[ 1],m[ 2], | ||
208 : | m[ 4],m[ 5],m[ 6], | ||
209 : | m[12],m[13],m[14]) * scale; | ||
210 : | |||
211 : | i[15] = DetM3x3(m[ 0],m[ 1],m[ 2], | ||
212 : | m[ 4],m[ 5],m[ 6], | ||
213 : | m[ 8],m[ 9],m[10]) * scale; | ||
214 : | |||
215 : | } |
root@smlnj-gforge.cs.uchicago.edu | ViewVC Help |
Powered by ViewVC 1.0.0 |