home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / lib / gprim / discgrp / vec4.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-02-16  |  2.9 KB  |  124 lines

  1. #include <math.h>
  2. typedef    double  point4[4];
  3. typedef    double  plane4[4];
  4. typedef    double  matrix4[4][4];
  5.  
  6. #define    ABS(aaa)    (( (aaa) > 0) ? (aaa) : -(aaa))
  7. #define    VDOT3(v0,v1)    (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2])
  8. #define    INPRO31(v0,v1)    (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3])
  9. #define    INPRO4(v0,v1)    (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3])
  10.  
  11. #define MAGNITUDE3(v0)    (sqrt (VDOT3(v0, v0)))
  12. #define MAGNITUDE31(v0)    (sqrt (ABS (INPRO31(v0, v0))))
  13. #define MAGNITUDE4(v0)    (sqrt (INPRO4(v0, v0)))
  14.  
  15. #define PROJECT4(v0)    \
  16.     {float d = v0[3];    \
  17.     if (d)    {    \
  18.     d = 1.0/d;    \
  19.     v0[0] = v0[0] * d;    \
  20.     v0[1] = v0[1] * d;    \
  21.     v0[2] = v0[2] * d;    \
  22.     v0[3] = 1.0; }}    
  23.  
  24. #define NORMALIZE3(v0)    \
  25.     {double xxx;        \
  26.     if (xxx = MAGNITUDE3(v0))    \
  27.     {v0[0] /= xxx;  v0[1] /= xxx;  v0[2] /= xxx; }  }
  28.  
  29. #define     NORMALIZE31(v)    \
  30.      {double tmp = INPRO31(v,v);        \
  31.     if (tmp) { tmp = 1.0/sqrt(ABS(tmp)); v[0] *= tmp; v[1] *= tmp; v[2] *= tmp; v[3] *= tmp; }}
  32.  
  33. #define     NORMALIZE4(v)    \
  34.      {double tmp = INPRO4(v,v);        \
  35.     if (tmp) { tmp = 1.0/sqrt(ABS(tmp)); v[0] *= tmp; v[1] *= tmp; v[2] *= tmp; v[3] *= tmp; }}
  36.  
  37. #define VPRINT3(name,v)        printf("name\t%f %f %f\n",v[0],v[1],v[2]);
  38. #define VPRINT4(name,v)        printf("name\t%f %f %f %f %f\n",v[0],v[1],v[2],v[3]);
  39. #define VADD3(v0,v1,v2)    \
  40.     {v2[0] = v0[0] + v1[0]; \
  41.     v2[1] = v0[1] + v1[1]; \
  42.     v2[2] = v0[2] + v1[2]; \
  43.     v2[3] = 1.0; }
  44.     
  45. #define VADD4(v0,v1,v2)    \
  46.     {v2[0] = v0[0] + v1[0]; \
  47.     v2[1] = v0[1] + v1[1]; \
  48.     v2[2] = v0[2] + v1[2]; \
  49.     v2[3] = v0[3] + v1[3]; }
  50.  
  51. #define VSUB3(v0,v1,v2)    \
  52.     {v2[0] = v0[0] - v1[0]; \
  53.     v2[1] = v0[1] - v1[1]; \
  54.     v2[2] = v0[2] - v1[2]; \
  55.     v2[3] = 1.0;}
  56.     
  57. #define VSUB4(v0,v1,v2)    \
  58.     {v2[0] = v0[0] - v1[0]; \
  59.     v2[1] = v0[1] - v1[1]; \
  60.     v2[2] = v0[2] - v1[2]; \
  61.     v2[3] = v0[3] - v1[3];}
  62.  
  63. #define MIDPOINT4(v0,v1,v2)    \
  64.     {v2[0] = (v0[0] + v1[0])/2.0; \
  65.     v2[1] = (v0[1] + v1[1])/2.0; \
  66.     v2[2] = (v0[2] + v1[2])/2.0; \
  67.     v2[3] = (v0[3] + v1[3])/2.0; }
  68.  
  69. #define VISZERO4(v)    (v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0)
  70.  
  71. #define MIDPOINT31(v0,v1,v2)    \
  72.     {float m00, m11, a,v3[4];    \
  73.     VSUB4(v0, v1, v3);    \
  74.     if (VISZERO4(v3))    \
  75.         VCOPY4(v0,v2)    \
  76.     else    {        \
  77.     m00 =  INPRO31(v0,v3);    \
  78.     m11 = INPRO31(v1,v3);    \
  79.     v2[0] = m11*v0[0] - m00*v1[0]; \
  80.     v2[1] = m11*v0[1] - m00*v1[1]; \
  81.     v2[2] = m11*v0[2] - m00*v1[2]; \
  82.     v2[3] = m11*v0[3] - m00*v1[3]; }}
  83.  
  84. #define XPRO3(v0,v1,v2)    \
  85.     {v2[0] = v0[1]*v1[2] - v0[2]*v1[1];    \
  86.     v2[1] = v0[2]*v1[0] - v0[0]*v1[2];    \
  87.     v2[2] = v0[0]*v1[1] - v0[1]*v1[0];  }
  88.  
  89. #define VSCALE3(v0, s, v1)    \
  90.     {v1[0] = s * v0[0];    \
  91.     v1[1] = s * v0[1];    \
  92.     v1[2] = s * v0[2];    }
  93.  
  94. #define VSCALE4(v0, s, v1)    \
  95.     {v1[0] = s * v0[0];    \
  96.     v1[1] = s * v0[1];    \
  97.     v1[2] = s * v0[2];    \
  98.     v1[3] = s * v0[3];    }
  99.  
  100. #define VCOPY3(v0, v1)    \
  101.     {v1[0] = v0[0];    \
  102.     v1[1] = v0[1];    \
  103.     v1[2] = v0[2];    }
  104.  
  105. #define VCOPY4(v0, v1)    \
  106.     {v1[0] = v0[0];    \
  107.     v1[1] = v0[1];    \
  108.     v1[2] = v0[2];    \
  109.     v1[3] = v0[3];}
  110.  
  111. #define VZERO3(v0)    \
  112.     {v0[0] = 0;    \
  113.     v0[1] = 0;    \
  114.     v0[2] = 0;    \
  115.     v0[3] = 1.0; }
  116.  
  117. #define COPYMAT4(m1, m2)    \
  118.     bcopy(m1, m2, (sizeof(double) * 16));
  119.  
  120.  
  121.  
  122.  
  123.  
  124.