| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:         wx/matrix.h
 
- // Purpose:      wxTransformMatrix class. NOT YET USED
 
- // Author:       Chris Breeze, Julian Smart
 
- // Modified by:  Klaas Holwerda
 
- // Created:      01/02/97
 
- // Copyright:    (c) Julian Smart, Chris Breeze
 
- // Licence:      wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- #ifndef _WX_MATRIXH__
 
- #define _WX_MATRIXH__
 
- //! headerfiles="matrix.h wx/object.h"
 
- #include "wx/object.h"
 
- #include "wx/math.h"
 
- //! codefiles="matrix.cpp"
 
- // A simple 3x3 matrix. This may be replaced by a more general matrix
 
- // class some day.
 
- //
 
- // 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.
 
- //:definition
 
- //  A 3x3 matrix to do 2D transformations.
 
- //  It can be used to map data to window coordinates,
 
- //  and also for manipulating your own data.
 
- //  For example drawing a picture (composed of several primitives)
 
- //  at a certain coordinate and angle within another parent picture.
 
- //  At all times m_isIdentity is set if the matrix itself is an Identity matrix.
 
- //  It is used where possible to optimize calculations.
 
- class WXDLLIMPEXP_CORE wxTransformMatrix: public wxObject
 
- {
 
- public:
 
-     wxTransformMatrix(void);
 
-     wxTransformMatrix(const wxTransformMatrix& mat);
 
-     //get the value in the matrix at col,row
 
-     //rows are horizontal (second index of m_matrix member)
 
-     //columns are vertical (first index of m_matrix member)
 
-     double GetValue(int col, int row) const;
 
-     //set the value in the matrix at col,row
 
-     //rows are horizontal (second index of m_matrix member)
 
-     //columns are vertical (first index of m_matrix member)
 
-     void SetValue(int col, int row, double value);
 
-     void operator = (const wxTransformMatrix& mat);
 
-     bool operator == (const wxTransformMatrix& mat) const;
 
-     bool operator != (const wxTransformMatrix& mat) const;
 
-     //multiply every element by t
 
-     wxTransformMatrix&          operator*=(const double& t);
 
-     //divide every element by t
 
-     wxTransformMatrix&          operator/=(const double& t);
 
-     //add matrix m to this t
 
-     wxTransformMatrix&          operator+=(const wxTransformMatrix& m);
 
-     //subtract matrix m from this
 
-     wxTransformMatrix&          operator-=(const wxTransformMatrix& m);
 
-     //multiply matrix m with this
 
-     wxTransformMatrix&          operator*=(const wxTransformMatrix& m);
 
-     // constant operators
 
-     //multiply every element by t  and return result
 
-     wxTransformMatrix           operator*(const double& t) const;
 
-     //divide this matrix by t and return result
 
-     wxTransformMatrix           operator/(const double& t) const;
 
-     //add matrix m to this and return result
 
-     wxTransformMatrix           operator+(const wxTransformMatrix& m) const;
 
-     //subtract matrix m from this and return result
 
-     wxTransformMatrix           operator-(const wxTransformMatrix& m) const;
 
-     //multiply this by matrix m and return result
 
-     wxTransformMatrix           operator*(const wxTransformMatrix& m) const;
 
-     wxTransformMatrix           operator-() const;
 
-     //rows are horizontal (second index of m_matrix member)
 
-     //columns are vertical (first index of m_matrix member)
 
-     double& operator()(int col, int row);
 
-     //rows are horizontal (second index of m_matrix member)
 
-     //columns are vertical (first index of m_matrix member)
 
-     double operator()(int col, int row) const;
 
-     // Invert matrix
 
-     bool Invert(void);
 
-     // Make into identity matrix
 
-     bool Identity(void);
 
-     // Is the matrix the identity matrix?
 
-     // Only returns a flag, which is set whenever an operation
 
-     // is done.
 
-     inline bool IsIdentity(void) const { return m_isIdentity; }
 
-     // This does an actual check.
 
-     inline bool IsIdentity1(void) const ;
 
-     //Scale by scale (isotropic scaling i.e. the same in x and y):
 
-     //!ex:
 
-     //!code:           | scale  0      0      |
 
-     //!code: matrix' = |  0     scale  0      | x matrix
 
-     //!code:           |  0     0      scale  |
 
-     bool Scale(double scale);
 
-     //Scale with center point and x/y scale
 
-     //
 
-     //!ex:
 
-     //!code:           |  xs    0      xc(1-xs) |
 
-     //!code: matrix' = |  0    ys      yc(1-ys) | x matrix
 
-     //!code:           |  0     0      1        |
 
-     wxTransformMatrix&  Scale(const double &xs, const double &ys,const double &xc, const double &yc);
 
-     // mirror a matrix in x, y
 
-     //!ex:
 
-     //!code:           | -1     0      0 |
 
-     //!code: matrix' = |  0    -1      0 | x matrix
 
-     //!code:           |  0     0      1 |
 
-     wxTransformMatrix&  Mirror(bool x=true, bool y=false);
 
-     // Translate by dx, dy:
 
-     //!ex:
 
-     //!code:           | 1  0 dx |
 
-     //!code: matrix' = | 0  1 dy | x matrix
 
-     //!code:           | 0  0  1 |
 
-     bool Translate(double x, double y);
 
-     // Rotate clockwise by the given number of degrees:
 
-     //!ex:
 
-     //!code:           |  cos sin 0 |
 
-     //!code: matrix' = | -sin cos 0 | x matrix
 
-     //!code:           |   0   0  1 |
 
-     bool Rotate(double angle);
 
-     //Rotate counter clockwise with point of rotation
 
-     //
 
-     //!ex:
 
-     //!code:           |  cos(r) -sin(r)    x(1-cos(r))+y(sin(r)|
 
-     //!code: matrix' = |  sin(r)  cos(r)    y(1-cos(r))-x(sin(r)| x matrix
 
-     //!code:           |   0          0                       1 |
 
-     wxTransformMatrix&  Rotate(const double &r, const double &x, const double &y);
 
-     // Transform X value from logical to device
 
-     inline double TransformX(double x) const;
 
-     // Transform Y value from logical to device
 
-     inline double TransformY(double y) const;
 
-     // Transform a point from logical to device coordinates
 
-     bool TransformPoint(double x, double y, double& tx, double& ty) const;
 
-     // Transform a point from device to logical coordinates.
 
-     // Example of use:
 
-     //   wxTransformMatrix mat = dc.GetTransformation();
 
-     //   mat.Invert();
 
-     //   mat.InverseTransformPoint(x, y, x1, y1);
 
-     // OR (shorthand:)
 
-     //   dc.LogicalToDevice(x, y, x1, y1);
 
-     // The latter is slightly less efficient if we're doing several
 
-     // conversions, since the matrix is inverted several times.
 
-     // N.B. 'this' matrix is the inverse at this point
 
-     bool InverseTransformPoint(double x, double y, double& tx, double& ty) const;
 
-     double Get_scaleX();
 
-     double Get_scaleY();
 
-     double GetRotation();
 
-     void   SetRotation(double rotation);
 
- public:
 
-     double  m_matrix[3][3];
 
-     bool    m_isIdentity;
 
- };
 
- /*
 
- Chris Breeze reported, that
 
- some functions of wxTransformMatrix cannot work because it is not
 
- known if he matrix has been inverted. Be careful when using it.
 
- */
 
- // Transform X value from logical to device
 
- // warning: this function can only be used for this purpose
 
- // because no rotation is involved when mapping logical to device coordinates
 
- // mirror and scaling for x and y will be part of the matrix
 
- // if you have a matrix that is rotated, eg a shape containing a matrix to place
 
- // it in the logical coordinate system, use TransformPoint
 
- inline double wxTransformMatrix::TransformX(double x) const
 
- {
 
-     //normally like this, but since no rotation is involved (only mirror and scale)
 
-     //we can do without Y -> m_matrix[1]{0] is -sin(rotation angle) and therefore zero
 
-     //(x * m_matrix[0][0] + y * m_matrix[1][0] + m_matrix[2][0]))
 
-     return (m_isIdentity ? x : (x * m_matrix[0][0] +  m_matrix[2][0]));
 
- }
 
- // Transform Y value from logical to device
 
- // warning: this function can only be used for this purpose
 
- // because no rotation is involved when mapping logical to device coordinates
 
- // mirror and scaling for x and y will be part of the matrix
 
- // if you have a matrix that is rotated, eg a shape containing a matrix to place
 
- // it in the logical coordinate system, use TransformPoint
 
- inline double wxTransformMatrix::TransformY(double y) const
 
- {
 
-     //normally like this, but since no rotation is involved (only mirror and scale)
 
-     //we can do without X -> m_matrix[0]{1] is sin(rotation angle) and therefore zero
 
-     //(x * m_matrix[0][1] + y * m_matrix[1][1] + m_matrix[2][1]))
 
-     return (m_isIdentity ? y : (y * m_matrix[1][1] + m_matrix[2][1]));
 
- }
 
- // Is the matrix the identity matrix?
 
- // Each operation checks whether the result is still the identity matrix and sets a flag.
 
- inline bool wxTransformMatrix::IsIdentity1(void) const
 
- {
 
-     return
 
-     ( wxIsSameDouble(m_matrix[0][0], 1.0) &&
 
-       wxIsSameDouble(m_matrix[1][1], 1.0) &&
 
-       wxIsSameDouble(m_matrix[2][2], 1.0) &&
 
-       wxIsSameDouble(m_matrix[1][0], 0.0) &&
 
-       wxIsSameDouble(m_matrix[2][0], 0.0) &&
 
-       wxIsSameDouble(m_matrix[0][1], 0.0) &&
 
-       wxIsSameDouble(m_matrix[2][1], 0.0) &&
 
-       wxIsSameDouble(m_matrix[0][2], 0.0) &&
 
-       wxIsSameDouble(m_matrix[1][2], 0.0) );
 
- }
 
- // Calculates the determinant of a 2 x 2 matrix
 
- inline double wxCalculateDet(double a11, double a21, double a12, double a22)
 
- {
 
-     return a11 * a22 - a12 * a21;
 
- }
 
- #endif // _WX_MATRIXH__
 
 
  |