Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /trunk/src/lib/diderot.c
ViewVC logotype

Annotation of /trunk/src/lib/diderot.c

Parent Directory Parent Directory | Revision Log 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