home *** CD-ROM | disk | FTP | other *** search
- #include <math.h>
-
- #include "grvector.hpp"
-
- grVector::grVector( void ) // DEFAULT CTOR
- //------------------------
- {
- uint i;
-
- for( i = 0; i < 3; i += 1 ) {
- _coords[ i ] = 0.0;
- }
- _coords[ 3 ] = 0.0;
- }
-
- grVector::grVector( // BUILD FROM COORDINATES
- double x, double y, // -- x, y location
- double z, // -- z value
- double h ) // -- homogoneous scaling factor
- //-------------------
- {
- _coords[ 0 ] = x;
- _coords[ 1 ] = y;
- _coords[ 2 ] = z;
- _coords[ 3 ] = h;
- }
-
- double grVector::length( void ) const // FIND THE LENGTH
- //----------------------------------
- {
- return sqrt( dot( *this, *this ) );
- }
-
- void grVector::normalize( void ) // NORMALIZE THE VECTOR
- //------------------------------
- {
- double len = length();
-
- if( len == 0.0 ) {
- return;
- }
- _coords[ 0 ] /= len;
- _coords[ 1 ] /= len;
- _coords[ 2 ] /= len;
- }
-
- void grVector::fixup( void ) // DIVIDE THROUGH BY h
- //--------------------------
- {
- double h = _coords[ 3 ];
- uint i;
-
- if( h * h < grEPSILON ) {
- grError( "grVector: invalid h" );
- }
-
- for( i = 0; i < 4; i++ ) {
- _coords[ i ] /= h;
- }
- }
-
- grVector grVector::operator +=( // ADD ANOTHER VECTOR
- const grVector & o ) // -- vector to add
- //-----------------------------
- {
- *this = *this + o;
- return *this;
- }
-
- double dot( // PERFORM DOT PRODUCT
- const grVector & v1, // -- vector one
- const grVector & v2 ) // -- vector to dot with
- //-----------------------
- {
- return( v1.x() * v2.x() + v1.y() * v2.y() + v1.z() * v2.z() );
- }
-
- grVector cross( // PERFORM CROSS PRODUCT (this X o)
- const grVector & v1, // -- vector one
- const grVector & v2 ) // -- vector to dot with
- //-----------------------
- {
- double x_v, y_v, z_v;
-
- x_v = v1.y() * v2.z() - v1.z() * v2.y();
- y_v = v1.z() * v2.x() - v1.x() * v2.z();
- z_v = v1.x() * v2.y() - v1.y() * v2.x();
-
- return grVector( x_v, y_v, z_v );
- }
-
- grVector operator *( // MULTIPLY BY SCALAR
- double s, // -- scalar value
- const grVector & vec ) // -- vector to multiply
- //----------------------------
- {
- return grVector( vec.x() * s, vec.y() * s, vec.z() * s );
- }
-
- grVector operator +( // ADD TWO VECTORS
- const grVector & v1, // -- vector 1
- const grVector & v2 ) // -- vector 2
- //-----------------------
- {
- return grVector( v1.x() + v2.x(), v1.y() + v2.y(), v1.z() + v2.z() );
- }
-
- grVector operator -( // SUBTRACT TWO VECTORS
- const grVector & v1, // -- vector 1
- const grVector & v2 ) // -- vector 2
- //-----------------------
- {
- return grVector( v1.x() - v2.x(), v1.y() - v2.y(), v1.z() - v2.z() );
- }
-
-
- grPoint3::grPoint3() // DEFAULT CTOR
- //----------------
- {
- uint i;
-
- for( i = 0; i < 3; i += 1 ) {
- _coords[ i ] = 0.0;
- }
- _coords[ 3 ] = 1.0;
- }
-
- grPoint3::grPoint3( // BUILD FROM COORDINATES
- double x, double y, // -- x, y location
- double z, // -- z value
- double h ) // -- homogoneous scaling factor
- //-------------------
- {
- _coords[ 0 ] = x;
- _coords[ 1 ] = y;
- _coords[ 2 ] = z;
- _coords[ 3 ] = h;
- }
-
- grPoint3 operator *( // MULTIPLY BY SCALAR
- double s, // -- scalar value
- const grPoint3 & point ) // -- point to multiply
- //------------------------
- {
- return grPoint3( point.x() * s, point.y() * s, point.z() * s );
- }
-
- grPoint3 operator +( // ADD VECTOR TO POINT
- const grPoint3 & p1, // -- point 1
- const grVector & v1 ) // -- vector 1
- //------------------------
- {
- return grPoint3( p1.x() + v1.x(), p1.y() + v1.y(), p1.z() +v1.z(),
- p1.h() + v1.h() );
- }
-
- grVector operator -( // SUBTRACT POINTS, GIVING VECTOR
- const grPoint3 & p1, // -- point 1
- const grPoint3 & p2 ) // -- point 2
- //----------------------
- {
- return grVector( p1.x() - p2.x(), p1.y() - p2.y(), p1.z() - p2.z() );
- }
-
- void grPoint3::fixup( void ) // DIVIDE THROUGH BY h
- //-------------------------
- {
- double h = _coords[ 3 ];
- uint i;
-
- if( h * h < grEPSILON ) {
- grError( "grVector: invalid h" );
- }
-
- for( i = 0; i < 4; i++ ) {
- _coords[ i ] /= h;
- }
- }
-