home *** CD-ROM | disk | FTP | other *** search
/ Mega Top 1 / os2_top1.zip / os2_top1 / APPS / RAYTRACE / RT / VECTOR.C < prev    next >
C/C++ Source or Header  |  1994-05-22  |  3KB  |  154 lines

  1. /*
  2.  
  3. VECTOR.C  Vector datatype
  4.  
  5. */
  6.  
  7. /*...sincludes:0:*/
  8. #include <stdlib.h>
  9. #include <stddef.h>
  10. #include <math.h>
  11. #include "standard.h"
  12. #define    _VECTOR_
  13. #include "vector.h"
  14. /*...e*/
  15.  
  16. /*...smagnitude:0:*/
  17. double    magnitude(VECTOR p)
  18.     {
  19.     return sqrt(p.x * p.x + p.y * p.y + p.z * p.z);
  20.     }
  21. /*...e*/
  22. /*...sunit_vector:0:*/
  23. VECTOR    unit_vector(VECTOR p)
  24.     {
  25.     double    mag = magnitude(p);
  26.  
  27.     if ( mag == 0.0 )
  28.         return p;    /* Zero vector cannot be unit-ised */
  29.  
  30.     p.x /= mag;
  31.     p.y /= mag;
  32.     p.z /= mag;
  33.  
  34.     return p;
  35.     }
  36. /*...e*/
  37. /*...svector_product:0:*/
  38. VECTOR    vector_product(VECTOR p, VECTOR q)
  39.     {
  40.     VECTOR    product;
  41.  
  42.     product.x = p.y * q.z - p.z * q.y;
  43.     product.y = p.z * q.x - p.x * q.z;
  44.     product.z = p.x * q.y - p.y * q.x;
  45.  
  46.     return product;
  47.     }
  48. /*...e*/
  49. /*...sscalar_product:0:*/
  50. double    scalar_product(VECTOR p, VECTOR q)
  51.     {
  52.     return p.x * q.x + p.y * q.y + p.z * q.z;
  53.     }
  54. /*...e*/
  55. /*...svector_sum:0:*/
  56. VECTOR    vector_sum(VECTOR p, VECTOR q)
  57.     {
  58.     p.x += q.x;
  59.     p.y += q.y;
  60.     p.z += q.z;
  61.  
  62.     return p;
  63.     }
  64. /*...e*/
  65. /*...snegate_vector:0:*/
  66. VECTOR    negate_vector(VECTOR p)
  67.     {
  68.     p.x = -p.x;
  69.     p.y = -p.y;
  70.     p.z = -p.z;
  71.  
  72.     return p;
  73.     }
  74. /*...e*/
  75. /*...svector_difference:0:*/
  76. VECTOR    vector_difference(VECTOR p, VECTOR q)
  77.     {
  78.     p.x -= q.x;
  79.     p.y -= q.y;
  80.     p.z -= q.z;
  81.  
  82.     return p;
  83.     }
  84. /*...e*/
  85. /*...sscale_vector:0:*/
  86. VECTOR    scale_vector(VECTOR p, double scalar)
  87.     {
  88.     p.x *= scalar;
  89.     p.y *= scalar;
  90.     p.z *= scalar;
  91.  
  92.     return p;
  93.     }
  94. /*...e*/
  95. /*...sinv_scale_vector:0:*/
  96. VECTOR    inv_scale_vector(VECTOR p, double inv_scalar)
  97.     {
  98.     p.x /= inv_scalar;
  99.     p.y /= inv_scalar;
  100.     p.z /= inv_scalar;
  101.  
  102.     return p;
  103.     }
  104. /*...e*/
  105. /*...st_along_pq:0:*/
  106. VECTOR    t_along_pq(VECTOR p, VECTOR q, double t)
  107.     {
  108.     p.x += q.x * t;
  109.     p.y += q.y * t;
  110.     p.z += q.z * t;
  111.  
  112.     return p;
  113.     }
  114. /*...e*/
  115. /*...srot_x_vector:0:*/
  116. VECTOR    rot_x_vector(VECTOR v, double angle)
  117.     {
  118.     double    ca = cos(angle);
  119.     double    sa = sin(angle);
  120.     VECTOR    rotated;
  121.  
  122.     rotated.x = v.x;
  123.     rotated.y = ca * v.y - sa * v.z;
  124.     rotated.z = sa * v.y + ca * v.z;
  125.     return rotated;
  126.     }
  127. /*...e*/
  128. /*...srot_y_vector:0:*/
  129. VECTOR    rot_y_vector(VECTOR v, double angle)
  130.     {
  131.     double    ca = cos(angle);
  132.     double    sa = sin(angle);
  133.     VECTOR    rotated;
  134.  
  135.     rotated.x = sa * v.z + ca * v.x;
  136.     rotated.y = v.y;
  137.     rotated.z = ca * v.z - sa * v.x;
  138.     return rotated;
  139.     }
  140. /*...e*/
  141. /*...srot_z_vector:0:*/
  142. VECTOR    rot_z_vector(VECTOR v, double angle)
  143.     {
  144.     double    ca = cos(angle);
  145.     double    sa = sin(angle);
  146.     VECTOR    rotated;
  147.  
  148.     rotated.x = ca * v.x - sa * v.y;
  149.     rotated.y = sa * v.x + ca * v.y;
  150.     rotated.z = v.z;
  151.     return rotated;
  152.     }
  153. /*...e*/
  154.