+ if (IsIdentity())
+ {
+ tx = x; ty = y; return true;
+ }
+
+ double z = (1.0 - m_matrix[0][2] * x - m_matrix[1][2] * y) / m_matrix[2][2];
+ if (z == 0.0)
+ {
+// z = 0.0000001;
+ return false;
+ }
+ tx = x * m_matrix[0][0] + y * m_matrix[1][0] + z * m_matrix[2][0];
+ ty = x * m_matrix[0][1] + y * m_matrix[1][1] + z * m_matrix[2][1];
+ return true;
+}
+
+wxTransformMatrix& wxTransformMatrix::operator*=(const double& t)
+{
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ m_matrix[i][j]*= t;
+ m_isIdentity = IsIdentity1();
+ return *this;
+}
+
+wxTransformMatrix& wxTransformMatrix::operator/=(const double& t)
+{
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ m_matrix[i][j]/= t;
+ m_isIdentity = IsIdentity1();
+ return *this;
+}
+
+wxTransformMatrix& wxTransformMatrix::operator+=(const wxTransformMatrix& mat)
+{
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ m_matrix[i][j] += mat.m_matrix[i][j];
+ m_isIdentity = IsIdentity1();
+ return *this;
+}
+
+wxTransformMatrix& wxTransformMatrix::operator-=(const wxTransformMatrix& mat)
+{
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ m_matrix[i][j] -= mat.m_matrix[i][j];
+ m_isIdentity = IsIdentity1();
+ return *this;
+}
+
+wxTransformMatrix& wxTransformMatrix::operator*=(const wxTransformMatrix& mat)
+{
+
+ if (mat.m_isIdentity)
+ return *this;
+ if (m_isIdentity)
+ {
+ *this = mat;
+ return *this;
+ }
+ else
+ {
+ wxTransformMatrix result;
+ for (int i = 0; i < 3; i++)
+ {
+ for (int j = 0; j < 3; j++)
+ {
+ double sum = 0;
+ for (int k = 0; k < 3; k++)
+ sum += m_matrix[k][i] * mat.m_matrix[j][k];
+ result.m_matrix[j][i] = sum;
+ }
+ }
+ *this = result;
+ }
+
+ m_isIdentity = IsIdentity1();
+ return *this;
+}
+
+
+// constant operators
+wxTransformMatrix wxTransformMatrix::operator*(const double& t) const
+{
+ wxTransformMatrix result = *this;
+ result *= t;
+ result.m_isIdentity = result.IsIdentity1();
+ return result;
+}
+
+wxTransformMatrix wxTransformMatrix::operator/(const double& t) const
+{
+ wxTransformMatrix result = *this;
+// wxASSERT(t!=0);
+ result /= t;
+ result.m_isIdentity = result.IsIdentity1();
+ return result;
+}
+
+wxTransformMatrix wxTransformMatrix::operator+(const wxTransformMatrix& m) const
+{
+ wxTransformMatrix result = *this;
+ result += m;
+ result.m_isIdentity = result.IsIdentity1();
+ return result;
+}
+
+wxTransformMatrix wxTransformMatrix::operator-(const wxTransformMatrix& m) const
+{
+ wxTransformMatrix result = *this;
+ result -= m;
+ result.m_isIdentity = result.IsIdentity1();
+ return result;
+}
+
+
+wxTransformMatrix wxTransformMatrix::operator*(const wxTransformMatrix& m) const
+{
+ wxTransformMatrix result = *this;
+ result *= m;
+ result.m_isIdentity = result.IsIdentity1();
+ return result;
+}
+
+
+wxTransformMatrix wxTransformMatrix::operator-() const
+{
+ wxTransformMatrix result = *this;
+ for (int i = 0; i < 3; i++)
+ for (int j = 0; j < 3; j++)
+ result.m_matrix[i][j] = -(this->m_matrix[i][j]);
+ result.m_isIdentity = result.IsIdentity1();
+ return result;
+}
+
+static double CheckInt(double getal)
+{
+ // check if the number is very close to an integer
+ if ( (ceil(getal) - getal) < 0.0001)
+ return ceil(getal);
+
+ else if ( (getal - floor(getal)) < 0.0001)
+ return floor(getal);
+
+ return getal;
+
+}
+
+double wxTransformMatrix::Get_scaleX()
+{
+ double scale_factor;
+ double rot_angle = CheckInt(atan2(m_matrix[1][0],m_matrix[0][0])*180/pi);
+ if (rot_angle != 90 && rot_angle != -90)
+ scale_factor = m_matrix[0][0]/cos((rot_angle/180)*pi);
+ else
+ scale_factor = m_matrix[0][0]/sin((rot_angle/180)*pi); // er kan nl. niet door 0 gedeeld worden !
+
+ scale_factor = CheckInt(scale_factor);
+ if (scale_factor < 0)
+ scale_factor = -scale_factor;
+
+ return scale_factor;
+}
+
+double wxTransformMatrix::Get_scaleY()
+{
+ double scale_factor;
+ double rot_angle = CheckInt(atan2(m_matrix[1][0],m_matrix[0][0])*180/pi);
+ if (rot_angle != 90 && rot_angle != -90)
+ scale_factor = m_matrix[1][1]/cos((rot_angle/180)*pi);
+ else
+ scale_factor = m_matrix[1][1]/sin((rot_angle/180)*pi); // er kan nl. niet door 0 gedeeld worden !
+
+ scale_factor = CheckInt(scale_factor);
+ if (scale_factor < 0)
+
+ scale_factor = -scale_factor;
+
+ return scale_factor;
+
+}
+
+double wxTransformMatrix::GetRotation()
+{
+ double temp1 = GetValue(0,0); // for angle calculation
+ double temp2 = GetValue(0,1); //
+
+ // Rotation
+ double rot_angle = atan2(temp2,temp1)*180/pi;
+
+ rot_angle = CheckInt(rot_angle);
+ return rot_angle;
+}
+
+void wxTransformMatrix::SetRotation(double rotation)
+{
+ double x=GetValue(2,0);
+ double y=GetValue(2,1);
+ Rotate(-GetRotation(), x, y);
+ Rotate(rotation, x, y);