ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/xf.c
Revision: 1.5
Committed: Fri Oct 6 09:39:42 1989 UTC (34 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.4: +14 -22 lines
Log Message:
Iteration now given after transformation.

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