1 /*****************************************************************************
2 File : $Source: /projects/higgs1/SNNS/CVS/SNNS/xgui/sources/d3_anageo.c,v $
3 SHORTNAME : anageo.c
4 SNNS VERSION : 4.2
5
6 PURPOSE : matrix operations and cube operations
7 NOTES :
8
9 AUTHOR : Ralf Huebner
10 DATE : 1.12.1991
11
12 CHANGED BY : Sven Doering
13 RCS VERSION : $Revision: 2.7 $
14 LAST CHANGE : $Date: 1998/03/03 14:09:47 $
15
16 Copyright (c) 1990-1995 SNNS Group, IPVR, Univ. Stuttgart, FRG
17 Copyright (c) 1996-1998 SNNS Group, WSI, Univ. Tuebingen, FRG
18 ******************************************************************************/
19 #include <config.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <ctype.h>
23 #include <math.h>
24 #include <string.h>
25 #include <X11/Xlib.h>
26 #include <X11/Intrinsic.h>
27
28 #include "glob_typ.h"
29 #include "d3_global.h"
30
31 #include "d3_anageo.ph"
32
33
34
35 #ifdef _UNUSED_FUNCTIONS_
36
37 /*****************************************************************************
38 FUNCTION : d3_showVector
39
40 PURPOSE : writes a vector to stdout
41 RETURNS :
42 NOTES :
43
44 ******************************************************************************/
45
d3_showVector(vector v)46 static void d3_showVector (vector v)
47
48 {
49 fprintf (stdout, "%10.5f %10.5f %10.5f %10.5f\n",
50 v[0], v[1], v[2], v[3]);
51 }
52
53 #endif /* _UNUSED_UNCTIONS_ */
54
55
56
57
58 /*****************************************************************************
59 FUNCTION : e_matrix
60
61 PURPOSE : creates a unit matrix
62 RETURNS : unit matrix
63 NOTES :
64
65 ******************************************************************************/
66
e_matrix(matrix m)67 static void e_matrix (matrix m)
68 {
69 int i, j;
70
71 for (i=0; i<4; i++)
72 {
73 for (j=0; j<4; j++)
74 {
75 m[i][j] = 0.0;
76 if (i==j)
77 m[i][j] = 1.0;
78 }
79 }
80 }
81
82
83
84 /*****************************************************************************
85 FUNCTION : d3_transMatrix
86
87 PURPOSE : creates a translation matrix
88 RETURNS : translation matrix
89 NOTES :
90
91 ******************************************************************************/
92
d3_transMatrix(matrix m,vector v)93 void d3_transMatrix (matrix m, vector v)
94 {
95 e_matrix (m);
96 m[0][3] = v[0];
97 m[1][3] = v[1];
98 m[2][3] = v[2];
99 }
100
101
102
103
104 /*****************************************************************************
105 FUNCTION : d3_scaleMatrix
106
107 PURPOSE : creates a scale matrix
108 RETURNS : scale matrix
109 NOTES :
110
111 ******************************************************************************/
112
d3_scaleMatrix(matrix m,vector v)113 void d3_scaleMatrix (matrix m, vector v)
114 {
115 e_matrix (m);
116 m[0][0] = v[0];
117 m[1][1] = v[1];
118 m[2][2] = v[2];
119 }
120
121
122 /*****************************************************************************
123 FUNCTION : d3_rotateXmatrix
124
125 PURPOSE : creates a rotation matrix arround the X - axis
126 RETURNS : rotation matrix
127 NOTES :
128
129 *****************************************************************************/
130
d3_rotateXmatrix(matrix m,float phi)131 static void d3_rotateXmatrix (matrix m, float phi)
132
133 {
134 float sinus, cosinus;
135
136 e_matrix (m);
137 sinus = sin (phi);
138 cosinus = cos (phi);
139 m[1][1] = cosinus;
140 m[2][1] = sinus;
141 m[1][2] = -sinus;
142 m[2][2] = cosinus;
143 }
144
145
146
147
148 /*****************************************************************************
149 FUNCTION : d3_rotateYmatrix
150
151 PURPOSE : creates a rotation matrix arround the Y - axis
152 RETURNS : rotation matrix
153 NOTES :
154
155 *****************************************************************************/
156
d3_rotateYmatrix(matrix m,float phi)157 static void d3_rotateYmatrix (matrix m, float phi)
158 {
159 float sinus, cosinus;
160
161 e_matrix (m);
162 sinus = sin (phi);
163 cosinus = cos (phi);
164 m[0][0] = cosinus;
165 m[2][0] = sinus;
166 m[0][2] = -sinus;
167 m[2][2] = cosinus;
168 }
169
170
171
172
173
174 /*****************************************************************************
175 FUNCTION : d3_rotateZmatrix
176
177 PURPOSE : creates a rotation matrix arround the Z - axis
178 RETURNS : rotation matrix
179 NOTES :
180
181 ******************************************************************************/
d3_rotateZmatrix(matrix m,float phi)182 static void d3_rotateZmatrix (matrix m, float phi)
183 {
184 float sinus, cosinus;
185
186 e_matrix (m);
187 sinus = sin (phi);
188 cosinus = cos (phi);
189 m[0][0] = cosinus;
190 m[1][0] = sinus;
191 m[0][1] = -sinus;
192 m[1][1] = cosinus;
193 }
194
195
196
197
198 /*****************************************************************************
199 FUNCTION : d3_multMatrix
200
201 PURPOSE : multplies two matrices
202 RETURNS : the new matrix
203 NOTES : C = A * B
204
205 ******************************************************************************/
d3_multMatrix(matrix c,matrix a,matrix b)206 void d3_multMatrix (matrix c, matrix a, matrix b)
207 {
208 int i, j, k;
209 float s;
210
211 for (i=0; i<4; i++)
212 for (j=0; j<4; j++)
213 {
214 s = 0;
215 for (k=0; k<4; k++)
216 s += a[i][k] * b[k][j];
217 c[i][j] = s;
218 };
219 }
220
221
222
223 /*****************************************************************************
224 FUNCTION : d3_multMatrixVector
225
226 PURPOSE : multplies a matrix with a vector
227 RETURNS : the new vector
228 NOTES :
229
230 ******************************************************************************/
d3_multMatrixVector(vector u,matrix m,vector v)231 void d3_multMatrixVector (vector u, matrix m, vector v)
232 {
233 int i;
234
235 for (i=0; i<4; i++)
236 u[i] = m[i][0] * v[0] + m[i][1] * v[1] + m[i][2] * v[2] + m[i][3];
237 }
238
239
240
241
242
243 /*****************************************************************************
244 FUNCTION : d3_normalVector
245
246 PURPOSE : calculates the normal for a polygon
247 RETURNS : the normal
248 NOTES : only the first 3 vectors
249
250 ******************************************************************************/
d3_normalVector(vector nv,vector v1,vector v2,vector v3)251 void d3_normalVector (vector nv, vector v1, vector v2, vector v3)
252 {
253 int i;
254 vector v, w;
255
256 for (i=0; i<4; i++) {
257 v[i] = v2[i] - v1[i];
258 w[i] = v3[i] - v1[i];
259 }
260 nv[0] = v[1]*w[2] - v[2]*w[1];
261 nv[1] = v[2]*w[0] - v[0]*w[2];
262 nv[2] = v[0]*w[1] - v[1]*w[0];
263 nv[3] = sqrt (nv[0]*nv[0] + nv[1]*nv[1] + nv[2]*nv[2]);
264 }
265
266
267
268
269 /*****************************************************************************
270 FUNCTION : d3_rotateMatrix
271
272 PURPOSE : creates a rotation matrix arround all axes
273 RETURNS : the rotation matrix
274 NOTES :
275
276 ******************************************************************************/
d3_rotateMatrix(matrix m,vector v)277 void d3_rotateMatrix (matrix m, vector v)
278 {
279 matrix rot_x, rot_y, rot_z, temp;
280
281 d3_rotateXmatrix (rot_x,(float) v[0]);
282 d3_rotateYmatrix (rot_y,(float) v[1]);
283 d3_rotateZmatrix (rot_z,(float) v[2]);
284
285 d3_multMatrix (temp, rot_y, rot_x);
286 d3_multMatrix (m, rot_z, temp);
287 }
288
289
290
291 /*****************************************************************************
292 FUNCTION : d3_rotateCube
293
294 PURPOSE : rotates a cube arround all axes
295 RETURNS : the rotated cube
296 NOTES :
297
298 ******************************************************************************/
d3_rotateCube(cube c1,vector r,cube c2)299 void d3_rotateCube (cube c1, vector r, cube c2)
300 {
301 float a, b, c, d, e, f, g, h, j;
302 vector si, co;
303 int i;
304
305 for (i=0; i<3; i++)
306 {
307 si[i] = sin (r[i]);
308 co[i] = cos (r[i]);
309 }
310 a = co[1] * co[2];
311 b = co[1] * si[2];
312 c = -si[1];
313 d = si[0] * si[1] * co[2] - co[0] * si[2];
314 e = si[0] * si[1] * si[2] + co[0] * co[2];
315 f = si[0] * co[1];
316 g = co[0] * si[1] * co[2] + si[0] * si[2];
317 h = co[0] * si[1] * si[2] - si[0] * co[2];
318 j = co[0] * co[1];
319 for (i=0; i<ANZ_VECS; i++)
320 {
321 c1[i][0] = c2[i][0] * a + c2[i][1] * b + c2[i][2] * c;
322 c1[i][1] = c2[i][0] * d + c2[i][1] * e + c2[i][2] * f;
323 c1[i][2] = c2[i][0] * g + c2[i][1] * h + c2[i][2] * j;
324 }
325 }
326
327
328
329
330 /*****************************************************************************
331 FUNCTION : d3_shiftCube
332
333 PURPOSE : shifts a cube in the upper positive quadrant of the kordsys
334 RETURNS : the new cube
335 NOTES :
336
337 ******************************************************************************/
d3_shiftCube(cube c1,cube c2,float x,float y)338 void d3_shiftCube (cube c1, cube c2, float x, float y)
339 {
340 int i;
341
342 for (i=0; i<ANZ_VECS; i++) {
343 c1[i][0] = x + c2[i][0];
344 c1[i][1] = y + c2[i][1];
345 c1[i][2] = c2[i][2];
346 c1[i][3] = c2[i][3];
347 }
348 }
349
350
351
352
353 /*****************************************************************************
354 FUNCTION : d3_shiftVector
355
356 PURPOSE : shifts a vector in the upper positive quadrant of the kordsys
357 RETURNS : the new cube
358 NOTES :
359
360 ******************************************************************************/
d3_shiftVector(vector v1,vector v2,float x,float y)361 void d3_shiftVector (vector v1, vector v2, float x, float y)
362 {
363 v1[0] = x + v2[0];
364 v1[1] = y + v2[1];
365 v1[2] = v2[2];
366 v1[3] = v2[3];
367 }
368
369
370
371
372 /*****************************************************************************
373 FUNCTION : d3_projection
374
375 PURPOSE : central projection of a cube
376 RETURNS : the new cube
377 NOTES :
378
379 ******************************************************************************/
380
d3_projection(cube c1,vector observer,cube c)381 void d3_projection (cube c1, vector observer, cube c)
382 {
383 float zwis;
384 int i;
385
386 for (i=0; i<ANZ_VECS; i++) {
387 zwis = c[i][2] - observer [2];
388 c1[i][0] = observer [0] - observer [2] * (c[i][0] - observer [0]) / zwis;
389 c1[i][1] = observer [1] - observer [2] * (c[i][1] - observer [1]) / zwis;
390 }
391 }
392
393
394 /* end of file */
395 /* lines: */
396
397
398
399
400
401
402
403