home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / lib / gprim / discgrp / util.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-28  |  1.2 KB  |  47 lines

  1. /* routines for making sure matrix is orthogonal in Minkowski metric */
  2. #include "3d.h"
  3.  
  4. /* row-orthogonalize an isometry of Minkowski space */
  5. void
  6. tuneup(Transform m1, int metric)
  7. {
  8.     int i,j,k;
  9.     float d; 
  10.     HPoint3 pt0;
  11.  
  12.     HPt3SpaceNormalize((HPoint3 *)m1[0], metric);
  13.  
  14.     HPt3SpaceGramSchmidt((HPoint3 *)m1[0], (HPoint3 *)m1[1], metric);
  15.     HPt3SpaceNormalize((HPoint3 *)m1[1], metric);
  16.  
  17.     HPt3SpaceGramSchmidt((HPoint3 *)m1[0], (HPoint3 *)m1[2], metric);
  18.     HPt3SpaceGramSchmidt((HPoint3 *)m1[1], (HPoint3 *)m1[2], metric);
  19.     HPt3SpaceNormalize((HPoint3 *)m1[2], metric);
  20.  
  21.     HPt3SpaceGramSchmidt((HPoint3 *)m1[0], (HPoint3 *)m1[3], metric);
  22.     HPt3SpaceGramSchmidt((HPoint3 *)m1[1], (HPoint3 *)m1[3], metric);
  23.     HPt3SpaceGramSchmidt((HPoint3 *)m1[2], (HPoint3 *)m1[3], metric);
  24.     HPt3SpaceNormalize((HPoint3 *)m1[3], metric);
  25.     
  26. }
  27.  
  28. /*  following only works now with hyperbolic mode */
  29. int
  30. needstuneup(Transform m1)
  31. {
  32.     int i,j,k;
  33.     float d;
  34.  
  35.     for (i=0; i<4; ++i)
  36.     for (j=i; j<4; ++j)
  37.         {
  38.             d =    m1[i][0] * m1[j][0] +
  39.         m1[i][1] * m1[j][1] +
  40.         m1[i][2] * m1[j][2] -
  41.         m1[i][3] * m1[j][3]; 
  42.         if (i == 3) d *= -1;
  43.         if (fabs ( d - ( i == j ) ) > .01 ) return (1);
  44.         }
  45.     return (0);
  46. }
  47.