/****************************************** * C++ Quaternions * Version: 1.0.9 * Author: Douglas Wilhelm Harder * Date: 2008/03/03 * * Copyright (c) 2006-2008 by Douglas Wilhelm Harder. * All rights reserved. ******************************************/ #ifndef CA_UWATERLOO_ALUMNI_DWHARDER_QUATERNION #define CA_UWATERLOO_ALUMNI_DWHARDER_QUATERNION #include #include #include template class Quaternion; template std::ostream & operator << ( std::ostream &, const Quaternion & ); template Quaternion operator + ( T, const Quaternion & ); template Quaternion operator + ( long, const Quaternion & ); template Quaternion operator - ( T, const Quaternion & ); template Quaternion operator - ( long, const Quaternion & ); template Quaternion operator * ( T, const Quaternion & ); template Quaternion operator * ( long, const Quaternion & ); template Quaternion operator / ( T, const Quaternion & ); template Quaternion operator / ( long, const Quaternion & ); template bool operator == ( T, const Quaternion & ); template bool operator == ( long, const Quaternion & ); template bool operator != ( T, const Quaternion & ); template bool operator != ( long, const Quaternion & ); template T real( const Quaternion & ); template T imag_i( const Quaternion & ); template T imag_j( const Quaternion & ); template T imag_k( const Quaternion & ); template T csgn( const Quaternion & ); template T abs( const Quaternion & ); template T norm( const Quaternion & ); template T abs_imag( const Quaternion & ); template T norm_imag( const Quaternion & ); template T arg( const Quaternion & ); template Quaternion imag( const Quaternion & ); template Quaternion conj( const Quaternion & ); template Quaternion signum( const Quaternion & ); template Quaternion sqr( const Quaternion & ); template Quaternion sqrt( const Quaternion & ); template Quaternion rotate( const Quaternion &, const Quaternion & ); template Quaternion exp( const Quaternion & ); template Quaternion log( const Quaternion & ); template Quaternion log10( const Quaternion & ); template Quaternion pow( const Quaternion &, const Quaternion & ); template Quaternion pow( const Quaternion &, T ); template Quaternion inverse( const Quaternion & ); template Quaternion sin( const Quaternion & ); template Quaternion cos( const Quaternion & ); template Quaternion tan( const Quaternion & ); template Quaternion sec( const Quaternion & ); template Quaternion csc( const Quaternion & ); template Quaternion cot( const Quaternion & ); template Quaternion sinh( const Quaternion & ); template Quaternion cosh( const Quaternion & ); template Quaternion tanh( const Quaternion & ); template Quaternion sech( const Quaternion & ); template Quaternion csch( const Quaternion & ); template Quaternion coth( const Quaternion & ); template Quaternion asin( const Quaternion &, const Quaternion & = Quaternion::I ); template Quaternion acos( const Quaternion &, const Quaternion & = Quaternion::I ); template Quaternion atan( const Quaternion & ); template Quaternion asec( const Quaternion &, const Quaternion & = Quaternion::I ); template Quaternion acsc( const Quaternion &, const Quaternion & = Quaternion::I ); template Quaternion acot( const Quaternion & ); template Quaternion asinh( const Quaternion & ); template Quaternion acosh( const Quaternion &, const Quaternion & = Quaternion::I ); template Quaternion atanh( const Quaternion &, const Quaternion & = Quaternion::I ); template Quaternion asech( const Quaternion &, const Quaternion & = Quaternion::I ); template Quaternion acsch( const Quaternion & ); template Quaternion acoth( const Quaternion &, const Quaternion & = Quaternion::I ); template Quaternion bessel_J( int, const Quaternion & ); template Quaternion floor( const Quaternion & ); template Quaternion ceil( const Quaternion & ); template Quaternion horner( const Quaternion &, T *, unsigned int ); template Quaternion horner( const Quaternion &, T *, T *, unsigned int ); template class Quaternion { private: T r, i, j, k; inline static Quaternion multiplier( T, T, const Quaternion & ); inline static Quaternion make_inf( T, T ); inline static Quaternion make_i( T, T ); public: const static Quaternion ZERO; const static Quaternion ONE; const static Quaternion I; const static Quaternion J; const static Quaternion K; const static Quaternion UNITS[4]; /****************************************** * Constructor and Copy Constructor ******************************************/ Quaternion( T, T, T, T ); Quaternion( T = 0.0 ); /****************************************** * Assignment Operator ******************************************/ const Quaternion & operator = ( const T & ); /****************************************** * Mutating Arithmetic Operators ******************************************/ Quaternion & operator += ( const Quaternion & ); Quaternion & operator -= ( const Quaternion & ); Quaternion & operator *= ( const Quaternion & ); Quaternion & operator /= ( const Quaternion & ); Quaternion & operator += ( T ); Quaternion & operator -= ( T ); Quaternion & operator *= ( T ); Quaternion & operator /= ( T ); Quaternion & operator ++(); Quaternion operator ++( int ); Quaternion & operator --(); Quaternion operator --( int ); /****************************************** * Real-valued Functions ******************************************/ T real() const; T operator []( int ) const; T &operator []( int ); T imag_i() const; T imag_j() const; T imag_k() const; T csgn() const; T abs() const; T norm() const; T abs_imag() const; T norm_imag() const; T arg() const; /****************************************** * Quaternion-valued Functions ******************************************/ Quaternion imag() const; Quaternion conj() const; Quaternion operator * () const; Quaternion signum() const; Quaternion sqr() const; Quaternion sqrt() const; Quaternion rotate( const Quaternion & ) const; /****************************************** * Boolean-valued Functions ******************************************/ bool is_imaginary() const; bool is_inf() const; bool is_nan() const; bool is_neg_inf() const; bool is_pos_inf() const; bool is_real() const; bool is_real_inf() const; bool is_zero() const; /****************************************** * Exponential and Logarithmic Functions ******************************************/ Quaternion exp() const; Quaternion log() const; Quaternion log10() const; Quaternion pow(const Quaternion & w) const; Quaternion pow(T x) const; Quaternion inverse() const; /****************************************** * Trigonometric and Hyperbolic Functions ******************************************/ Quaternion sin() const; Quaternion cos() const; Quaternion tan() const; Quaternion sec() const; Quaternion csc() const; Quaternion cot() const; Quaternion sinh() const; Quaternion cosh() const; Quaternion tanh() const; Quaternion sech() const; Quaternion csch() const; Quaternion coth() const; Quaternion asin( const Quaternion & = I ) const; Quaternion acos( const Quaternion & = I ) const; Quaternion atan() const; Quaternion asec( const Quaternion & = I ) const; Quaternion acsc( const Quaternion & = I ) const; Quaternion acot() const; Quaternion asinh() const; Quaternion acosh( const Quaternion & = I ) const; Quaternion atanh( const Quaternion & = I ) const; Quaternion asech( const Quaternion & = I ) const; Quaternion acsch() const; Quaternion acoth( const Quaternion & = I ) const; Quaternion bessel_J( int ) const; /****************************************** * Integer Functions ******************************************/ Quaternion ceil() const; Quaternion floor() const; /****************************************** * Horner's Rule ******************************************/ Quaternion horner( T *, unsigned int ) const; Quaternion horner( T *, T *, unsigned int ) const; /****************************************** * Random Factories ******************************************/ static Quaternion random(); static Quaternion random_imag(); static Quaternion random_real(); /****************************************** * Binary Arithmetic Operators ******************************************/ Quaternion operator + ( const Quaternion & ) const; Quaternion operator + ( T ) const; Quaternion operator - ( const Quaternion & ) const; Quaternion operator - ( T ) const; Quaternion operator * ( const Quaternion & ) const; Quaternion operator * ( T ) const; Quaternion operator / ( const Quaternion & ) const; Quaternion operator / ( T ) const; /****************************************** * Unary Arithmetic Operators ******************************************/ Quaternion operator - () const; /****************************************** * Binary Boolean Operators ******************************************/ bool operator == ( const Quaternion & ) const; bool operator == ( T ) const; bool operator != ( const Quaternion & ) const; bool operator != ( T ) const; }; #endif