-// Name: matrix.cpp
+///////////////////////////////////////////////////////////////////////////////
+// Name: src/common/matrix.cpp
// Purpose: wxTransformMatrix class
// Author: Chris Breeze, Julian Smart
// Modified by: Klaas Holwerda
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#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.
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
+#include "wx/matrix.h"
+
#ifndef WX_PRECOMP
-#include "wx/defs.h"
+ #include "wx/math.h"
#endif
-#include "wx/matrix.h"
-#include <math.h>
-
-static const double pi = 3.1415926535;
+static const double pi = M_PI;
wxTransformMatrix::wxTransformMatrix(void)
{
- m_isIdentity = FALSE;
+ m_isIdentity = false;
Identity();
}
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++)
{
- 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));
}
// 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
{
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):
}
m_isIdentity = IsIdentity1();
- return TRUE;
+ return true;
}
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;
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;
if (x)
{
temp.m_matrix[1][1] = -1;
- temp.m_isIdentity=FALSE;
+ temp.m_isIdentity=false;
}
if (y)
{
temp.m_matrix[0][0] = -1;
- temp.m_isIdentity=FALSE;
+ temp.m_isIdentity=false;
}
*this = temp * (*this);
m_isIdentity = IsIdentity1();
- return TRUE;
+ return true;
}
// Rotate clockwise by the given number of degrees:
bool wxTransformMatrix::Rotate(double degrees)
{
Rotate(-degrees,0,0);
- return TRUE;
+ return true;
}
// counter clockwise rotate around a point
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;
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];
{
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];
- return TRUE;
+ return true;
}
// Transform a point from device to logical coordinates.
{
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];
- return TRUE;
+ return true;
}
wxTransformMatrix& wxTransformMatrix::operator*=(const double& t)
{
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 !
{
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 !
Rotate(-GetRotation(), x, y);
Rotate(rotation, x, y);
}
-