home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / linkedit / linkedit.lha / link-edit / LinkEdit / Link / mf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-03-13  |  1.8 KB  |  106 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include "mf.h"
  4.  
  5. typedef struct {
  6.   double dx,dy,dz;
  7.  } Vector;
  8.  
  9. CrossProduct(vec1,vec2,out)
  10.  
  11. Vector *vec1,*vec2,*out;
  12.  
  13. {
  14.  
  15.   out->dx = vec1->dy*vec2->dz - vec1->dz*vec2->dy;
  16.   out->dy = vec1->dz*vec2->dx - vec1->dx*vec2->dz;
  17.   out->dz = vec1->dx*vec2->dy - vec1->dy*vec2->dx;
  18. }
  19.  
  20. double Angle(pnt1,pnt2)
  21.  
  22. double pnt1[3],pnt2[3];
  23. {
  24.   return(acos(DotProduct(pnt1,pnt2)/(Norm(pnt1) * Norm(pnt2))));
  25. }
  26.  
  27. double DotProduct(vec1,vec2)
  28.  
  29. double vec1[3],vec2[3];
  30. {
  31.   return(vec1[0]*vec2[0] + vec1[1]*vec2[1] + vec1[2]*vec2[2]);
  32. }
  33.  
  34. double Norm(vec)
  35.  
  36. double vec[3];
  37. {
  38.   return(sqrt(vec[0]*vec[0] + vec[1]*vec[1] + vec[2]*vec[2]));
  39. }
  40.  
  41.  
  42. Normalize(vec)
  43. double vec[3];
  44. {
  45.   double norm;
  46.   norm = Norm(vec);
  47.   if(norm < EPSILON)
  48.     fprintf(stderr,"Warning: tried to normalize zero length vector.\n");
  49.   else
  50.     vec[0] /= norm; vec[1] /= norm; vec[2] /= norm;
  51. }
  52.  
  53. TransformPoint(xfm,in,out)
  54.  
  55. double xfm[4][4],in[3],out[3];
  56.  
  57. {
  58.   int i;
  59.   double x[4];
  60.  
  61.   for(i=0;i<4;++i)
  62.     x[i] = xfm[i][0]*in[0] + xfm[i][1]*in[1] + xfm[i][2]*in[2] + xfm[i][3];
  63.  
  64.   if(x[3] == 1.0) 
  65.      for(i=0;i<3;++i)
  66.         out[i] = x[i];
  67.   else
  68.      for(i=0;i<3;++i)
  69.         out[i] = x[i]/x[3];
  70. }
  71.  
  72. double TwoByTwoDeterminant(array)
  73.  
  74. double array[2][2];
  75. {
  76.   return(array[0][0]*array[1][1] - array[0][1]*array[1][0]);
  77. }
  78.  
  79.  
  80. SolveTwoByTwo(coeff,x,y)
  81.  
  82. double coeff[2][3],*x,*y;
  83.  
  84. {
  85.   double det,array[2][2];
  86.   int i,j;
  87.  
  88.   for(i=0;i<2;++i)
  89.      for(j=0;j<2;++j) array[i][j] = coeff[i][j];
  90.  
  91.   det = TwoByTwoDeterminant(array);
  92.   if(det < EPSILON && det > -EPSILON) return(0);
  93.  
  94.   array[0][0] = coeff[0][2]; array[1][0] = coeff[1][2];
  95.   *x = TwoByTwoDeterminant(array)/det;
  96.  
  97.   for(i=0;i<2;++i)
  98.      for(j=0;j<2;++j) array[i][j] = coeff[i][j];
  99.   array[0][1] = coeff[0][2]; array[1][1] = coeff[1][2];
  100.   *y = TwoByTwoDeterminant(array)/det;
  101.   return(1);
  102.  
  103. }
  104.  
  105.  
  106.