My Project
qmatrix.h
1 #pragma once
2 
3 #include "ParaRegion.h"
4 #include "ParaPoint.h"
5 #include "ParaLine.h"
6 #include "ParaRect.h"
7 
8 namespace ParaEngine
9 {
10 
11  // 2D transform matrix
12  class QMatrix
13  {
14  public:
15  QMatrix();
16  QMatrix(float m11, float m12, float m21, float m22,
17  float dx, float dy);
18  QMatrix(const QMatrix &matrix);
19 
20  void setMatrix(float m11, float m12, float m21, float m22,
21  float dx, float dy);
22 
23  float m11() const { return _m11; }
24  float m12() const { return _m12; }
25  float m21() const { return _m21; }
26  float m22() const { return _m22; }
27  float dx() const { return _dx; }
28  float dy() const { return _dy; }
29 
30  void map(int x, int y, int *tx, int *ty) const;
31  void map(float x, float y, float *tx, float *ty) const;
32  QRect mapRect(const QRect &) const;
33  QRectF mapRect(const QRectF &) const;
34 
35  QPoint map(const QPoint &p) const;
36  QPointF map(const QPointF&p) const;
37  QLine map(const QLine &l) const;
38  QLineF map(const QLineF &l) const;
39 
40 
41  void reset();
42  inline bool isIdentity() const;
43 
44  QMatrix &translate(float dx, float dy);
45  QMatrix &scale(float sx, float sy);
46  QMatrix &shear(float sh, float sv);
47  QMatrix &rotate(float a);
48 
49  bool isInvertible() const { return !Math::FuzzyIsNull(_m11*_m22 - _m12*_m21); }
50  float determinant() const { return _m11*_m22 - _m12*_m21; }
51 
52  QMatrix inverted(bool *invertible = 0) const;
53 
54  bool operator==(const QMatrix &) const;
55  bool operator!=(const QMatrix &) const;
56 
57  QMatrix &operator*=(const QMatrix &);
58  QMatrix operator*(const QMatrix &o) const;
59 
60  QMatrix &operator=(const QMatrix &);
61 
62  private:
63  inline QMatrix(bool)
64  : _m11(1.)
65  , _m12(0.)
66  , _m21(0.)
67  , _m22(1.)
68  , _dx(0.)
69  , _dy(0.) {}
70  inline QMatrix(float am11, float am12, float am21, float am22, float adx, float ady, bool)
71  : _m11(am11)
72  , _m12(am12)
73  , _m21(am21)
74  , _m22(am22)
75  , _dx(adx)
76  , _dy(ady) {}
77  friend class QTransform;
78  float _m11, _m12;
79  float _m21, _m22;
80  float _dx, _dy;
81  };
82 
83  // mathematical semantics
84  inline QPoint operator*(const QPoint &p, const QMatrix &m)
85  {
86  return m.map(p);
87  }
88  inline QPointF operator*(const QPointF &p, const QMatrix &m)
89  {
90  return m.map(p);
91  }
92  inline QLineF operator*(const QLineF &l, const QMatrix &m)
93  {
94  return m.map(l);
95  }
96  inline QLine operator*(const QLine &l, const QMatrix &m)
97  {
98  return m.map(l);
99  }
100 
101  inline bool QMatrix::isIdentity() const
102  {
103  return Math::FuzzyIsNull(_m11 - 1) && Math::FuzzyIsNull(_m22 - 1) && Math::FuzzyIsNull(_m12)
104  && Math::FuzzyIsNull(_m21) && Math::FuzzyIsNull(_dx) && Math::FuzzyIsNull(_dy);
105  }
106 
107  inline bool FuzzyCompare(const QMatrix& m1, const QMatrix& m2)
108  {
109  return Math::FuzzyCompare(m1.m11(), m2.m11())
110  && Math::FuzzyCompare(m1.m12(), m2.m12())
111  && Math::FuzzyCompare(m1.m21(), m2.m21())
112  && Math::FuzzyCompare(m1.m22(), m2.m22())
113  && Math::FuzzyCompare(m1.dx(), m2.dx())
114  && Math::FuzzyCompare(m1.dy(), m2.dy());
115  }
116 }
Definition: ParaPoint.h:203
different physics engine has different winding order.
Definition: EventBinding.h:32
Definition: ParaLine.h:151
Definition: ParaRect.h:517
when concerting QRect with QRectF and RECT, we ensure that their left, top and width, height are the same.
Definition: ParaRect.h:16
Definition: ParaLine.h:6
Definition: qtransform.h:14
Definition: ParaPoint.h:5
Definition: qmatrix.h:12