44 static const size_t MEM_LEN =
sizeof(T)*6;
82 template<
typename FromT>
89 template<
typename FromT>
122 T&
at(
int row,
int col );
123 const T&
at(
int row,
int col )
const;
129 void set(
const T *dt );
131 void set( T d0, T d1, T d2, T d3, T d4, T d5 );
203 friend std::ostream& operator<<( std::ostream &lhs, const MatrixAffine2<T> &rhs )
205 for(
int i = 0; i < 2; i++) {
207 for(
int j = 0; j < 3; j++) {
208 lhs << std::setw( 12 ) << std::setprecision( 5 ) << rhs.m[j*2+i];
210 lhs <<
"|" << std::endl;
226 for(
int i = 0; i < 6; ++i )
239 set( d0, d1, d2, d3, d4, d5 );
245 m00 = vx.
x; m01 = vy.
x; m02 = vz.
x;
246 m10 = vx.
y; m11 = vy.
y; m12 = vz.
y;
250 template<
typename FromT >
253 for(
int i = 0; i < 6; ++i ) {
254 m[i] =
static_cast<T
>( src.
m[i] );
261 std::memcpy(
m, src.
m, MEM_LEN );
267 memcpy(
m, rhs.
m, MEM_LEN );
274 for(
int i = 0; i < 6; ++i ) {
281 template<
typename FromT >
284 for(
int i = 0; i < 6; i++ ) {
285 m[i] =
static_cast<T
>(rhs.
m[i]);
293 for(
int i = 0; i < 6; ++i ) {
305 mat.
m[0] =
m[0]*rhs.
m[0] +
m[2]*rhs.
m[1];
306 mat.
m[1] =
m[1]*rhs.
m[0] +
m[3]*rhs.
m[1];
308 mat.
m[2] =
m[0]*rhs.
m[2] +
m[2]*rhs.
m[3];
309 mat.
m[3] =
m[1]*rhs.
m[2] +
m[3]*rhs.
m[3];
311 mat.
m[4] =
m[0]*rhs.
m[4] +
m[2]*rhs.
m[5] +
m[4];
312 mat.
m[5] =
m[1]*rhs.
m[4] +
m[3]*rhs.
m[5] +
m[5];
321 for(
int i = 0; i < 6; ++i )
329 for(
int i = 0; i < 6; ++i )
337 for(
int i = 0; i < 6; ++i )
346 for(
int i = 0; i < 6; ++i )
354 for(
int i = 0; i < 6; ++i )
362 for(
int i = 0; i < 6; ++i )
372 ret.
m[0] =
m[0]*rhs.
m[0] +
m[2]*rhs.
m[1];
373 ret.
m[1] =
m[1]*rhs.
m[0] +
m[3]*rhs.
m[1];
375 ret.
m[2] =
m[0]*rhs.
m[2] +
m[2]*rhs.
m[3];
376 ret.
m[3] =
m[1]*rhs.
m[2] +
m[3]*rhs.
m[3];
378 ret.
m[4] =
m[0]*rhs.
m[4] +
m[2]*rhs.
m[5] +
m[4];
379 ret.
m[5] =
m[1]*rhs.
m[4] +
m[3]*rhs.
m[5] +
m[5];
388 for(
int i = 0; i < 6; ++i )
389 ret.
m[i] =
m[i] + rhs.
m[i];
397 for(
int i = 0; i < 6; ++i )
398 ret.
m[i] =
m[i] - rhs.
m[i];
405 return Vec2<T>( rhs.
x *
m[0] + rhs.
y *
m[2] +
m[4], rhs.
x * m[1] + rhs.
y * m[3] + m[5] );
411 return Vec2<T>( rhs.
x *
m[0] + rhs.
y *
m[2] +
m[4], rhs.
x * m[1] + rhs.
y * m[3] + m[5] );
424 for(
int i = 0; i < 6; ++i )
434 for(
int i = 0; i < 6; ++i )
435 ret.
m[i] =
m[i] * invS;
443 for(
int i = 0; i < 6; ++i )
444 ret.
m[i] =
m[i] + rhs;
452 for(
int i = 0; i < 6; ++i )
453 ret.
m[i] =
m[i] - rhs;
460 assert(row >= 0 && row < 2);
461 assert(col >= 0 && col < 3);
462 return m[col*2 +
row];
468 assert(row >= 0 && row < 2);
469 assert(col >= 0 && col < 3);
470 return m[col*2 +
row];
476 m[0] = d[0];
m[3] = d[3];
477 m[1] = d[1];
m[4] = d[4];
478 m[2] = d[2];
m[5] = d[5];
484 m[0] = d0;
m[3] = d3;
485 m[1] = d1;
m[4] = d4;
486 m[2] = d2;
m[5] = d5;
528 *c0 = getColumn( 0 );
529 *c1 = getColumn( 1 );
530 *c2 = getColumn( 2 );
560 std::memset(
m, 0, MEM_LEN );
566 m[0] = 1;
m[2] = 0;
m[4] = 0;
567 m[1] = 0;
m[3] = 1;
m[5] = 0;
573 return fabs(
m[0] *
m[3] -
m[2] *
m[1] ) <= (T)
EPSILON;
585 inv.
m[4] =
m[2]*
m[5] -
m[3]*
m[4];
586 inv.
m[5] = m[1]*m[4] - m[0]*m[5];
588 T det = m[0]*inv.
m[0] + m[1]*inv.
m[2];
590 if( fabs( det ) > epsilon ) {
606 m[4] +=
m[0]*v.
x +
m[2]*v.
y;
607 m[5] +=
m[1]*v.
x +
m[3]*v.
y;
681 ret.
m[4] = pt.
x - cosine * pt.
x + sine * pt.
y;
682 ret.
m[5] = pt.
y - sine * pt.
x - cosine * pt.
y;
const MatrixAffine2< T > operator*(const MatrixAffine2< T > &rhs) const
Definition: MatrixAffine2.h:368
Definition: CinderMath.h:40
void translate(const Vec2< T > &v)
concatenate translation by v (conceptually, translate is before 'this')
Definition: MatrixAffine2.h:604
static MatrixAffine2< T > makeScale(T s)
Definition: MatrixAffine2.h:688
static T cos(T x)
Definition: CinderMath.h:46
MatrixAffine2< T > & operator=(const MatrixAffine2< T > &rhs)
Definition: MatrixAffine2.h:265
static MatrixAffine2< T > makeRotate(T radians)
Definition: MatrixAffine2.h:648
void invert(T epsilon=EPSILON)
Returns a copy of the matrix inverted. epsilon specifies the tolerance for testing for singularity...
Definition: MatrixAffine2.h:154
void setColumn(int col, const Vec2< T > &v)
Definition: MatrixAffine2.h:500
MatrixAffine2< T > & operator+=(const MatrixAffine2< T > &rhs)
Definition: MatrixAffine2.h:319
MatrixAffine2 translateCopy(const Vec2< T > &v) const
Returns a copy of the matrix translated by v.
Definition: MatrixAffine2.h:161
static T sin(T x)
Definition: CinderMath.h:47
#define EPSILON
Definition: CinderMath.h:125
Vec2< T > getColumn(int col) const
Definition: MatrixAffine2.h:490
T m11
Definition: MatrixAffine2.h:67
MatrixAffine2< T > & operator/=(T s)
Definition: MatrixAffine2.h:343
T z
Definition: Vector.h:321
bool equalCompare(const MatrixAffine2< T > &rhs, T epsilon) const
Definition: MatrixAffine2.h:291
T m00
Definition: MatrixAffine2.h:66
GLuint src
Definition: GLee.h:10873
MatrixAffine2 rotateCopy(T radians, const Vec2< T > &pt) const
Returns a copy of the matrix rotate by radians around the point pt.
Definition: MatrixAffine2.h:170
T x
Definition: Vector.h:321
bool operator==(const MatrixAffine2< T > &rhs) const
Definition: MatrixAffine2.h:93
T x
Definition: Vector.h:71
void setColumns(const Vec2< T > &c0, const Vec2< T > &c1, const Vec2< T > &c2)
Definition: MatrixAffine2.h:534
T y
Definition: Vector.h:321
MatrixAffine2 scaleCopy(T s) const
Returns a copy of the matrix scaled by s.
Definition: MatrixAffine2.h:177
T mcols[3][2]
Definition: MatrixAffine2.h:71
T value_type
Definition: MatrixAffine2.h:42
GLenum GLenum GLvoid * row
Definition: GLee.h:1089
void getColumns(Vec2< T > *c0, Vec2< T > *c1, Vec2< T > *c2) const
Definition: MatrixAffine2.h:526
void setRow(int row, const Vec3< T > &v)
Definition: MatrixAffine2.h:518
static MatrixAffine2< T > makeTranslate(const Vec2< T > &v)
Definition: MatrixAffine2.h:631
MatrixAffine2< T > & operator-=(const MatrixAffine2< T > &rhs)
Definition: MatrixAffine2.h:327
MatrixAffine2< T > invertCopy(T epsilon=EPSILON) const
Returns a copy of the matrix inverted. epsilon specifies the tolerance for testing for singularity...
Definition: MatrixAffine2.h:577
Vec2< T > transformPoint(const Vec2< T > &rhs) const
post-multiplies column vector [rhs.x rhs.y 1]
Definition: MatrixAffine2.h:403
T & at(int row, int col)
Definition: MatrixAffine2.h:458
bool isSingular() const
Returns whether the matrix is singular (and consequently not invertible) or not.
Definition: MatrixAffine2.h:571
T m02
Definition: MatrixAffine2.h:68
const MatrixAffine2< T > operator-(const MatrixAffine2< T > &rhs) const
Definition: MatrixAffine2.h:394
MatrixAffine2 scaleCopy(const Vec2< T > &v) const
Returns a copy of the matrix scaled by v.
Definition: MatrixAffine2.h:179
bool operator!=(const MatrixAffine2< T > &rhs) const
Definition: MatrixAffine2.h:94
void setToIdentity()
Sets the matrix to the identity matrix.
Definition: MatrixAffine2.h:564
T TYPE
Definition: MatrixAffine2.h:41
MatrixAffine2()
Definition: MatrixAffine2.h:218
const GLdouble * v
Definition: GLee.h:1384
void setRows(const Vec3< T > &r0, const Vec3< T > &r1, const Vec3< T > &r2)
Definition: MatrixAffine2.h:550
static T tan(T x)
Definition: CinderMath.h:48
T y
Definition: Vector.h:71
T & operator[](int idx)
Definition: MatrixAffine2.h:125
void scale(T s)
concatenate scale (conceptually, scale is before 'this')
Definition: MatrixAffine2.h:611
MatrixAffine2 rotateCopy(T radians) const
Returns a copy of the matrix rotate by radians.
Definition: MatrixAffine2.h:168
void rotate(T radians)
concatenate rotation by radians (conceptually, rotate is before 'this')
Definition: MatrixAffine2.h:164
Represents a two dimensional affine transformation.
Definition: MatrixAffine2.h:38
T m12
Definition: MatrixAffine2.h:68
void setToNull()
Sets the matrix to all zeros.
Definition: MatrixAffine2.h:558
static MatrixAffine2< T > zero()
Definition: MatrixAffine2.h:186
const MatrixAffine2< T > operator/(T rhs) const
Definition: MatrixAffine2.h:430
T m10
Definition: MatrixAffine2.h:66
MatrixAffine2< T > & operator*=(const MatrixAffine2< T > &rhs)
Definition: MatrixAffine2.h:301
static MatrixAffine2< T > one()
Definition: MatrixAffine2.h:184
T m[6]
Definition: MatrixAffine2.h:61
MatrixAffine2< double > MatrixAffine2d
Definition: MatrixAffine2.h:759
static const size_t MEM_LEN
Definition: MatrixAffine2.h:44
void rotate(T radians, const Vec2< T > &pt)
concatenate rotation by radians around the point pt (conceptually, rotate is before 'this') ...
Definition: MatrixAffine2.h:166
static MatrixAffine2< T > identity()
Definition: MatrixAffine2.h:182
static MatrixAffine2< T > makeSkewX(T radians)
Definition: MatrixAffine2.h:722
const GLfloat * m
Definition: GLee.h:13493
static MatrixAffine2< T > makeSkewY(T radians)
Definition: MatrixAffine2.h:739
Vec3< T > getRow(int row) const
Definition: MatrixAffine2.h:508
T m01
Definition: MatrixAffine2.h:67
MatrixAffine2< float > MatrixAffine2f
Definition: MatrixAffine2.h:758
GLdouble s
Definition: GLee.h:1378
Vec2< T > transformVec(const Vec2< T > &v) const
post-multiplies column vector [rhs.x rhs.y 0]
Definition: MatrixAffine2.h:415
const MatrixAffine2< T > operator+(const MatrixAffine2< T > &rhs) const
Definition: MatrixAffine2.h:385
const T & operator[](int idx) const
Definition: MatrixAffine2.h:126
void set(const T *dt)
Definition: MatrixAffine2.h:474
void getRows(Vec3< T > *r0, Vec3< T > *r1, Vec3< T > *r2) const
Definition: MatrixAffine2.h:542