Matrix.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include <cmath>
  2. #include <iomanip>
  3. #include <cstring>
  4. #include "math/Matrix.h"
  5. Matrix::Matrix() {
  6. setToIdentity();
  7. }
  8. Matrix& Matrix::set(const Matrix& other) {
  9. *this = other;
  10. return *this;
  11. }
  12. Matrix& Matrix::setToIdentity() {
  13. data[0] = 1.0f;
  14. data[1] = 0.0f;
  15. data[2] = 0.0f;
  16. data[3] = 0.0f;
  17. data[4] = 1.0f;
  18. data[5] = 0.0f;
  19. data[6] = 0.0f;
  20. data[7] = 0.0f;
  21. data[8] = 1.0f;
  22. return *this;
  23. }
  24. Matrix& Matrix::set(uint index, float f) {
  25. data[index] = f;
  26. return *this;
  27. }
  28. const float* Matrix::getValues() const {
  29. return data;
  30. }
  31. Matrix& Matrix::mul(const Matrix& m) {
  32. float mNew[9];
  33. mNew[0] = data[0] * m.data[0] + data[3] * m.data[1] + data[6] * m.data[2];
  34. mNew[1] = data[1] * m.data[0] + data[4] * m.data[1] + data[7] * m.data[2];
  35. mNew[2] = data[2] * m.data[0] + data[5] * m.data[1] + data[8] * m.data[2];
  36. mNew[3] = data[0] * m.data[3] + data[3] * m.data[4] + data[6] * m.data[5];
  37. mNew[4] = data[1] * m.data[3] + data[4] * m.data[4] + data[7] * m.data[5];
  38. mNew[5] = data[2] * m.data[3] + data[5] * m.data[4] + data[8] * m.data[5];
  39. mNew[6] = data[0] * m.data[6] + data[3] * m.data[7] + data[6] * m.data[8];
  40. mNew[7] = data[1] * m.data[6] + data[4] * m.data[7] + data[7] * m.data[8];
  41. mNew[8] = data[2] * m.data[6] + data[5] * m.data[7] + data[8] * m.data[8];
  42. memcpy(data, mNew, sizeof (float) * 9);
  43. return *this;
  44. }
  45. Matrix& Matrix::scale(float sx, float sy) {
  46. data[0] *= sx;
  47. data[1] *= sx;
  48. data[2] *= sx;
  49. data[3] *= sy;
  50. data[4] *= sy;
  51. data[5] *= sy;
  52. return *this;
  53. }
  54. Matrix& Matrix::scale(float s) {
  55. return scale(s, s);
  56. }
  57. Matrix& Matrix::translate(float tx, float ty) {
  58. return translateX(tx).translateY(ty);
  59. }
  60. Matrix& Matrix::translateX(float tx) {
  61. data[6] += data[0] * tx;
  62. data[7] += data[1] * tx;
  63. data[8] += data[2] * tx;
  64. return *this;
  65. }
  66. Matrix& Matrix::translateY(float ty) {
  67. data[6] += data[3] * ty;
  68. data[7] += data[4] * ty;
  69. data[8] += data[5] * ty;
  70. return *this;
  71. }
  72. Matrix& Matrix::translateTo(float tx, float ty) {
  73. data[0] = 1.0f;
  74. data[1] = 0.0f;
  75. data[2] = 0.0f;
  76. data[3] = 0.0f;
  77. data[4] = 1.0f;
  78. data[5] = 0.0f;
  79. data[6] = tx;
  80. data[7] = ty;
  81. data[8] = 1.0f;
  82. return *this;
  83. }
  84. Matrix& Matrix::rotate(float degrees) {
  85. degrees *= M_PIf32 / 180.0f;
  86. float sin;
  87. float cos;
  88. sincosf(degrees, &sin, &cos);
  89. float a = data[0];
  90. float b = data[3];
  91. data[0] = a * cos + b * sin;
  92. data[3] = b * cos - a * sin;
  93. a = data[1];
  94. b = data[4];
  95. data[1] = a * cos + b * sin;
  96. data[4] = b * cos - a * sin;
  97. a = data[2];
  98. b = data[5];
  99. data[2] = a * cos + b * sin;
  100. data[5] = b * cos - a * sin;
  101. return *this;
  102. }
  103. std::ostream& operator<<(std::ostream& os, const Matrix& m) {
  104. const float* data = m.getValues();
  105. os << "Matrix\n(\n";
  106. os << std::fixed << std::setprecision(5);
  107. for(int i = 0; i < 3; i++) {
  108. os << std::setw(15);
  109. os << data[i] << ", ";
  110. os << std::setw(15);
  111. os << data[i + 3] << ", ";
  112. os << std::setw(15);
  113. os << data[i + 6] << "\n";
  114. }
  115. os << std::defaultfloat;
  116. os << ")";
  117. return os;
  118. }