home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / atomart.tar.gz / atomart.tar / matrix.c < prev    next >
C/C++ Source or Header  |  1990-06-14  |  3KB  |  104 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include "atomart.h"
  4.  
  5. /*
  6.  * mcpy4
  7.  *
  8.  *    copies 4 by 4 matrix m2 into m1
  9.  */
  10. void
  11. mcpy4(m1, m2)
  12.     register float    *m1, *m2;
  13. {
  14.     register float    *fin;
  15.  
  16.     fin = m1 + 16;
  17.     while (m1 != fin)
  18.         *m1++ = *m2++;
  19. }
  20.  
  21. /*
  22.  * mident4
  23.  *
  24.  *    set m to a 4 by 4 identity matrix
  25.  */
  26. void
  27. mident4(m)
  28.     register float    *m;
  29. {
  30.     register float    *fin, *m1;
  31.  
  32.     m1 = m;
  33.     fin = m + 16;
  34.     while (m != fin)
  35.         *m++ = 0;
  36.  
  37.     m1[0] = 1.0;
  38.     m1[5] = 1.0;
  39.     m1[10] = 1.0;
  40.     m1[15] = 1.0;
  41. }
  42.  
  43. /*
  44.  * mmult4
  45.  *
  46.  *    mulitiplies four by four matrix m3 by m2, leaving result in
  47.  * m1.
  48.  *
  49.  */
  50. void
  51. mmult4(m1, m2, m3)
  52.     register float    m1[4][4], m2[4][4], m3[4][4];
  53. {
  54.     m1[0][0] = m2[0][0] * m3[0][0] + m2[0][1] * m3[1][0] + m2[0][2] * m3[2][0] + m2[0][3] * m3[3][0];
  55.     m1[0][1] = m2[0][0] * m3[0][1] + m2[0][1] * m3[1][1] + m2[0][2] * m3[2][1] + m2[0][3] * m3[3][1];
  56.     m1[0][2] = m2[0][0] * m3[0][2] + m2[0][1] * m3[1][2] + m2[0][2] * m3[2][2] + m2[0][3] * m3[3][2];
  57.     m1[0][3] = m2[0][0] * m3[0][3] + m2[0][1] * m3[1][3] + m2[0][2] * m3[2][3] + m2[0][3] * m3[3][3];
  58.     m1[1][0] = m2[1][0] * m3[0][0] + m2[1][1] * m3[1][0] + m2[1][2] * m3[2][0] + m2[1][3] * m3[3][0];
  59.     m1[1][1] = m2[1][0] * m3[0][1] + m2[1][1] * m3[1][1] + m2[1][2] * m3[2][1] + m2[1][3] * m3[3][1];
  60.     m1[1][2] = m2[1][0] * m3[0][2] + m2[1][1] * m3[1][2] + m2[1][2] * m3[2][2] + m2[1][3] * m3[3][2];
  61.     m1[1][3] = m2[1][0] * m3[0][3] + m2[1][1] * m3[1][3] + m2[1][2] * m3[2][3] + m2[1][3] * m3[3][3];
  62.     m1[2][0] = m2[2][0] * m3[0][0] + m2[2][1] * m3[1][0] + m2[2][2] * m3[2][0] + m2[2][3] * m3[3][0];
  63.     m1[2][1] = m2[2][0] * m3[0][1] + m2[2][1] * m3[1][1] + m2[2][2] * m3[2][1] + m2[2][3] * m3[3][1];
  64.     m1[2][2] = m2[2][0] * m3[0][2] + m2[2][1] * m3[1][2] + m2[2][2] * m3[2][2] + m2[2][3] * m3[3][2];
  65.     m1[2][3] = m2[2][0] * m3[0][3] + m2[2][1] * m3[1][3] + m2[2][2] * m3[2][3] + m2[2][3] * m3[3][3];
  66.     m1[3][0] = m2[3][0] * m3[0][0] + m2[3][1] * m3[1][0] + m2[3][2] * m3[2][0] + m2[3][3] * m3[3][0];
  67.     m1[3][1] = m2[3][0] * m3[0][1] + m2[3][1] * m3[1][1] + m2[3][2] * m3[2][1] + m2[3][3] * m3[3][1];
  68.     m1[3][2] = m2[3][0] * m3[0][2] + m2[3][1] * m3[1][2] + m2[3][2] * m3[2][2] + m2[3][3] * m3[3][2];
  69.     m1[3][3] = m2[3][0] * m3[0][3] + m2[3][1] * m3[1][3] + m2[3][2] * m3[2][3] + m2[3][3] * m3[3][3];
  70. }
  71.  
  72. /*
  73.  * smult4
  74.  *
  75.  *    multiply a 4 by 4 matrix by the scalar s
  76.  *
  77.  */
  78. smult4(m, s)
  79.     register float    *m;
  80.     register float    s;
  81. {
  82.     register float    *fin;
  83.  
  84.     fin = m + 16;
  85.     while (m != fin)
  86.         *m++ *= s;
  87. }
  88.  
  89. /*
  90.  * printmatrix
  91.  *
  92.  *    print out a 4 by 4 matrix.
  93.  */
  94. printmatrix(m)
  95.     matrix    m;
  96. {
  97.     printf("matrix %x\n", m);
  98.  
  99.     printf("%e %e %e %e\n", m[0][0], m[0][1], m[0][2], m[0][3]);
  100.     printf("%e %e %e %e\n", m[1][0], m[1][1], m[1][2], m[1][3]);
  101.     printf("%e %e %e %e\n", m[2][0], m[2][1], m[2][2], m[2][3]);
  102.     printf("%e %e %e %e\n", m[3][0], m[3][1], m[3][2], m[3][3]);
  103. }
  104.