00001
00022
00023
00024
00025
00026 #ifndef __SYNFIG_MATRIX_H
00027 #define __SYNFIG_MATRIX_H
00028
00029
00030
00031 #include "angle.h"
00032 #include "real.h"
00033 #include "vector.h"
00034 #include <math.h>
00035
00036
00037
00038
00039 #ifdef WIN32
00040 #include <float.h>
00041 #ifndef isnan
00042 extern "C" { int _isnan(double x); }
00043 #define isnan _isnan
00044 #endif
00045 #endif
00046
00047
00048
00049 #if defined(__APPLE__) && !defined(SYNFIG_ISNAN_FIX)
00050 #ifdef isnan
00051 #undef isnan
00052 #endif
00053 inline bool isnan(double x) { return x != x; }
00054 inline bool isnan(float x) { return x != x; }
00055 #define SYNFIG_ISNAN_FIX 1
00056 #endif
00057
00058
00059
00060
00061
00062
00063 namespace synfig {
00064
00068 class Matrix
00069 {
00070 public:
00071 typedef Real value_type;
00072
00073 private:
00075 value_type m00, m01, m02;
00076 value_type m10, m11, m12;
00077 value_type m20, m21, m22;
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 public:
00091 Matrix() {
00092 m00=1.0; m01=0.0; m02=0.0;
00093 m10=0.0; m11=1.0; m12=0.0;
00094 m20=0.0; m21=0.0; m22=1.0;
00095 }
00096
00098 Matrix(const Angle &a){
00099 (*this).set_rotate(a);
00100 }
00102 Matrix &
00103 set_identity(){
00104 m00=1.0; m01=0.0; m02=0.0;
00105 m10=0.0; m11=1.0; m12=0.0;
00106 m20=0.0; m21=0.0; m22=1.0;
00107 return (*this);
00108 }
00113 Matrix &
00114 set_scale(const value_type &sx, const value_type &sy){
00115 m00=sx; m01=0.0; m02=0.0;
00116 m10=0.0; m11=sy; m12=0.0;
00117 m20=0.0; m21=0.0; m22=1.0;
00118 return (*this);
00119 }
00123 Matrix &
00124 set_rotate(const Angle &a){
00125 value_type c(Angle::cos(a).get());
00126 value_type s(Angle::sin(a).get());
00127 m00= c; m01=s; m02=0.0;
00128 m10=-1.0*s; m11=c; m12=0.0;
00129 m20=0.0; m21=0.0; m22=1.0;
00130 return (*this);
00131 }
00135 Matrix &
00136 set_translate(const Vector &t){
00137 m00=1.0; m01=0.0; m02=0.0;
00138 m10=0.0; m11=1.0; m12=0.0;
00139 m20=t[0]; m21=t[1]; m22=1.0;
00140 return (*this);
00141 }
00142
00146 Vector
00147 get_transformed(const Vector &v){
00148 return Vector(v[0]*m00+v[1]*m10+m20,v[0]*m01+v[1]*m11+m21);
00149 }
00150
00154 Matrix
00155 operator *(const Matrix &rhs){
00156 Matrix ret;
00157 ret.m00=m00*rhs.m00 + m01*rhs.m10 + m02*rhs.m20;
00158 ret.m01=m00*rhs.m01 + m01*rhs.m11 + m02*rhs.m21;
00159 ret.m02=m00*rhs.m02 + m01*rhs.m12 + m02*rhs.m22;
00160
00161 ret.m10=m10*rhs.m00 + m11*rhs.m10 + m12*rhs.m20;
00162 ret.m11=m10*rhs.m01 + m11*rhs.m11 + m12*rhs.m21;
00163 ret.m12=m10*rhs.m02 + m11*rhs.m12 + m12*rhs.m22;
00164
00165 ret.m20=m20*rhs.m00 + m21*rhs.m10 + m22*rhs.m20;
00166 ret.m21=m20*rhs.m01 + m21*rhs.m11 + m22*rhs.m21;
00167 ret.m22=m20*rhs.m02 + m21*rhs.m12 + m22*rhs.m22;
00168 return ret;
00169 }
00170
00174 Matrix
00175 operator *=(const value_type &rhs){
00176 m00*=rhs;
00177 m01*=rhs;
00178 m02*=rhs;
00179
00180 m10*=rhs;
00181 m11*=rhs;
00182 m12*=rhs;
00183
00184 m20*=rhs;
00185 m21*=rhs;
00186 m22*=rhs;
00187 return *this;
00188 }
00189
00193 Matrix
00194 operator +=(const Matrix &rhs){
00195 m00+=rhs.m00;
00196 m01+=rhs.m01;
00197 m02+=rhs.m02;
00198
00199 m10+=rhs.m10;
00200 m11+=rhs.m11;
00201 m12+=rhs.m12;
00202
00203 m20+=rhs.m20;
00204 m21+=rhs.m21;
00205 m22+=rhs.m22;
00206 return *this;
00207 }
00208
00212 Matrix
00213 operator *(const value_type &rhs){
00214 return Matrix(*this)*=rhs;
00215 }
00216
00220 Matrix
00221 operator +(const Matrix &rhs){
00222 return Matrix(*this)+=rhs;
00223 }
00224
00225 };
00226
00227 };
00228
00229 #endif