home *** CD-ROM | disk | FTP | other *** search
/ Boldly Go Collection / version40.iso / TS / 17A / DRWIN101.ZIP / LINUTIL.C < prev    next >
C/C++ Source or Header  |  1991-07-23  |  4KB  |  154 lines

  1. #include "linutil.h"
  2.  
  3.  
  4. vec3 zero3={0.0,0.0,0.0};              /*zero vector, duh?*/
  5. bas3 eucl3={                           /*euclidean basis*/
  6.   {1.0,0.0,0.0},                       /*e0*/
  7.   {0.0,1.0,0.0},                       /*e1*/
  8.   {0.0,0.0,1.0}                        /*e2*/
  9. };
  10.  
  11. double *vset(vec3 u,double a,double b,double c) /*sets vector's components*/
  12. {
  13.   u[0]=a;
  14.   u[1]=b;
  15.   u[2]=c;
  16.   return u;
  17. }   /*vset*/
  18.  
  19.  
  20. double dot(vec3 u,vec3 v)              /*returns scalar dot product*/
  21. {
  22.   return u[0]*v[0]+u[1]*v[1]+u[2]*v[2];  /*u.v*/
  23. }   /*dot*/
  24.  
  25.  
  26. double *vadd(vec3 u,vec3 v,vec3 w)     /*add two vectors*/
  27. {
  28.   w[0]=u[0]+v[0];
  29.   w[1]=u[1]+v[1];
  30.   w[2]=u[2]+v[2];
  31.   return w;
  32. }   /*vadd*/
  33.  
  34.  
  35. double *vsub(vec3 u,vec3 v,vec3 w)     /*subtract two vectors*/
  36. {
  37.   w[0]=u[0]-v[0];
  38.   w[1]=u[1]-v[1];
  39.   w[2]=u[2]-v[2];
  40.   return w;
  41. }   /*vsub*/
  42.  
  43.  
  44. double *vneg(vec3 u,vec3 v)            /*negate vector*/
  45. {
  46.   v[0]=-u[0];
  47.   v[1]=-u[1];
  48.   v[2]=-u[2];
  49.   return v;
  50. }   /*vneg*/
  51.  
  52.  
  53. double *vmul(double a,vec3 u,vec3 v)   /*multiply vector by scalar*/
  54. {
  55.   v[0]=a*u[0];
  56.   v[1]=a*u[1];
  57.   v[2]=a*u[2];
  58.   return v;
  59. }   /*vmul*/
  60.  
  61.  
  62.  
  63. vec3 *rotb(double deg,int axis,bas3 b)  /*rotates basis around axis*/
  64. {
  65.   int a1,a2;                           /*other two axes*/
  66.   double t,s,c;                        /*temp, sine, cosine*/
  67.  
  68.   deg/=180.0;                          /*turn into radians*/
  69.   deg*=PI;
  70.   s=sin(deg);                          /*get sine/cosine*/
  71.   c=cos(deg);
  72.   if (axis==1) { a1=2; a2=3; }         /*set up other two axes*/
  73.   else if (axis==2) { a1=3; a2=1; }
  74.   else { axis=3; a1=1; a2=2; }
  75.  
  76.   t=b[a1][0];
  77.     b[a1][0]=c*b[a1][0]+s*b[a2][0];
  78.     b[a2][0]=c*b[a2][0]-s*t;
  79.   t=b[a1][1];
  80.     b[a1][1]=c*b[a1][1]+s*b[a2][1];
  81.     b[a2][1]=c*b[a2][1]-s*t;
  82.   t=b[a1][2];
  83.     b[a1][2]=c*b[a1][2]+s*b[a2][2];
  84.     b[a2][2]=c*b[a2][2]-s*t;
  85.   return b;
  86. }   /*rotb*/
  87.  
  88.  
  89. double *vdotb(vec3 v,bas3 b,vec3 d)    /*dots v against each vector in b*/
  90. {
  91.   d[0]=DOT(v,b[0]);
  92.   d[1]=DOT(v,b[1]);
  93.   d[2]=DOT(v,b[2]);
  94.   return d;
  95. }   /*vdotb*/
  96.  
  97.  
  98. int  vangles(vec3 r,double *a1,double *a2,bas3 b)
  99. {
  100.   vec3 dotv;                           /*holds dots with basis vectors*/
  101.   vdotb(r,b,dotv);                     /*get dots with each basis vector*/
  102.   if (dotv[0]==0.0) {                  /*if in plane of forward looking..*/
  103.     *a1=PI/2.0;                        /*..set each to*/
  104.     *a2=PI/2.0;                        /*..90 degrees*/
  105.   }
  106.   else {                               /*otherwise..*/
  107.     *a1=atan(dotv[1]/dotv[0]);         /*..get angle to y-axis*/
  108.     *a2=atan(dotv[2]/dotv[0]);         /*..and z-axis*/
  109.   }   /*else not in 0-plane*/
  110.   return (dotv[0]>0);                  /*return whether in front of you*/
  111. }   /*vangles*/
  112.  
  113.  
  114. void vcross(vec3 u,vec3 v,vec3 w)
  115. {
  116.   w[0]=u[1]*v[2]-u[2]*v[1];
  117.   w[1]=u[2]*v[0]-u[0]*v[2];
  118.   w[2]=u[0]*v[1]-u[1]*v[0];
  119. }   /*vcross*/
  120.  
  121.  
  122. void vnormalize(vec3 v)
  123. {
  124.   double d;
  125.   d=NORM(v);
  126.   if (d>0.0) VMUL(1.0/d,v,v);
  127. }   /*vnormalize*/
  128.  
  129.  
  130. void vlookback(vec3 p,vec3 z,bas3 b)
  131. {
  132.   double pnorm;
  133.   double psqr;
  134.   vec3   u;
  135.  
  136.   psqr=DOT(p,p);                       /*length of p squared*/
  137.   pnorm=sqrt(psqr);                    /*norm (length) of p*/
  138.   if (pnorm<=0)                        /*if nul vector..*/
  139.     EQU(b,eucl3);                      /*..use euclidean*/
  140.   else {                               /*otherwise..*/
  141.     psqr=DOT(z,p)/psqr;                /*..get dot product with zenith*/
  142.     VMUL(psqr,p,u);                    /*..put dot with zenith in u*/
  143.     VSUB(z,u,b[2]);                    /*..put projection onto z in basis[2]*/
  144.     VNEG(p,b[0]);                      /*..put rest of p into basis[0]*/
  145.     vcross(b[2],b[0],b[1]);            /*..get third via cross product*/
  146.     vnormalize(b[0]);                  /*..normalize*/
  147.     vnormalize(b[1]);                  /*..normalize*/
  148.     vnormalize(b[2]);                  /*..normalize*/
  149.   }   /*else need to calc*/
  150. }   /*vlookback*/
  151.  
  152.  
  153.  
  154.