///////////////////////////////////////////////////////////////////////////////
-// Name: matrix.cpp
+// Name: src/common/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
// 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"
+ #include "wx/math.h"
#endif
-#include "wx/matrix.h"
-
static const double pi = M_PI;
wxTransformMatrix::wxTransformMatrix(void)
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)
+ if (m_isIdentity && mat.m_isIdentity)
return true;
int i, j;
{
for (j = 0; j < 3; j++)
{
- if (m_matrix[i][j] != mat.m_matrix[i][j])
+ if ( !wxIsSameDouble(m_matrix[i][j], mat.m_matrix[i][j]) )
return false;
}
}
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
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 (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;
}
- 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;
+ 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;
{
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);
}
-