ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/xf.c
Revision: 1.4
Committed: Thu Oct 5 07:54:31 1989 UTC (34 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.3: +65 -17 lines
Log Message:
Added iterate argument for arrays.

File Contents

# Content
1 /* Copyright (c) 1986 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * xf.c - routines to convert transform arguments into 4X4 matrix.
9 *
10 * 1/28/86
11 */
12
13
14 #define PI 3.14159265358979323846
15
16 #define checkarg(a,n) if (strcmp(av[i],a) || i+n >= ac) goto done
17
18
19 int
20 xf(retmat, retsca, ac, av) /* get transform specification */
21 double retmat[4][4];
22 double *retsca;
23 int ac;
24 char *av[];
25 {
26 double atof(), sin(), cos();
27 double xfmat[4][4], m4[4][4];
28 double xfsca, theta;
29 int i, j;
30 int rept;
31
32 setident4(retmat);
33 *retsca = 1.0;
34
35 rept = 1;
36 setident4(xfmat);
37 xfsca = 1.0;
38
39 for (i = 0; i < ac && av[i][0] == '-'; i++) {
40
41 setident4(m4);
42
43 switch (av[i][1]) {
44
45 case 't': /* translate */
46 checkarg("-t",3);
47 m4[3][0] = atof(av[++i]);
48 m4[3][1] = atof(av[++i]);
49 m4[3][2] = atof(av[++i]);
50 break;
51
52 case 'r': /* rotate */
53 switch (av[i][2]) {
54 case 'x':
55 checkarg("-rx",1);
56 theta = PI/180.0 * atof(av[++i]);
57 m4[1][1] = m4[2][2] = cos(theta);
58 m4[2][1] = -(m4[1][2] = sin(theta));
59 break;
60 case 'y':
61 checkarg("-ry",1);
62 theta = PI/180.0 * atof(av[++i]);
63 m4[0][0] = m4[2][2] = cos(theta);
64 m4[0][2] = -(m4[2][0] = sin(theta));
65 break;
66 case 'z':
67 checkarg("-rz",1);
68 theta = PI/180.0 * atof(av[++i]);
69 m4[0][0] = m4[1][1] = cos(theta);
70 m4[1][0] = -(m4[0][1] = sin(theta));
71 break;
72 default:
73 return(i);
74 }
75 break;
76
77 case 's': /* scale */
78 checkarg("-s",1);
79 xfsca *=
80 m4[0][0] =
81 m4[1][1] =
82 m4[2][2] = atof(av[++i]);
83 break;
84
85 case 'm': /* mirror */
86 switch (av[i][2]) {
87 case 'x':
88 checkarg("-mx",0);
89 xfsca *=
90 m4[0][0] = -1.0;
91 break;
92 case 'y':
93 checkarg("-my",0);
94 xfsca *=
95 m4[1][1] = -1.0;
96 break;
97 case 'z':
98 checkarg("-mz",0);
99 xfsca *=
100 m4[2][2] = -1.0;
101 break;
102 default:
103 return(i);
104 }
105 break;
106
107 case 'i': /* iterate */
108 checkarg("-i",1);
109 for (j = 0; j < rept; j++) {
110 multmat4(retmat, retmat, xfmat);
111 *retsca *= xfsca;
112 }
113 rept = atoi(av[++i]);
114 setident4(xfmat);
115 xfsca = 1.0;
116 break;
117
118 default:
119 return(i);
120
121 }
122 multmat4(xfmat, xfmat, m4);
123 }
124 done:
125 for (j = 0; j < rept; j++) {
126 multmat4(retmat, retmat, xfmat);
127 *retsca *= xfsca;
128 }
129 return(i);
130 }
131
132
133 #ifdef INVXF
134 int
135 invxf(retmat, retsca, ac, av) /* invert transform specification */
136 double retmat[4][4];
137 double *retsca;
138 int ac;
139 char *av[];
140 {
141 double atof(), sin(), cos();
142 double xfmat[4][4], m4[4][4];
143 double xfsca, theta;
144 int i, j;
145 int rept;
146
147 setident4(retmat);
148 *retsca = 1.0;
149
150 rept = 1;
151 setident4(xfmat);
152 xfsca = 1.0;
153
154 for (i = 0; i < ac && av[i][0] == '-'; i++) {
155
156 setident4(m4);
157
158 switch (av[i][1]) {
159
160 case 't': /* translate */
161 checkarg("-t",3);
162 m4[3][0] = -atof(av[++i]);
163 m4[3][1] = -atof(av[++i]);
164 m4[3][2] = -atof(av[++i]);
165 break;
166
167 case 'r': /* rotate */
168 switch (av[i][2]) {
169 case 'x':
170 checkarg("-rx",1);
171 theta = -PI/180.0 * atof(av[++i]);
172 m4[1][1] = m4[2][2] = cos(theta);
173 m4[2][1] = -(m4[1][2] = sin(theta));
174 break;
175 case 'y':
176 checkarg("-ry",1);
177 theta = -PI/180.0 * atof(av[++i]);
178 m4[0][0] = m4[2][2] = cos(theta);
179 m4[0][2] = -(m4[2][0] = sin(theta));
180 break;
181 case 'z':
182 checkarg("-rz",1);
183 theta = -PI/180.0 * atof(av[++i]);
184 m4[0][0] = m4[1][1] = cos(theta);
185 m4[1][0] = -(m4[0][1] = sin(theta));
186 break;
187 default:
188 return(i);
189 }
190 break;
191
192 case 's': /* scale */
193 checkarg("-s",1);
194 *xfsca *=
195 m4[0][0] =
196 m4[1][1] =
197 m4[2][2] = 1.0 / atof(av[++i]);
198 break;
199
200 case 'm': /* mirror */
201 switch (av[i][2]) {
202 case 'x':
203 checkarg("-mx",0);
204 *xfsca *=
205 m4[0][0] = -1.0;
206 break;
207 case 'y':
208 checkarg("-my",0);
209 *xfsca *=
210 m4[1][1] = -1.0;
211 break;
212 case 'z':
213 checkarg("-mz",0);
214 *xfsca *=
215 m4[2][2] = -1.0;
216 break;
217 default:
218 return(i);
219 }
220 break;
221
222 case 'i': /* iterate */
223 checkarg("-i",1);
224 for (j = 0; j < rept; j++) {
225 multmat4(retmat, xfmat, retmat);
226 *retsca *= xfsca;
227 }
228 rept = atoi(av[++i]);
229 setident4(xfmat);
230 xfsca = 1.0;
231 break;
232
233 default:
234 return(i);
235
236 }
237 multmat4(xfmat, m4, xfmat); /* left multiply */
238 }
239 done:
240 for (j = 0; j < rept; j++) {
241 multmat4(retmat, xfmat, retmat);
242 *retsca *= xfsca;
243 }
244 return(i);
245 }
246 #endif