33 #ifndef __INCLUDE_MIST_QUATERNION__
34 #define __INCLUDE_MIST_QUATERNION__
37 #ifndef __INCLUDE_MIST_CONF_H__
41 #ifndef __INCLUDE_MIST_TYPE_TRAIT_H__
45 #ifndef __INCLUDE_MIST_VECTOR__
105 template <
class TT >
108 double t = theta * 3.1415926535897932384626433832795 / 180.0 / 2.0;
109 double c = std::cos( t );
110 double s = std::sin( t );
123 template <
class TT >
135 quaternion q1 = quaternion::rotate( e3, dir );
141 quaternion q2 = quaternion::rotate( e2, up, dir );
144 operator =( q2 * q1 );
149 template <
class TT >
201 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
204 template <
class TT >
238 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
241 template <
class TT >
265 template <
class TT >
287 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
290 template <
class TT >
309 template <
class TT >
312 return( this->
operator *=( q.
inv( ) ) );
323 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
326 template <
class TT >
347 bool operator ==(
const quaternion &q )
const {
return( w == q.
w && x == q.
x && y == q.
y && z == q.
z ); }
358 bool operator !=(
const quaternion &q )
const {
return( !( *
this == q ) ); }
404 bool operator <=(
const quaternion &q )
const {
return( q >= *
this ); }
415 bool operator > (
const quaternion &q )
const {
return( q < *
this ); }
426 bool operator >=(
const quaternion &q )
const {
return( !( *
this < q ) ); }
447 return( conjugate( ) / ( length_ * length_ ) );
459 return(
quaternion( static_cast< value_type >( w / length_ ), static_cast< value_type >( x / length_ ), static_cast< value_type >( y / length_ ), static_cast< value_type >( z / length_ ) ) );
473 template <
class TT >
476 return( w * q.
w + x * q.
x + y * q.
y + z * q.
z );
483 float_type length( )
const {
return ( static_cast< float_type >( std::sqrt( static_cast< double >( w * w + x * x + y * y + z * z ) ) ) ); }
492 template <
class TT >
495 quaternion q = ( *this ) *
quaternion( 0, static_cast< value_type >( v.
x ), static_cast< value_type >( v.
y ), static_cast< value_type >( v.
z ) ) * inv( );
496 return(
vector3< TT >( static_cast< TT >( q.
x ), static_cast< TT >( q.
y ), static_cast< TT >( q.
z ) ) );
508 template <
class TT >
516 double dot = v1.
inner( v2 );
522 double c = std::sqrt( ( dot + 1.0 ) * 0.5 );
524 if( std::abs( c - 1.0 ) < 1.0e-6 || c > 1.0 )
528 else if( std::abs( c + 1.0 ) < 1.0e-6 || c < -1.0 )
544 template <
class TT >
552 double dot = v1.
inner( v2 );
558 double c = std::sqrt( ( dot + 1.0 ) * 0.5 );
560 if( std::abs( c - 1.0 ) < 1.0e-6 || c > 1.0 )
564 else if( std::abs( c + 1.0 ) < 1.0e-6 || c < -1.0 )
569 double s = std::sqrt( 1.0 - c * c );
631 template < class T > inline std::ostream &operator <<( std::ostream &out, const quaternion< T > &q )
651 template <
class T1,
class T2 >
656 quaternion_type Q1( q1.
unit( ) );
657 quaternion_type Q2( q2.
unit( ) );
659 double dot = Q1.
inner( Q2 );
661 if( std::abs( dot ) < 1.0e-6 )
667 double theta = std::acos( dot );
670 return( quaternion_type( Q1 * std::sin( theta * ( 1.0 - t ) ) - Q2 * std::sin( theta * t ) ).unit( ) );
674 double theta = std::acos( dot );
677 return( quaternion_type( Q1 * std::sin( theta * ( 1.0 - t ) ) + Q2 * std::sin( theta * t ) ).unit( ) );
750 value_type l, _2 = std::sqrt( value_type( 2.0 ) );
754 if( l < trackball_size / _2 )
756 sp1.z = - std::sqrt( trackball_size * trackball_size - l * l );
760 sp1.z = - trackball_size * trackball_size / 2.0 / l;
765 if( l < trackball_size / _2 )
767 sp2.
z = - std::sqrt( trackball_size * trackball_size - l * l );
771 sp2.
z = - trackball_size * trackball_size / 2.0 / l;
780 axis = ( axis.
x * axisX + axis.
y * axisY + axis.
z * axisZ ).unit( );
782 l = ( sp2 - sp1 ).length( ) / ( 2 * trackball_size );
786 double phi = std::asin( l );
821 return(
track_ball( p1, p2, axisX, axisY, axisZ, 0.8 ) );
873 #endif // __INCLUDE_MIST_QUATERNION__