33 #ifndef __INCLUDE_MIST_VECTOR__
34 #define __INCLUDE_MIST_VECTOR__
37 #ifndef __INCLUDE_MIST_CONF_H__
41 #ifndef __INCLUDE_MIST_TYPE_TRAIT_H__
111 template <
class TT >
145 template <
class TT >
155 template <
class TT >
165 template <
class TT >
178 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
181 template <
class TT >
193 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
196 template <
class TT >
216 bool operator ==(
const vector3 &v )
const {
return( x == v.
x && y == v.
y && z == v.
z ); }
227 bool operator !=(
const vector3 &v )
const {
return( !( *
this == v ) ); }
266 bool operator <=(
const vector3 &v )
const {
return( v >= *
this ); }
277 bool operator > (
const vector3 &v )
const {
return( v < *
this ); }
288 bool operator >=(
const vector3 &v )
const {
return( !( *
this < v ) ); }
300 return(
vector3( static_cast< value_type >( x / length_ ), static_cast< value_type >( y / length_ ), static_cast< value_type >( z / length_ ) ) );
315 template <
class TT >
316 typename promote_trait< T, TT >::value_type inner(
const vector3< TT > &v )
const
318 return(
static_cast< typename promote_trait< T, TT >::value_type
>( x * v.
x + y * v.
y + z * v.
z ) );
328 template <
class TT >
331 return(
vector3<
typename promote_trait< value_type, TT >::value_type >( y * v.
z - z * v.
y, z * v.
x - x * v.
z, x * v.
y - y * v.
x ) );
341 float_type length( )
const {
return ( static_cast< float_type >( std::sqrt( static_cast< double >( x * x + y * y + z * z ) ) ) ); }
352 theta *= 3.1415926535897932384626433832795 / 180.0;
353 double cs = std::cos( theta ), sn = std::sin( theta );
354 value_type xx =
static_cast< value_type >( ( v.
x * v.
x * ( 1.0 - cs ) + cs ) * x + ( v.
x * v.
y * ( 1.0 - cs ) - v.
z * sn ) * y + ( v.
x * v.
z * ( 1.0 - cs ) + v.
y * sn ) * z );
355 value_type yy =
static_cast< value_type >( ( v.
x * v.
y * ( 1.0 - cs ) + v.
z * sn ) * x + ( v.
y * v.
y * ( 1.0 - cs ) + cs ) * y + ( v.
y * v.
z * ( 1.0 - cs ) - v.
x * sn ) * z );
356 value_type zz =
static_cast< value_type >( ( v.
x * v.
z * ( 1.0 - cs ) - v.
y * sn ) * x + ( v.
y * v.
z * ( 1.0 - cs ) + v.
x * sn ) * y + ( v.
z * v.
z * ( 1.0 - cs ) + cs ) * z );
357 return (
vector3( xx, yy, zz ) );
363 template <
class T1,
class T2 >
366 typedef typename promote_trait< T1, T2 >::value_type value_type;
403 template < class T > inline std::ostream &operator <<( std::ostream &out, const vector3< T > &v )
422 template <
class T >
inline std::istream &operator >>( std::istream &in,
vector3< T > &v )
466 template <
class TT >
482 template <
class TT >
514 template <
class TT >
518 template <
class TT >
523 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
526 template <
class TT >
537 #if defined( __MIST_MSVC__ ) && __MIST_MSVC__ < 7
540 template <
class TT >
559 bool operator ==(
const vector2 &v )
const {
return( x == v.
x && y == v.
y ); }
570 bool operator !=(
const vector2 &v )
const {
return( !( *
this == v ) ); }
602 bool operator <=(
const vector2 &v )
const {
return( v >= *
this ); }
613 bool operator > (
const vector2 &v )
const {
return( v < *
this ); }
624 bool operator >=(
const vector2 &v )
const {
return( !( *
this < v ) ); }
636 return(
vector2( static_cast< value_type >( x / length_ ), static_cast< value_type >( y / length_ ) ) );
651 template <
class TT >
652 typename promote_trait< T, TT >::value_type
inner(
const vector2< TT > &v )
const {
return(
static_cast< typename promote_trait< T, TT >::value_type
>( x * v.
x + y * v.
y ) ); }
661 template <
class TT >
662 typename promote_trait< T, TT >::value_type
outer(
const vector2< TT > &v )
const {
return(
static_cast< typename promote_trait< T, TT >::value_type
>( x * v.
y - y * v.
x ) ); }
671 float_type length( )
const {
return ( static_cast< float_type >( std::sqrt( static_cast< double >( x * x + y * y ) ) ) ); }
688 template <
class T1,
class T2 >
691 typedef typename promote_trait< T1, T2 >::value_type value_type;
696 template <
class T1,
class T2 >
699 typedef typename promote_trait< T1, T2 >::value_type value_type;
732 template < class T > inline std::ostream &operator <<( std::ostream &out, const vector2< T > &v )
750 template <
class T >
inline std::istream &operator >>( std::istream &in,
vector2< T > &v )
760 #if defined( _MIST_VECTOR_SUPPORT_ ) && _MIST_VECTOR_SUPPORT_ != 0
772 template <
class T,
class Allocator = ::std::allocator< T > >
794 template <
class TT,
class AAllocator = std::allocator< TT > >
824 template <
class TT,
class AAlocator >
827 #if defined( _CHECK_MATRIX_OPERATION_ ) && _CHECK_MATRIX_OPERATION_ != 0
828 if( base::size( ) != v2.
size( ) || base::size( ) < 3 )
831 ::std::cerr <<
"can't calculate outer product of two vectors." << ::std::endl;
841 for( i = 0 ; i < v.size( ) - 2 ; i++ )
843 v[ i ] = v1[ i + 1 ] * v2[ i + 2 ] - v1[ i + 2 ] * v2[ i + 1 ];
846 v[ i ] = v1[ i + 1 ] * v2[ 0 ] - v1[ 0 ] * v2[ i + 1 ];
847 v[ i + 1 ] = v1[ 0 ] * v2[ 1 ] - v1[ 1 ] * v2[ 0 ];
876 #if defined( _CHECK_MATRIX_OPERATION_ ) && _CHECK_MATRIX_OPERATION_ != 0
877 if( base::size( ) != v2.
size( ) )
880 ::std::cerr <<
"can't calculate inner product of two vectors." << ::std::endl;
888 for( size_type i = 0 ; i < base::size( ) ; i++ )
890 v += v1[ i ] * v2[ i ];
907 return(
vector( *
this ) *= v );
944 template <
class TT,
class AAlocator >
951 #if _USE_EXPRESSION_TEMPLATE_ != 0
953 template <
class Expression >
954 vector(
const matrix_expression< Expression > &expression ) : base( expression.size( ), 1 )
957 for( size_type indx = 0 ; indx < v.
size( ) ; indx++ )
959 v[ indx ] = expression[ indx ];
978 template <
class T,
class Allocator >
979 inline ::std::ostream &operator <<( ::std::ostream &out, const vector< T, Allocator > &v )
982 for( indx = 0 ; indx < v.
size( ) ; indx++ )
985 if( indx != v.
size( ) - 1 ) out <<
", ";
1003 template <
class T,
class Allocator >
1013 #endif // _MIST_VECTOR_SUPPORT_
1022 #endif // __INCLUDE_MIST_VECTOR__