]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/matrix.cpp
patch 1352744
[wxWidgets.git] / src / common / matrix.cpp
index 7a78af94b4a3a53801727a2e023ea2e34da8060c..724b7a5827ca2c68669a66b80e5b20881451e199 100644 (file)
@@ -1,16 +1,13 @@
+///////////////////////////////////////////////////////////////////////////////
 // Name:        matrix.cpp
 // Purpose:     wxTransformMatrix class
 // Author:      Chris Breeze, Julian Smart
 // Modified by: Klaas Holwerda
 // Created:     01/02/97
 // RCS-ID:      $Id$
 // Name:        matrix.cpp
 // Purpose:     wxTransformMatrix class
 // Author:      Chris Breeze, Julian Smart
 // Modified by: Klaas Holwerda
 // Created:     01/02/97
 // RCS-ID:      $Id$
-// Copyright:   (c) Julian Smart and Markus Holzem
+// Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 // Licence:     wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#ifdef __GNUG__
-#pragma implementation "matrix.h"
-#endif
+///////////////////////////////////////////////////////////////////////////////
 
 // Note: this is intended to be used in wxDC at some point to replace
 // the current system of scaling/translation. It is not yet used.
 
 // Note: this is intended to be used in wxDC at some point to replace
 // the current system of scaling/translation. It is not yet used.
 
 #ifndef WX_PRECOMP
 #include "wx/defs.h"
 
 #ifndef WX_PRECOMP
 #include "wx/defs.h"
+#include "wx/math.h"
 #endif
 
 #include "wx/matrix.h"
 #endif
 
 #include "wx/matrix.h"
-#include <math.h>
 
 
-static const double pi = 3.1415926535;
+static const double pi = M_PI;
 
 wxTransformMatrix::wxTransformMatrix(void)
 {
 
 wxTransformMatrix::wxTransformMatrix(void)
 {
-    m_isIdentity = FALSE;
+    m_isIdentity = false;
 
     Identity();
 }
 
 wxTransformMatrix::wxTransformMatrix(const wxTransformMatrix& mat)
 
     Identity();
 }
 
 wxTransformMatrix::wxTransformMatrix(const wxTransformMatrix& mat)
+    : wxObject()
 {
     (*this) = mat;
 }
 {
     (*this) = mat;
 }
@@ -73,24 +71,24 @@ void wxTransformMatrix::operator = (const wxTransformMatrix& mat)
     m_isIdentity = mat.m_isIdentity;
 }
 
     m_isIdentity = mat.m_isIdentity;
 }
 
-bool wxTransformMatrix::operator == (const wxTransformMatrix& mat)
+bool wxTransformMatrix::operator == (const wxTransformMatrix& mat) const
 {
 {
-    if (m_isIdentity==TRUE && mat.m_isIdentity==TRUE)
-        return TRUE;
+    if (m_isIdentity && mat.m_isIdentity)
+        return true;
 
     int i, j;
     for (i = 0; i < 3; i++)
     {
         for (j = 0; j < 3; j++)
         {
 
     int i, j;
     for (i = 0; i < 3; i++)
     {
         for (j = 0; j < 3; j++)
         {
-            if (m_matrix[i][j] != mat.m_matrix[i][j])
-                return FALSE;
+            if ( !wxIsSameDouble(m_matrix[i][j], mat.m_matrix[i][j]) )
+                return false;
         }
     }
         }
     }
-    return TRUE;
+    return true;
 }
 
 }
 
-bool wxTransformMatrix::operator != (const wxTransformMatrix& mat)
+bool wxTransformMatrix::operator != (const wxTransformMatrix& mat) const
 {
     return (! ((*this) == mat));
 }
 {
     return (! ((*this) == mat));
 }
@@ -131,27 +129,22 @@ bool wxTransformMatrix::Invert(void)
 
     // now divide by the determinant
     double det = m_matrix[0][0] * inverseMatrix[0][0] + m_matrix[0][1] * inverseMatrix[1][0] + m_matrix[0][2] * inverseMatrix[2][0];
 
     // now divide by the determinant
     double det = m_matrix[0][0] * inverseMatrix[0][0] + m_matrix[0][1] * inverseMatrix[1][0] + m_matrix[0][2] * inverseMatrix[2][0];
-    if (det != 0.0)
-    {
-        inverseMatrix[0][0] /= det; inverseMatrix[1][0] /= det; inverseMatrix[2][0] /= det;
-        inverseMatrix[0][1] /= det; inverseMatrix[1][1] /= det; inverseMatrix[2][1] /= det;
-        inverseMatrix[0][2] /= det; inverseMatrix[1][2] /= det; inverseMatrix[2][2] /= det;
+    if ( wxIsNullDouble(det) )
+        return false;
+
+    inverseMatrix[0][0] /= det; inverseMatrix[1][0] /= det; inverseMatrix[2][0] /= det;
+    inverseMatrix[0][1] /= det; inverseMatrix[1][1] /= det; inverseMatrix[2][1] /= det;
+    inverseMatrix[0][2] /= det; inverseMatrix[1][2] /= det; inverseMatrix[2][2] /= det;
 
 
-        int i, j;
-        for (i = 0; i < 3; i++)
+    for (int i = 0; i < 3; i++)
+    {
+        for (int j = 0; j < 3; j++)
         {
         {
-            for (j = 0; j < 3; j++)
-            {
-                m_matrix[i][j] = inverseMatrix[i][j];
-            }
+            m_matrix[i][j] = inverseMatrix[i][j];
         }
         }
-        m_isIdentity = IsIdentity1();
-        return TRUE;
-    }
-    else
-    {
-        return FALSE;
     }
     }
+    m_isIdentity = IsIdentity1();
+    return true;
 }
 
 // Make into identity matrix
 }
 
 // Make into identity matrix
@@ -159,9 +152,9 @@ bool wxTransformMatrix::Identity(void)
 {
     m_matrix[0][0] = m_matrix[1][1] = m_matrix[2][2] = 1.0;
     m_matrix[1][0] = m_matrix[2][0] = m_matrix[0][1] = m_matrix[2][1] = m_matrix[0][2] = m_matrix[1][2] = 0.0;
 {
     m_matrix[0][0] = m_matrix[1][1] = m_matrix[2][2] = 1.0;
     m_matrix[1][0] = m_matrix[2][0] = m_matrix[0][1] = m_matrix[2][1] = m_matrix[0][2] = m_matrix[1][2] = 0.0;
-    m_isIdentity = TRUE;
+    m_isIdentity = true;
 
 
-    return TRUE;
+    return true;
 }
 
 // Scale by scale (isotropic scaling i.e. the same in x and y):
 }
 
 // Scale by scale (isotropic scaling i.e. the same in x and y):
@@ -181,7 +174,7 @@ bool wxTransformMatrix::Scale(double scale)
     }
     m_isIdentity = IsIdentity1();
 
     }
     m_isIdentity = IsIdentity1();
 
-    return TRUE;
+    return true;
 }
 
 
 }
 
 
@@ -197,8 +190,8 @@ wxTransformMatrix&  wxTransformMatrix::Scale(const double &xs, const double &ys,
 
     if (m_isIdentity)
     {
 
     if (m_isIdentity)
     {
-        double tx  =xc*(1-xs);
-        double ty  =yc*(1-ys);
+        double tx xc*(1-xs);
+        double ty yc*(1-ys);
         r00 = xs;
         r10 = 0;
         r20 = tx;
         r00 = xs;
         r10 = 0;
         r20 = tx;
@@ -206,10 +199,10 @@ wxTransformMatrix&  wxTransformMatrix::Scale(const double &xs, const double &ys,
         r11 = ys;
         r21 = ty;
     }
         r11 = ys;
         r21 = ty;
     }
-    else if (xc!=0 || yc!=0)
+    else if ( !wxIsNullDouble(xc) || !wxIsNullDouble(yc) )
     {
     {
-        double tx  =xc*(1-xs);
-        double ty  =yc*(1-ys);
+        double tx xc*(1-xs);
+        double ty yc*(1-ys);
         r00 = xs * m_matrix[0][0];
         r10 = xs * m_matrix[1][0];
         r20 = xs * m_matrix[2][0] + tx;
         r00 = xs * m_matrix[0][0];
         r10 = xs * m_matrix[1][0];
         r20 = xs * m_matrix[2][0] + tx;
@@ -267,12 +260,12 @@ wxTransformMatrix&  wxTransformMatrix::Mirror(bool x, bool y)
     if (x)
     {
         temp.m_matrix[1][1] = -1;
     if (x)
     {
         temp.m_matrix[1][1] = -1;
-        temp.m_isIdentity=FALSE;
+        temp.m_isIdentity=false;
     }
     if (y)
     {
         temp.m_matrix[0][0] = -1;
     }
     if (y)
     {
         temp.m_matrix[0][0] = -1;
-        temp.m_isIdentity=FALSE;
+        temp.m_isIdentity=false;
     }
 
     *this = temp * (*this);
     }
 
     *this = temp * (*this);
@@ -295,7 +288,7 @@ bool wxTransformMatrix::Translate(double dx, double dy)
 
     m_isIdentity = IsIdentity1();
 
 
     m_isIdentity = IsIdentity1();
 
-    return TRUE;
+    return true;
 }
 
 // Rotate clockwise by the given number of degrees:
 }
 
 // Rotate clockwise by the given number of degrees:
@@ -305,7 +298,7 @@ bool wxTransformMatrix::Translate(double dx, double dy)
 bool wxTransformMatrix::Rotate(double degrees)
 {
     Rotate(-degrees,0,0);
 bool wxTransformMatrix::Rotate(double degrees)
 {
     Rotate(-degrees,0,0);
-    return TRUE;
+    return true;
 }
 
 // counter clockwise rotate around a point
 }
 
 // counter clockwise rotate around a point
@@ -322,8 +315,8 @@ wxTransformMatrix&  wxTransformMatrix::Rotate(const double &degrees, const doubl
 
     if (m_isIdentity)
     {
 
     if (m_isIdentity)
     {
-        double tx  = x*(1-c)+y*s;
-        double ty  = y*(1-c)-x*s;
+        double tx = x*(1-c)+y*s;
+        double ty = y*(1-c)-x*s;
         r00 = c ;
         r10 = -s;
         r20 = tx;
         r00 = c ;
         r10 = -s;
         r20 = tx;
@@ -331,10 +324,10 @@ wxTransformMatrix&  wxTransformMatrix::Rotate(const double &degrees, const doubl
         r11 = c;
         r21 = ty;
     }
         r11 = c;
         r21 = ty;
     }
-    else if (x!=0 || y!=0)
+    else if ( !wxIsNullDouble(x) || !wxIsNullDouble(y) )
     {
     {
-        double tx  = x*(1-c)+y*s;
-        double ty  = y*(1-c)-x*s;
+        double tx = x*(1-c)+y*s;
+        double ty = y*(1-c)-x*s;
         r00 = c * m_matrix[0][0] - s * m_matrix[0][1] + tx * m_matrix[0][2];
         r10 = c * m_matrix[1][0] - s * m_matrix[1][1] + tx * m_matrix[1][2];
         r20 = c * m_matrix[2][0] - s * m_matrix[2][1] + tx;// * m_matrix[2][2];
         r00 = c * m_matrix[0][0] - s * m_matrix[0][1] + tx * m_matrix[0][2];
         r10 = c * m_matrix[1][0] - s * m_matrix[1][1] + tx * m_matrix[1][2];
         r20 = c * m_matrix[2][0] - s * m_matrix[2][1] + tx;// * m_matrix[2][2];
@@ -383,13 +376,13 @@ bool wxTransformMatrix::TransformPoint(double x, double y, double& tx, double& t
 {
     if (IsIdentity())
     {
 {
     if (IsIdentity())
     {
-        tx = x; ty = y; return TRUE;
+        tx = x; ty = y; return true;
     }
 
     tx = x * m_matrix[0][0] + y * m_matrix[1][0] + m_matrix[2][0];
     ty = x * m_matrix[0][1] + y * m_matrix[1][1] + m_matrix[2][1];
 
     }
 
     tx = x * m_matrix[0][0] + y * m_matrix[1][0] + m_matrix[2][0];
     ty = x * m_matrix[0][1] + y * m_matrix[1][1] + m_matrix[2][1];
 
-    return TRUE;
+    return true;
 }
 
 // Transform a point from device to logical coordinates.
 }
 
 // Transform a point from device to logical coordinates.
@@ -406,18 +399,18 @@ bool wxTransformMatrix::InverseTransformPoint(double x, double y, double& tx, do
 {
     if (IsIdentity())
     {
 {
     if (IsIdentity())
     {
-        tx = x; ty = y; return TRUE;
+        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;
-    }
+    const double z = (1.0 - m_matrix[0][2] * x - m_matrix[1][2] * y) / m_matrix[2][2];
+    if ( wxIsNullDouble(z) )
+        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];
     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;
+    return true;
 }
 
 wxTransformMatrix& wxTransformMatrix::operator*=(const double& t)
 }
 
 wxTransformMatrix& wxTransformMatrix::operator*=(const double& t)
@@ -558,7 +551,7 @@ double wxTransformMatrix::Get_scaleX()
 {
     double scale_factor;
     double rot_angle = CheckInt(atan2(m_matrix[1][0],m_matrix[0][0])*180/pi);
 {
     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)
+    if ( !wxIsSameDouble(rot_angle, 90) && !wxIsSameDouble(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 = 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 !
@@ -574,7 +567,7 @@ double wxTransformMatrix::Get_scaleY()
 {
     double scale_factor;
     double rot_angle = CheckInt(atan2(m_matrix[1][0],m_matrix[0][0])*180/pi);
 {
     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)
+    if ( !wxIsSameDouble(rot_angle, 90) && !wxIsSameDouble(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 = 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 !