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

# User Rev Content
1 greg 1.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 greg 1.4 #define checkarg(a,n) if (strcmp(av[i],a) || i+n >= ac) goto done
17 greg 1.1
18 greg 1.2
19 greg 1.1 int
20 greg 1.4 xf(retmat, retsca, ac, av) /* get transform specification */
21     double retmat[4][4];
22     double *retsca;
23 greg 1.1 int ac;
24     char *av[];
25     {
26     double atof(), sin(), cos();
27 greg 1.4 double xfmat[4][4], m4[4][4];
28     double xfsca, theta;
29     int i, j;
30     int rept;
31 greg 1.1
32 greg 1.4 setident4(retmat);
33     *retsca = 1.0;
34    
35     rept = 1;
36     setident4(xfmat);
37     xfsca = 1.0;
38    
39 greg 1.1 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 greg 1.2 checkarg("-t",3);
47 greg 1.1 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 greg 1.2 checkarg("-rx",1);
56 greg 1.1 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 greg 1.2 checkarg("-ry",1);
62 greg 1.3 theta = PI/180.0 * atof(av[++i]);
63 greg 1.1 m4[0][0] = m4[2][2] = cos(theta);
64     m4[0][2] = -(m4[2][0] = sin(theta));
65     break;
66     case 'z':
67 greg 1.2 checkarg("-rz",1);
68 greg 1.3 theta = PI/180.0 * atof(av[++i]);
69 greg 1.1 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 greg 1.2 checkarg("-s",1);
79 greg 1.4 xfsca *=
80 greg 1.1 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 greg 1.2 checkarg("-mx",0);
89 greg 1.4 xfsca *=
90 greg 1.1 m4[0][0] = -1.0;
91     break;
92     case 'y':
93 greg 1.2 checkarg("-my",0);
94 greg 1.4 xfsca *=
95 greg 1.1 m4[1][1] = -1.0;
96     break;
97     case 'z':
98 greg 1.2 checkarg("-mz",0);
99 greg 1.4 xfsca *=
100 greg 1.1 m4[2][2] = -1.0;
101     break;
102     default:
103     return(i);
104     }
105     break;
106    
107 greg 1.4 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 greg 1.1 default:
119     return(i);
120    
121     }
122     multmat4(xfmat, xfmat, m4);
123     }
124 greg 1.4 done:
125     for (j = 0; j < rept; j++) {
126     multmat4(retmat, retmat, xfmat);
127     *retsca *= xfsca;
128     }
129 greg 1.1 return(i);
130     }
131    
132    
133     #ifdef INVXF
134     int
135 greg 1.4 invxf(retmat, retsca, ac, av) /* invert transform specification */
136     double retmat[4][4];
137     double *retsca;
138 greg 1.1 int ac;
139     char *av[];
140     {
141     double atof(), sin(), cos();
142 greg 1.4 double xfmat[4][4], m4[4][4];
143     double xfsca, theta;
144     int i, j;
145     int rept;
146 greg 1.1
147 greg 1.4 setident4(retmat);
148     *retsca = 1.0;
149    
150     rept = 1;
151     setident4(xfmat);
152     xfsca = 1.0;
153    
154 greg 1.1 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 greg 1.2 checkarg("-t",3);
162 greg 1.1 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 greg 1.2 checkarg("-rx",1);
171 greg 1.1 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 greg 1.2 checkarg("-ry",1);
177 greg 1.1 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 greg 1.2 checkarg("-rz",1);
183 greg 1.1 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 greg 1.2 checkarg("-s",1);
194 greg 1.1 *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 greg 1.2 checkarg("-mx",0);
204 greg 1.1 *xfsca *=
205     m4[0][0] = -1.0;
206     break;
207     case 'y':
208 greg 1.2 checkarg("-my",0);
209 greg 1.1 *xfsca *=
210     m4[1][1] = -1.0;
211     break;
212     case 'z':
213 greg 1.2 checkarg("-mz",0);
214 greg 1.1 *xfsca *=
215     m4[2][2] = -1.0;
216     break;
217     default:
218     return(i);
219     }
220     break;
221    
222 greg 1.4 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 greg 1.1 default:
234     return(i);
235    
236     }
237     multmat4(xfmat, m4, xfmat); /* left multiply */
238 greg 1.4 }
239     done:
240     for (j = 0; j < rept; j++) {
241     multmat4(retmat, xfmat, retmat);
242     *retsca *= xfsca;
243 greg 1.1 }
244     return(i);
245     }
246     #endif