]>
Commit | Line | Data |
---|---|---|
1 | ///////////////////////////////////////////////////////////////////////////// | |
2 | // Name: matrix.h | |
3 | // Purpose: wxTransformMatrix class. NOT YET USED | |
4 | // Author: Chris Breeze, Julian Smart | |
5 | // Modified by: | |
6 | // Created: 01/02/97 | |
7 | // RCS-ID: $Id$ | |
8 | // Copyright: (c) Julian Smart and Markus Holzem | |
9 | // Licence: wxWindows licence | |
10 | ///////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | #ifndef _WX_MATRIXH__ | |
13 | #define _WX_MATRIXH__ | |
14 | ||
15 | #ifdef __GNUG__ | |
16 | #pragma interface "matrix.h" | |
17 | #endif | |
18 | ||
19 | #include "wx/object.h" | |
20 | ||
21 | // A simple 3x3 matrix. This may be replaced by a more general matrix | |
22 | // class some day. | |
23 | // | |
24 | // Note: this is intended to be used in wxDC at some point to replace | |
25 | // the current system of scaling/translation. It is not yet used. | |
26 | ||
27 | class WXDLLEXPORT wxTransformMatrix: public wxObject | |
28 | { | |
29 | public: | |
30 | wxTransformMatrix(void); | |
31 | wxTransformMatrix(const wxTransformMatrix& mat); | |
32 | ||
33 | double GetValue(int row, int col) const; | |
34 | void SetValue(int row, int col, double value); | |
35 | ||
36 | void operator = (const wxTransformMatrix& mat); | |
37 | bool operator == (const wxTransformMatrix& mat); | |
38 | bool operator != (const wxTransformMatrix& mat); | |
39 | ||
40 | double& operator()(int row, int col); | |
41 | double operator()(int row, int col) const; | |
42 | ||
43 | // Invert matrix | |
44 | bool Invert(void); | |
45 | ||
46 | // Make into identity matrix | |
47 | bool Identity(void); | |
48 | ||
49 | // Is the matrix the identity matrix? | |
50 | // Only returns a flag, which is set whenever an operation | |
51 | // is done. | |
52 | inline bool IsIdentity(void) const { return m_isIdentity; }; | |
53 | ||
54 | // This does an actual check. | |
55 | inline bool IsIdentity1(void) const ; | |
56 | ||
57 | // Isotropic scaling | |
58 | bool Scale(double scale); | |
59 | ||
60 | // Translate | |
61 | bool Translate(double x, double y); | |
62 | ||
63 | // Rotate | |
64 | bool Rotate(double angle); | |
65 | ||
66 | // Transform X value from logical to device | |
67 | inline double TransformX(double x) const; | |
68 | ||
69 | // Transform Y value from logical to device | |
70 | inline double TransformY(double y) const; | |
71 | ||
72 | // Transform a point from logical to device coordinates | |
73 | bool TransformPoint(double x, double y, double& tx, double& ty) const; | |
74 | ||
75 | // Transform a point from device to logical coordinates. | |
76 | ||
77 | // Example of use: | |
78 | // wxTransformMatrix mat = dc.GetTransformation(); | |
79 | // mat.Invert(); | |
80 | // mat.InverseTransformPoint(x, y, x1, y1); | |
81 | // OR (shorthand:) | |
82 | // dc.LogicalToDevice(x, y, x1, y1); | |
83 | // The latter is slightly less efficient if we're doing several | |
84 | // conversions, since the matrix is inverted several times. | |
85 | ||
86 | // N.B. 'this' matrix is the inverse at this point | |
87 | ||
88 | bool InverseTransformPoint(double x, double y, double& tx, double& ty) const; | |
89 | ||
90 | public: | |
91 | double m_matrix[3][3]; | |
92 | bool m_isIdentity; | |
93 | /* | |
94 | double m11, m21, m31; | |
95 | double m12, m22, m32; | |
96 | double m13, m23, m33; | |
97 | */ | |
98 | }; | |
99 | ||
100 | ||
101 | /* | |
102 | The code is wrong and doesn't compile. Chris Breeze als reported, that | |
103 | some functions of wxTransformMatrix cannot work because it is not | |
104 | known if he matrix has been inverted. Be careful when using it. | |
105 | ||
106 | // Transform X value from logical to device | |
107 | inline double wxTransformMatrix::TransformX(double x) const | |
108 | { | |
109 | return (m_isIdentity ? x : (x * m_matrix[0][0] + y * m_matrix[1][0] + m_matrix[2][0])); | |
110 | } | |
111 | ||
112 | // Transform Y value from logical to device | |
113 | inline double wxTransformMatrix::TransformY(double y) const | |
114 | { | |
115 | return (m_isIdentity ? y : (x * m_matrix[0][1] + y * m_matrix[1][1] + m_matrix[2][1])); | |
116 | } | |
117 | */ | |
118 | ||
119 | // Is the matrix the identity matrix? | |
120 | // Perhaps there's some kind of optimization we can do to make this | |
121 | // a faster operation. E.g. each operation (scale, translate etc.) | |
122 | // checks whether it's still the identity matrix and sets a flag. | |
123 | inline bool wxTransformMatrix::IsIdentity1(void) const | |
124 | { | |
125 | return | |
126 | (m_matrix[0][0] == 1.0 && | |
127 | m_matrix[1][1] == 1.0 && | |
128 | m_matrix[2][2] == 1.0 && | |
129 | m_matrix[1][0] == 0.0 && | |
130 | m_matrix[2][0] == 0.0 && | |
131 | m_matrix[0][1] == 0.0 && | |
132 | m_matrix[2][1] == 0.0 && | |
133 | m_matrix[0][2] == 0.0 && | |
134 | m_matrix[1][2] == 0.0) ; | |
135 | } | |
136 | ||
137 | // Calculates the determinant of a 2 x 2 matrix | |
138 | inline double wxCalculateDet(double a11, double a21, double a12, double a22) | |
139 | { | |
140 | return a11 * a22 - a12 * a21; | |
141 | } | |
142 | ||
143 | #endif | |
144 | // _WX_MATRIXH__ |