25 #ifndef WMATRIXFIXED_H
26 #define WMATRIXFIXED_H
31 #include <boost/static_assert.hpp>
32 #include <boost/tokenizer.hpp>
42 #include <osg/Matrixd>
48 #include "../../WDefines.h"
49 #include "../../WStringUtils.h"
50 #include "../../WTypeTraits.h"
52 #include "../../exceptions/WOutOfBounds.h"
57 #define ValueStoreTemplate template< typename, size_t, size_t > class
72 template<
typename ValueT,
size_t Rows,
size_t Cols >
101 const ValueT&
operator()(
size_t row,
size_t col )
const throw()
103 return m_values[ row * Cols + col ];
115 template <
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
118 for(
size_t row = 0; row < Rows; ++row )
120 for(
size_t col = 0; col < Cols; ++col )
146 template<
typename ValueT,
size_t Rows,
size_t Cols, ValueStoreTemplate ValueStoreT = ValueStore >
153 template<
typename ValueTT,
size_t Rowss,
size_t Colss, ValueStoreTemplate ValueStoreTT >
207 for(
size_t row = 0; row < Rows; ++row )
209 for(
size_t col = 0; col < Cols; ++col )
224 BOOST_STATIC_ASSERT( Rows == 2 );
239 BOOST_STATIC_ASSERT( Rows == 3 );
256 BOOST_STATIC_ASSERT( Rows == 4 );
271 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
285 for(
size_t i = 0; i < std::min( Rows, Cols ); ++i )
287 m( i, i ) = ValueT( 1 );
300 for(
size_t row = 0; row < Rows; ++row )
302 for(
size_t col = 0; col < Cols; ++col )
304 m( row, col ) = ValueT( 0 );
327 template<
typename RHSValueT,
size_t RHSRows,
size_t RHSCols, ValueStoreTemplate RHSValueStoreT >
329 size_t colOffset = 0 )
351 template<
typename RHSValueT,
size_t RHSRows,
size_t RHSCols, ValueStoreTemplate RHSValueStoreT >
354 size_t colOffset = 0 )
357 for(
size_t row = 0; row < Rows; ++row )
359 for(
size_t col = 0; col < Cols; ++col )
361 if( ( row >= rowOffset ) && ( col >= colOffset ) )
364 size_t srcRow = row - rowOffset;
365 size_t srcCol = col - colOffset;
368 if( ( srcRow < RHSRows ) && ( srcCol < RHSCols ) )
370 result( row, col ) = src( srcRow, srcCol );
374 result( row, col ) = m( row, col );
379 result( row, col ) = m( row, col );
396 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
399 for(
size_t col = 0; col < Cols; col++ )
401 at( index, col ) = vec( col, 0 );
415 for(
size_t col = 0; col < Cols; col++ )
417 result( col, 0 ) =
at( index, col );
433 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
436 for(
size_t row = 0; row < Rows; row++ )
438 at( row, index ) = vec( row, 0 );
452 for(
size_t row = 0; row < Rows; row++ )
454 result( row, 0 ) =
at( row, index );
469 operator Eigen::Matrix< ValueT, Rows, Cols >()
const
471 Eigen::Matrix< ValueT, Rows, Cols > m;
472 for(
size_t row = 0; row < Rows; ++row )
474 for(
size_t col = 0; col < Cols; ++col )
487 operator osg::Vec2d()
const
490 BOOST_STATIC_ASSERT( Rows == 2 );
491 return osg::Vec2d(
operator[]( 0 ),
operator[]( 1 ) );
499 operator osg::Vec2f()
const
502 BOOST_STATIC_ASSERT( Rows == 2 );
503 return osg::Vec2f(
operator[]( 0 ),
operator[]( 1 ) );
511 operator osg::Vec3d()
const
514 BOOST_STATIC_ASSERT( ( Rows == 3 ) || ( Rows == 4 ) );
515 return osg::Vec3d(
operator[]( 0 ),
operator[]( 1 ),
operator[]( 2 ) );
523 operator osg::Vec3f()
const
526 BOOST_STATIC_ASSERT( ( Rows == 3 ) || ( Rows == 4 ) );
527 return osg::Vec3f(
operator[]( 0 ),
operator[]( 1 ),
operator[]( 2 ) );
535 operator osg::Vec4d()
const
538 BOOST_STATIC_ASSERT( Rows == 4 );
539 return osg::Vec4d(
operator[]( 0 ),
operator[]( 1 ),
operator[]( 2 ),
operator[]( 3 ) );
547 operator osg::Vec4f()
const
550 BOOST_STATIC_ASSERT( Rows == 4 );
551 return osg::Vec4f(
operator[]( 0 ),
operator[]( 1 ),
operator[]( 2 ),
operator[]( 3 ) );
559 operator osg::Matrixd()
const
561 BOOST_STATIC_ASSERT( Rows == 4 );
562 BOOST_STATIC_ASSERT( Cols == 4 );
565 for(
size_t row = 0; row < 4; ++row )
567 for(
size_t col = 0; col < 4; ++col )
585 template<
typename TargetType >
586 TargetType
as()
const
588 return operator TargetType();
599 template <
typename ResultValueType, ValueStoreTemplate ResultValueStore >
614 for(
size_t row = 0; row < Rows; ++row )
616 for(
size_t col = 0; col < Cols; ++col )
630 BOOST_STATIC_ASSERT( Rows == 4 );
631 BOOST_STATIC_ASSERT( Cols == 4 );
633 for(
size_t row = 0; row < 4; ++row )
635 for(
size_t col = 0; col < 4; ++col )
649 BOOST_STATIC_ASSERT( Rows == 3 );
650 BOOST_STATIC_ASSERT( Cols == 1 );
664 BOOST_STATIC_ASSERT( Rows == 3 );
665 BOOST_STATIC_ASSERT( Cols == 1 );
679 BOOST_STATIC_ASSERT( Rows == 4 );
680 BOOST_STATIC_ASSERT( Cols == 1 );
695 BOOST_STATIC_ASSERT( Rows == 4 );
696 BOOST_STATIC_ASSERT( Cols == 1 );
716 template <
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
736 template<
typename RHSValueT,
size_t RHSCols, ValueStoreTemplate RHSValueStoreT >
744 for( std::size_t row = 0; row < Rows; ++row )
746 for( std::size_t col = 0; col < RHSCols; ++col )
748 m( row, col ) = ResultValueType();
750 for( std::size_t i = 0; i < Cols; ++i )
752 m( row, col ) +=
operator()( row, i ) * rhs( i, col );
765 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
779 template<
typename RHSValueT >
784 for(
size_t row = 0; row < Rows; ++row )
786 for(
size_t col = 0; col < Cols; ++col )
800 template<
typename RHSValueT >
814 template<
typename RHSValueT >
819 return operator*( ResultT( 1 ) / static_cast< ResultT >( rhs ) );
828 template<
typename RHSValueT >
842 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
847 for(
size_t row = 0; row < Rows; ++row )
849 for(
size_t col = 0; col < Cols; ++col )
851 m( row, col ) =
operator()( row, col ) + rhs( row, col );
863 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
877 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
882 for(
size_t row = 0; row < Rows; ++row )
884 for(
size_t col = 0; col < Cols; ++col )
886 m( row, col ) =
operator()( row, col ) - rhs( row, col );
898 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
931 const ValueT&
operator()(
size_t row,
size_t col )
const throw()
946 BOOST_STATIC_ASSERT( Cols == 1 );
960 BOOST_STATIC_ASSERT( Cols == 1 );
977 if( ( row >= Rows ) || ( col >= Cols ) )
1000 if( ( row >= Rows ) || ( col >= Cols ) )
1016 BOOST_STATIC_ASSERT( Rows >= 1 );
1017 BOOST_STATIC_ASSERT( Cols == 1 );
1026 const ValueT&
x()
const throw()
1028 BOOST_STATIC_ASSERT( Rows >= 1 );
1029 BOOST_STATIC_ASSERT( Cols == 1 );
1040 BOOST_STATIC_ASSERT( Rows >= 2 );
1041 BOOST_STATIC_ASSERT( Cols == 1 );
1050 const ValueT&
y()
const throw()
1052 BOOST_STATIC_ASSERT( Rows >= 2 );
1053 BOOST_STATIC_ASSERT( Cols == 1 );
1064 BOOST_STATIC_ASSERT( Rows >= 3 );
1065 BOOST_STATIC_ASSERT( Cols == 1 );
1074 const ValueT&
z()
const throw()
1076 BOOST_STATIC_ASSERT( Rows >= 3 );
1077 BOOST_STATIC_ASSERT( Cols == 1 );
1093 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
1097 for(
size_t row = 0; eq && ( row < Rows ); ++row )
1099 for(
size_t col = 0; eq && ( col < Cols ); ++col )
1101 eq = eq && (
operator()( row, col ) == rhs( row, col ) );
1115 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
1116 bool operator<( const WMatrixFixed< RHSValueT, Rows, Cols, RHSValueStoreT >& rhs )
const throw()
1120 for(
size_t row = 0; eq && ( row < Rows ); ++row )
1122 for(
size_t col = 0; eq && ( col < Cols ); ++col )
1124 eq = eq && (
operator()( row, col ) == rhs( row, col ) );
1125 result = (
operator()( row, col ) < rhs( row, col ) );
1138 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
1156 template<
typename RHSValueT, ValueStoreTemplate RHSValueStoreT >
1157 void setValues(
const RHSValueStoreT< RHSValueT, Rows, Cols >& values )
1159 for( std::size_t i = 0; i < Rows; ++i )
1161 for( std::size_t j = 0; j < Cols; ++j )
1163 m_values( i, j ) =
static_cast< ValueT
>( values( i, j ) );
1195 template <
typename ScalarT,
1196 typename RHSValueT,
size_t RHSRows,
size_t RHSCols, ValueStoreTemplate RHSValueStoreT >
1221 template<
typename AValueT, ValueStoreTemplate AValueStoreT,
1222 typename BValueT, ValueStoreTemplate BValueStoreT,
1228 ResultType r = ResultType();
1229 for(
size_t i = 0; i < Rows; ++i )
1231 r += a( i, 0 ) * b( i, 0 );
1249 template<
typename AValueT, ValueStoreTemplate AValueStoreT,
1250 typename BValueT, ValueStoreTemplate BValueStoreT >
1254 typedef WMatrixFixed< typename WTypeTraits::TypePromotion< AValueT, BValueT >::Result, 3, 1 > ResultT;
1259 v[0] = a[1] * b[2] - a[2] * b[1];
1260 v[1] = a[2] * b[0] - a[0] * b[2];
1261 v[2] = a[0] * b[1] - a[1] * b[0];
1275 template<
typename ValueT, ValueStoreTemplate ValueStoreT,
size_t Rows >
1278 ValueT r = ValueT();
1279 for(
size_t i = 0; i < Rows; ++i )
1281 r += a( i, 0 ) * a( i, 0 );
1296 template<
typename ValueT, ValueStoreTemplate ValueStoreT,
size_t Cols >
1299 ValueT r = ValueT();
1300 for(
size_t i = 0; i < Cols; ++i )
1302 r += a( 0, i ) * a( 0, i );
1317 template<
typename ValueT, ValueStoreTemplate ValueStoreT,
size_t Rows >
1320 return sqrt( length2( a ) );
1333 template<
typename ValueT, ValueStoreTemplate ValueStoreT,
size_t Cols >
1336 return sqrt( length2( a ) );
1350 template<
typename RHSValueT,
size_t Rows,
size_t Cols, ValueStoreTemplate RHSValueStoreT >
1354 return m *
static_cast< RHSValueT
>( 1.0 / length( m ) );
1369 template<
typename ValueT, std::
size_t Size,
template<
typename, std::
size_t, std::
size_t >
class ValueStoreT >
1390 template<
typename ValueT, std::
size_t Rows, std::
size_t Cols,
template<
typename, std::
size_t, std::
size_t >
class ValueStoreT >
1394 for(
size_t row = 0; row < mat.
getRows(); ++row )
1396 for(
size_t col = 0; col < mat.
getColumns(); ++col )
1398 res( col, row ) = mat( row, col );
1417 template<
typename ValueT,
size_t Rows,
size_t Cols, ValueStoreTemplate ValueStoreT >
1418 std::ostream& operator<<( std::ostream& out, const WMatrixFixed< ValueT, Rows, Cols, ValueStoreT >& m )
1421 for(
size_t row = 0; row < m.getRows(); ++row )
1423 for(
size_t col = 0; col < m.getColumns(); ++col )
1425 out << m( row, col ) <<
";";
1444 template<
typename ValueT,
size_t Rows,
size_t Cols, ValueStoreTemplate ValueStoreT >
1448 typedef boost::tokenizer< boost::char_separator< char > > Tokenizer;
1452 boost::char_separator< char > separators(
" ;" );
1453 Tokenizer t( s, separators );
1455 Tokenizer::iterator it = t.begin();
1456 for( std::size_t row = 0; row < Rows; ++row )
1458 for( std::size_t col = 0; col < Cols; ++col )
1464 m( row, col ) = string_utils::fromString< ValueT >( *it );
1472 #endif // WMATRIXFIXED_H