home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 10 / ioProg_10.iso / soft / optima / samples.z / GRVECTOR.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-23  |  4.8 KB  |  179 lines

  1. #include <math.h>
  2.  
  3. #include "grvector.hpp"
  4.  
  5. grVector::grVector( void )              // DEFAULT CTOR
  6. //------------------------
  7. {
  8.     uint i;
  9.  
  10.     for( i = 0; i < 3; i += 1 ) {
  11.         _coords[ i ] = 0.0;
  12.     }
  13.     _coords[ 3 ] = 0.0;
  14. }
  15.  
  16. grVector::grVector(                     // BUILD FROM COORDINATES
  17.     double x, double y,                 // -- x, y location
  18.     double z,                           // -- z value
  19.     double h )                          // -- homogoneous scaling factor
  20. //-------------------
  21. {
  22.     _coords[ 0 ] = x;
  23.     _coords[ 1 ] = y;
  24.     _coords[ 2 ] = z;
  25.     _coords[ 3 ] = h;
  26. }
  27.  
  28. double grVector::length( void ) const    // FIND THE LENGTH
  29. //----------------------------------
  30. {
  31.     return sqrt( dot( *this, *this ) );
  32. }
  33.  
  34. void grVector::normalize( void )        // NORMALIZE THE VECTOR
  35. //------------------------------
  36. {
  37.     double len = length();
  38.  
  39.     if( len == 0.0 ) {
  40.         return;
  41.     }
  42.     _coords[ 0 ] /= len;
  43.     _coords[ 1 ] /= len;
  44.     _coords[ 2 ] /= len;
  45. }
  46.  
  47. void grVector::fixup( void )            // DIVIDE THROUGH BY h
  48. //--------------------------
  49. {
  50.     double h = _coords[ 3 ];
  51.     uint  i;
  52.  
  53.     if( h * h < grEPSILON ) {
  54.         grError( "grVector: invalid h" );
  55.     }
  56.  
  57.     for( i = 0; i < 4; i++ ) {
  58.         _coords[ i ] /= h;
  59.     }
  60. }
  61.  
  62. grVector grVector::operator +=(         // ADD ANOTHER VECTOR
  63.     const grVector & o )                // -- vector to add
  64. //-----------------------------
  65. {
  66.     *this = *this + o;
  67.     return *this;
  68. }
  69.  
  70. double dot(                             // PERFORM DOT PRODUCT
  71.     const grVector & v1,                // -- vector one
  72.     const grVector & v2 )               // -- vector to dot with
  73. //-----------------------
  74. {
  75.     return( v1.x() * v2.x() + v1.y() * v2.y() + v1.z() * v2.z() );
  76. }
  77.  
  78. grVector cross(                         // PERFORM CROSS PRODUCT (this X o)
  79.     const grVector & v1,                // -- vector one
  80.     const grVector & v2 )               // -- vector to dot with
  81. //-----------------------
  82. {
  83.     double x_v, y_v, z_v;
  84.  
  85.     x_v = v1.y() * v2.z() - v1.z() * v2.y();
  86.     y_v = v1.z() * v2.x() - v1.x() * v2.z();
  87.     z_v = v1.x() * v2.y() - v1.y() * v2.x();
  88.  
  89.     return grVector( x_v, y_v, z_v );
  90. }
  91.  
  92. grVector operator *(                    // MULTIPLY BY SCALAR
  93.     double s,                           // -- scalar value
  94.     const grVector & vec )              // -- vector to multiply
  95. //----------------------------
  96. {
  97.     return grVector( vec.x() * s, vec.y() * s, vec.z() * s );
  98. }
  99.  
  100. grVector operator +(                    // ADD TWO VECTORS
  101.     const grVector & v1,                // -- vector 1
  102.     const grVector & v2 )               // -- vector 2
  103. //-----------------------
  104. {
  105.     return grVector( v1.x() + v2.x(), v1.y() + v2.y(), v1.z() + v2.z() );
  106. }
  107.  
  108. grVector operator -(                    // SUBTRACT TWO VECTORS
  109.     const grVector & v1,                // -- vector 1
  110.     const grVector & v2 )               // -- vector 2
  111. //-----------------------
  112. {
  113.     return grVector( v1.x() - v2.x(), v1.y() - v2.y(), v1.z() - v2.z() );
  114. }
  115.  
  116.  
  117. grPoint3::grPoint3()                    // DEFAULT CTOR
  118. //----------------
  119. {
  120.     uint i;
  121.  
  122.     for( i = 0; i < 3; i += 1 ) {
  123.         _coords[ i ] = 0.0;
  124.     }
  125.     _coords[ 3 ] = 1.0;
  126. }
  127.  
  128. grPoint3::grPoint3(                     // BUILD FROM COORDINATES
  129.     double x, double y,                 // -- x, y location
  130.     double z,                           // -- z value
  131.     double h  )                         // -- homogoneous scaling factor
  132. //-------------------
  133. {
  134.     _coords[ 0 ] = x;
  135.     _coords[ 1 ] = y;
  136.     _coords[ 2 ] = z;
  137.     _coords[ 3 ] = h;
  138. }
  139.  
  140. grPoint3 operator *(                    // MULTIPLY BY SCALAR
  141.     double s,                           // -- scalar value
  142.     const grPoint3 & point )            // -- point to multiply
  143. //------------------------
  144. {
  145.     return grPoint3( point.x() * s, point.y() * s, point.z() * s );
  146. }
  147.  
  148. grPoint3 operator +(                    // ADD VECTOR TO POINT
  149.     const grPoint3 & p1,                // -- point 1
  150.     const grVector & v1 )               // -- vector 1
  151. //------------------------
  152. {
  153.     return grPoint3( p1.x() + v1.x(), p1.y() + v1.y(), p1.z() +v1.z(),
  154.         p1.h() + v1.h() );
  155. }
  156.  
  157. grVector operator -(                    // SUBTRACT POINTS, GIVING VECTOR
  158.     const grPoint3 & p1,                // -- point 1
  159.     const grPoint3 & p2 )               // -- point 2
  160. //----------------------
  161. {
  162.     return grVector( p1.x() - p2.x(), p1.y() - p2.y(), p1.z() - p2.z() );
  163. }
  164.  
  165. void grPoint3::fixup( void )            // DIVIDE THROUGH BY h
  166. //-------------------------
  167. {
  168.     double h = _coords[ 3 ];
  169.     uint  i;
  170.  
  171.     if( h * h < grEPSILON ) {
  172.         grError( "grVector: invalid h" );
  173.     }
  174.  
  175.     for( i = 0; i < 4; i++ ) {
  176.         _coords[ i ] /= h;
  177.     }
  178. }
  179.