36 template<
typename T >
43 static const size_t DIM = 3;
78 Matrix33(
const T *dt,
bool srcIsRowMajor =
false );
81 Matrix33( T d0, T d1, T d2, T d3, T d4, T d5, T d6, T d7, T d8,
bool srcIsRowMajor =
false );
86 template<
typename FromT >
93 operator T*() {
return (T*)
m; }
94 operator const T*()
const {
return (
const T*)
m; }
99 template<
typename FromT >
131 T&
at(
int row,
int col );
132 const T&
at(
int row,
int col )
const;
135 void set(
const T *dt,
bool srcIsRowMajor =
false );
137 void set( T d0, T d1, T d2, T d3, T d4, T d5, T d6, T d7, T d8,
bool srcIsRowMajor =
false );
181 template <
template <
typename>
class VecT>
184 template <
template <
typename>
class VecT>
187 template <
template <
typename>
class VecT>
214 friend std::ostream& operator<<( std::ostream &lhs, const Matrix33<T> &rhs )
216 for(
int i = 0; i < 3; i++) {
218 for(
int j = 0; j < 3; j++) {
219 lhs << std::setw( 12 ) << std::setprecision( 5 ) << rhs.m[j*3+i];
221 lhs <<
"|" << std::endl;
228 template<
typename T >
234 template<
typename T >
237 for(
int i = 0; i < DIM_SQ; ++i ) {
242 template<
typename T >
245 set( dt, srcIsRowMajor );
248 template<
typename T >
253 d6, d7, d8, srcIsRowMajor );
256 template<
typename T >
259 m00 = vx.
x; m01 = vy.
x; m02 = vz.
x;
260 m10 = vx.
y; m11 = vy.
y; m12 = vz.
y;
261 m20 = vx.
z; m21 = vy.
z; m22 = vz.
z;
264 template<
typename T >
265 template<
typename FromT >
268 for(
int i = 0; i < DIM_SQ; ++i ) {
269 m[i] =
static_cast<T
>( src.
m[i] );
273 template<
typename T >
277 m00 = src.
m00; m01 = src.
m01;
278 m10 = src.
m10; m11 = src.
m11;
281 template<
typename T >
284 std::memcpy(
m, src.
m, MEM_LEN );
287 template<
typename T >
290 memcpy(
m, rhs.
m, MEM_LEN );
294 template<
typename T >
297 for(
int i = 0; i < DIM_SQ; ++i ) {
303 template<
typename T >
304 template<
typename FromT >
307 for(
int i = 0; i < DIM_SQ; i++ ) {
308 m[i] =
static_cast<T
>(rhs.
m[i]);
313 template<
typename T >
317 m00 = rhs.
m00; m01 = rhs.
m01;
318 m10 = rhs.
m10; m11 = rhs.
m11;
322 template<
typename T >
325 for(
int i = 0; i < DIM_SQ; ++i ) {
332 template<
typename T >
337 mat.
m[0] =
m[0]*rhs.
m[0] +
m[3]*rhs.
m[1] +
m[6]*rhs.
m[2];
338 mat.
m[1] =
m[1]*rhs.
m[0] +
m[4]*rhs.
m[1] +
m[7]*rhs.
m[2];
339 mat.
m[2] =
m[2]*rhs.
m[0] +
m[5]*rhs.
m[1] +
m[8]*rhs.
m[2];
341 mat.
m[3] =
m[0]*rhs.
m[3] +
m[3]*rhs.
m[4] +
m[6]*rhs.
m[5];
342 mat.
m[4] =
m[1]*rhs.
m[3] +
m[4]*rhs.
m[4] +
m[7]*rhs.
m[5];
343 mat.
m[5] =
m[2]*rhs.
m[3] +
m[5]*rhs.
m[4] +
m[8]*rhs.
m[5];
345 mat.
m[6] =
m[0]*rhs.
m[6] +
m[3]*rhs.
m[7] +
m[6]*rhs.
m[8];
346 mat.
m[7] =
m[1]*rhs.
m[6] +
m[4]*rhs.
m[7] +
m[7]*rhs.
m[8];
347 mat.
m[8] =
m[2]*rhs.
m[6] +
m[5]*rhs.
m[7] +
m[8]*rhs.
m[8];
354 template<
typename T >
357 for(
int i = 0; i < DIM_SQ; ++i ) {
363 template<
typename T >
366 for(
int i = 0; i < DIM_SQ; ++i ) {
372 template<
typename T >
375 for(
int i = 0; i < DIM_SQ; ++i ) {
381 template<
typename T >
385 for(
int i = 0; i < DIM_SQ; ++i ) {
391 template<
typename T >
394 for(
int i = 0; i < DIM_SQ; ++i ) {
400 template<
typename T >
403 for(
int i = 0; i < DIM_SQ; ++i ) {
409 template<
typename T >
414 ret.
m[0] =
m[0]*rhs.
m[0] +
m[3]*rhs.
m[1] +
m[6]*rhs.
m[2];
415 ret.
m[1] =
m[1]*rhs.
m[0] +
m[4]*rhs.
m[1] +
m[7]*rhs.
m[2];
416 ret.
m[2] =
m[2]*rhs.
m[0] +
m[5]*rhs.
m[1] +
m[8]*rhs.
m[2];
418 ret.
m[3] =
m[0]*rhs.
m[3] +
m[3]*rhs.
m[4] +
m[6]*rhs.
m[5];
419 ret.
m[4] =
m[1]*rhs.
m[3] +
m[4]*rhs.
m[4] +
m[7]*rhs.
m[5];
420 ret.
m[5] =
m[2]*rhs.
m[3] +
m[5]*rhs.
m[4] +
m[8]*rhs.
m[5];
422 ret.
m[6] =
m[0]*rhs.
m[6] +
m[3]*rhs.
m[7] +
m[6]*rhs.
m[8];
423 ret.
m[7] =
m[1]*rhs.
m[6] +
m[4]*rhs.
m[7] +
m[7]*rhs.
m[8];
424 ret.
m[8] =
m[2]*rhs.
m[6] +
m[5]*rhs.
m[7] +
m[8]*rhs.
m[8];
429 template<
typename T >
433 for(
int i = 0; i < DIM_SQ; ++i ) {
434 ret.
m[i] =
m[i] + rhs.
m[i];
439 template<
typename T >
443 for(
int i = 0; i < DIM_SQ; ++i ) {
444 ret.
m[i] =
m[i] - rhs.
m[i];
449 template<
typename T >
453 m[0]*rhs.
x +
m[3]*rhs.
y +
m[6]*rhs.
z,
454 m[1]*rhs.
x +
m[4]*rhs.
y +
m[7]*rhs.
z,
455 m[2]*rhs.
x +
m[5]*rhs.
y +
m[8]*rhs.
z
459 template<
typename T >
463 for(
int i = 0; i < DIM_SQ; ++i ) {
469 template<
typename T >
474 for(
int i = 0; i < DIM_SQ; ++i ) {
480 template<
typename T >
484 for(
int i = 0; i < DIM_SQ; ++i ) {
485 ret.
m[i] =
m[i] + rhs;
490 template<
typename T >
494 for(
int i = 0; i < DIM_SQ; ++i ) {
495 ret.
m[i] =
m[i] - rhs;
500 template<
typename T >
503 assert(row >= 0 && row < DIM);
504 assert(col >= 0 && col < DIM);
505 return m[col*DIM +
row];
508 template<
typename T >
511 assert(row >= 0 && row < DIM);
512 assert(col >= 0 && col < DIM);
513 return m[col*DIM +
row];
516 template<
typename T >
519 if( srcIsRowMajor ) {
520 m[0] = dt[0];
m[3] = dt[1];
m[6] = dt[2];
521 m[1] = dt[3];
m[4] = dt[4];
m[7] = dt[5];
522 m[2] = dt[6];
m[5] = dt[7];
m[8] = dt[8];
525 std::memcpy(
m, dt, MEM_LEN );
529 template<
typename T >
530 void Matrix33<T>::set( T d0, T d1, T d2, T d3, T d4, T d5, T d6, T d7, T d8,
bool srcIsRowMajor )
532 if( srcIsRowMajor ) {
533 m[0] = d0;
m[3] = d1;
m[6] = d2;
534 m[1] = d3;
m[4] = d4;
m[7] = d5;
535 m[2] = d6;
m[5] = d7;
m[8] = d8;
538 m[0] = d0;
m[3] = d3;
m[6] = d6;
539 m[1] = d1;
m[4] = d4;
m[7] = d7;
540 m[2] = d2;
m[5] = d5;
m[8] = d8;
544 template<
typename T >
555 template<
typename T >
564 template<
typename T >
574 template<
typename T >
582 template<
typename T >
585 *c0 = getColumn( 0 );
586 *c1 = getColumn( 1 );
587 *c2 = getColumn( 2 );
590 template<
typename T >
598 template<
typename T >
606 template<
typename T >
614 template<
typename T >
620 for(
int i = 0; i < 2; ++i ) {
625 for(
int j = 0; j < 2; ++j ) {
630 ret.
at( i, j ) = at( r, c );
637 template<
typename T >
640 std::memset(
m, 0, MEM_LEN );
643 template<
typename T >
646 m00 = 1; m01 = 0; m02 = 0;
647 m10 = 0; m11 = 1; m12 = 0;
648 m20 = 0; m21 = 0; m22 = 1;
651 template<
typename T >
654 T co00 =
m[4]*
m[8] -
m[5]*
m[7];
655 T co10 = m[5]*m[6] - m[3]*m[8];
656 T co20 = m[3]*m[7] - m[4]*m[6];
658 T det = m[0]*co00 + m[1]*co10 + m[2]*co20;
663 template<
typename T >
666 return m00 + m11 + m22;
669 template<
typename T >
679 template<
typename T >
684 ret.
m10 = m10; ret.
m11 = m11; ret.
m12 = 0;
685 ret.
m20 = m20; ret.
m21 = m21; ret.
m22 = m22;
689 template<
typename T >
693 ret.
m00 = m00; ret.
m01 = m01; ret.
m02 = m02;
694 ret.
m10 = 0; ret.
m11 = m11; ret.
m12 = m12;
699 template<
typename T >
703 t = m01; m01 = m10; m10 =
t;
704 t = m02; m02 = m20; m20 =
t;
705 t = m12; m12 = m21; m21 =
t;
708 template<
typename T >
718 template<
typename T >
724 inv.
m[0] =
m[4]*
m[8] -
m[5]*
m[7];
725 inv.
m[1] = m[2]*m[7] - m[1]*m[8];
726 inv.
m[2] = m[1]*m[5] - m[2]*m[4];
727 inv.
m[3] = m[5]*m[6] - m[3]*m[8];
728 inv.
m[4] = m[0]*m[8] - m[2]*m[6];
729 inv.
m[5] = m[2]*m[3] - m[0]*m[5];
730 inv.
m[6] = m[3]*m[7] - m[4]*m[6];
731 inv.
m[7] = m[1]*m[6] - m[0]*m[7];
732 inv.
m[8] = m[0]*m[4] - m[1]*m[3];
734 T det = m[0]*inv.
m[0] + m[1]*inv.
m[3] + m[2]*inv.
m[6];
736 if( fabs( det ) > epsilon ) {
752 template<
typename T >
756 v.
x*m00 + v.
y*m10 + v.
z*m20,
757 v.
x*m01 + v.
y*m11 + v.
z*m21,
758 v.
x*m02 + v.
y*m12 + v.
z*m22
762 template<
typename T >
766 m00*v.
x + m01*v.
y + m02*v.
z,
767 m10*v.
x + m11*v.
y + m12*v.
z,
768 m20*v.
x + m21*v.
y + m22*v.
z
772 template<
typename T >
778 for(
int i = 0; i < DIM; i++ ) {
779 for(
int j = 0; j < DIM; j++ ) {
780 ret.
at( j, i ) = at( i, j );
803 Matrix33<T> zAxis2ToDir = alignZAxisWithTarget( to, worldUp );
804 return fromDir2zAxis * zAxis2ToDir;
817 ret.
m[0] = unit.x * unit.x * (1 - cosine) + cosine;
818 ret.
m[1] = unit.x * unit.y * (1 - cosine) + unit.z * sine;
819 ret.
m[2] = unit.x * unit.z * (1 - cosine) - unit.y * sine;
821 ret.
m[3] = unit.x * unit.y * (1 - cosine) - unit.z * sine;
822 ret.
m[4] = unit.y * unit.y * (1 - cosine) + cosine;
823 ret.
m[5] = unit.y * unit.z * (1 - cosine) + unit.x * sine;
825 ret.
m[6] = unit.x * unit.z * (1 - cosine) + unit.y * sine;
826 ret.
m[7] = unit.y * unit.z * (1 - cosine) - unit.x * sine;
827 ret.
m[8] = unit.z * unit.z * (1 - cosine) + cosine;
845 T cos_rz, sin_rz, cos_ry, sin_ry, cos_rx, sin_rx;
855 ret.
m[0] = cos_rz*cos_ry;
856 ret.
m[1] = sin_rz*cos_ry;
859 ret.
m[3] = -sin_rz*cos_rx + cos_rz*sin_ry*sin_rx;
860 ret.
m[4] = cos_rz*cos_rx + sin_rz*sin_ry*sin_rx;
861 ret.
m[5] = cos_ry*sin_rx;
863 ret.
m[6] = sin_rz*sin_rx + cos_rz*sin_ry*cos_rx;
864 ret.
m[7] = -cos_rz*sin_rx + sin_rz*sin_ry*cos_rx;
865 ret.
m[8] = cos_ry*cos_rx;
921 if( upDir.
cross( targetDir ).lengthSquared() == 0 ) {
942 row[0].
x, row[0].
y, row[0].
z,
943 row[1].x, row[1].y, row[1].z,
944 row[2].x, row[2].y, row[2].z
GLdouble GLdouble GLdouble r
Definition: GLee.h:1474
T mcols[3][3]
Definition: Matrix33.h:70
Vec3< T > transformVec(const Vec3< T > &v) const
Definition: Matrix33.h:178
T m22
Definition: Matrix33.h:67
GLenum GLint GLint y
Definition: GLee.h:987
T lengthSquared() const
Definition: Vector.h:443
Definition: CinderMath.h:40
static T cos(T x)
Definition: CinderMath.h:46
const Matrix33< T > operator-(const Matrix33< T > &rhs) const
Definition: Matrix33.h:440
Vec3< T > preMultiply(const Vec3< T > &v) const
Definition: Matrix33.h:753
static const size_t DIM
Definition: Matrix33.h:43
T trace() const
Definition: Matrix33.h:664
static Matrix33< T > zero()
Definition: Matrix33.h:198
static Matrix33< T > alignZAxisWithTarget(Vec3< T > targetDir, Vec3< T > upDir)
Definition: Matrix33.h:904
void setRow(int row, const Vec3< T > &v)
Definition: Matrix33.h:575
void setToIdentity()
Definition: Matrix33.h:644
static Matrix33< T > identity()
Definition: Matrix33.h:194
static T sin(T x)
Definition: CinderMath.h:47
Matrix33< T > invertTransform() const
Definition: Matrix33.h:773
T & at(int row, int col)
Definition: Matrix33.h:501
T m01
Definition: Matrix22.h:64
void set(const T *dt, bool srcIsRowMajor=false)
Definition: Matrix33.h:517
Matrix33< T > & operator/=(T s)
Definition: Matrix33.h:382
Matrix33< T > lowerTriangular() const
Definition: Matrix33.h:680
#define EPSILON
Definition: CinderMath.h:125
Matrix33< T > & operator=(const Matrix33< T > &rhs)
Definition: Matrix33.h:288
void rotate(const VecT< T > &eulerRadians)
Definition: Matrix33.h:185
T z
Definition: Vector.h:321
T value_type
Definition: Matrix33.h:41
static const size_t DIM_SQ
Definition: Matrix33.h:44
void setToNull()
Definition: Matrix22.h:553
void transpose()
Definition: Matrix33.h:700
GLuint src
Definition: GLee.h:10873
T x
Definition: Vector.h:321
T x
Definition: Vector.h:71
GLfloat angle
Definition: GLee.h:13523
bool equalCompare(const Matrix33< T > &rhs, T epsilon) const
Definition: Matrix33.h:323
T y
Definition: Vector.h:321
static Matrix33< T > createScale(T s)
Definition: Matrix33.h:871
Matrix22< T > subMatrix22(int row, int col) const
Definition: Matrix33.h:615
void rotate(const VecT< T > &from, const VecT< T > &to, const VecT< T > &worldUp)
Definition: Matrix33.h:188
void getColumns(Vec3< T > *c0, Vec3< T > *c1, Vec3< T > *c2) const
Definition: Matrix33.h:583
Matrix33< float > Matrix33f
Definition: Matrix33.h:952
T m[9]
Definition: Matrix33.h:60
T m12
Definition: Matrix33.h:67
void invert(T epsilon=FLT_MIN)
Definition: Matrix33.h:168
T m10
Definition: Matrix22.h:63
T m20
Definition: Matrix33.h:65
Vec3< T > getRow(int row) const
Definition: Matrix33.h:565
GLenum GLenum GLvoid * row
Definition: GLee.h:1089
static Vec3< T > yAxis()
Definition: Vector.h:684
T m11
Definition: Matrix33.h:66
Matrix33< T > diagonal() const
Definition: Matrix33.h:670
T m00
Definition: Matrix33.h:65
const Matrix33< T > operator*(const Matrix33< T > &rhs) const
Definition: Matrix33.h:410
T m21
Definition: Matrix33.h:66
T m10
Definition: Matrix33.h:65
Vec3< T > postMultiply(const Vec3< T > &v) const
Definition: Matrix33.h:763
GLenum GLint x
Definition: GLee.h:987
const Matrix33< T > operator/(T rhs) const
Definition: Matrix33.h:470
T m01
Definition: Matrix33.h:66
Vec3< T > getColumn(int col) const
Definition: Matrix33.h:545
T & at(int row, int col)
Definition: Matrix22.h:450
void getRows(Vec3< T > *r0, Vec3< T > *r1, Vec3< T > *r2) const
Definition: Matrix33.h:599
const GLdouble * v
Definition: GLee.h:1384
GLdouble GLdouble z
Definition: GLee.h:1911
T y
Definition: Vector.h:71
T TYPE
Definition: Matrix33.h:40
Matrix33()
Definition: Matrix33.h:229
const GLubyte * c
Definition: GLee.h:8491
void setColumn(int col, const Vec3< T > &v)
Definition: Matrix33.h:556
Matrix33< double > Matrix33d
Definition: Matrix33.h:953
Matrix33< T > upperTriangular() const
Definition: Matrix33.h:690
Vec3< T > cross(const Vec3< T > &rhs) const
Definition: Vector.h:423
static Matrix33< T > createRotation(const Vec3< T > &axis, T radians)
Definition: Matrix33.h:809
T m00
Definition: Matrix22.h:63
void setToNull()
Definition: Matrix33.h:638
Matrix33< T > & operator*=(const Matrix33< T > &rhs)
Definition: Matrix33.h:333
static Matrix33< T > one()
Definition: Matrix33.h:196
static const size_t MEM_LEN
Definition: Matrix33.h:45
Definition: Matrix22.h:37
bool operator==(const Matrix33< T > &rhs) const
Definition: Matrix33.h:106
void setColumns(const Vec3< T > &c0, const Vec3< T > &c1, const Vec3< T > &c2)
Definition: Matrix33.h:591
T m11
Definition: Matrix22.h:64
void setRows(const Vec3< T > &r0, const Vec3< T > &r1, const Vec3< T > &r2)
Definition: Matrix33.h:607
T m02
Definition: Matrix33.h:67
T determinant() const
Definition: Matrix33.h:652
const GLfloat * m
Definition: GLee.h:13493
bool operator!=(const Matrix33< T > &rhs) const
Definition: Matrix33.h:107
Matrix33< T > transposed() const
Definition: Matrix33.h:709
GLdouble GLdouble t
Definition: GLee.h:1426
GLdouble s
Definition: GLee.h:1378
const Matrix33< T > operator+(const Matrix33< T > &rhs) const
Definition: Matrix33.h:430
Definition: Matrix33.h:37
void rotate(const VecT< T > &axis, T radians)
Definition: Matrix33.h:182
Matrix33< T > inverted(T epsilon=FLT_MIN) const
Definition: Matrix33.h:719
Matrix33< T > & operator+=(const Matrix33< T > &rhs)
Definition: Matrix33.h:355
Vec3< T > normalized() const
Definition: Vector.h:492
Matrix33< T > & operator-=(const Matrix33< T > &rhs)
Definition: Matrix33.h:364
static Vec3< T > zAxis()
Definition: Vector.h:685