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