Matrix.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //
  2. // Created by janco on 6/21/16.
  3. //
  4. #include "Matrix.h"
  5. Matrix::Matrix(int size = 4)
  6. {
  7. data = new float[size][size];
  8. }
  9. Matrix Matrix::identity()
  10. {
  11. Matrix m = new Matrix(4);
  12. m.data[0,0] = 1;
  13. m.data[1,1] = 1;
  14. m.data[2,2] = 1;
  15. m.data[3,3] = 1;
  16. return m;
  17. }
  18. Matrix Matrix::rotation(float angle, Vector3 axis)
  19. {
  20. Matrix m = Matrix.identity();
  21. float c = (float) Math.Cos((double) angle);
  22. float s = (float) Math.Sin((double) angle);
  23. m.data[0, 0] = (float) Math.Pow(axis.x, 2) * (1 - c) + c;
  24. m.data[0, 1] = axis.x * axis.y * (1 - c) - axis.z * s;
  25. m.data[0, 2] = axis.x * axis.z * (1 - c) - axis.y * s;
  26. m.data[1, 0] = axis.x * axis.y * (1 - c) + axis.z * s;
  27. m.data[1, 1] = (float)Math.Pow(axis.y, 2) * (1 - c) + c;
  28. m.data[1, 2] = axis.y * axis.z * (1 - c) + axis.x * s;
  29. m.data[2, 0] = axis.x * axis.z * (1 - c) + axis.y * s;
  30. m.data[2, 1] = axis.y * axis.z * (1 - c) - axis.x * s;
  31. m.data[2, 2] = (float)Math.Pow(axis.z, 2) * (1 - c) + c;
  32. return m;
  33. }
  34. Matrix Matrix::translate(Vector3 offset)
  35. {
  36. Matrix m = Matrix.identity();
  37. for(int i = 0; i < 3; i++)
  38. {
  39. m.data[i, 3] = offset.data[i];
  40. }
  41. return m;
  42. }
  43. Vec3f Matrix::operator * (Matrix mat, Vec3f vec)
  44. {
  45. Vec3f v = Vec3f(0,0,0);
  46. for(int i = 0; i < 4; i++)
  47. {
  48. v.data[i] = 0;
  49. for(int p = 0; p < 4; p++)
  50. {
  51. v.data[i] += mat.data[i, p] * vec.data[p];
  52. }
  53. }
  54. return v;
  55. }
  56. Matrix Matrix::operator * (Matrix mat1, Matrix mat2)
  57. {
  58. Matrix m = Matrix.identity();
  59. for (int i = 0; i < 4; i++)
  60. {
  61. for (int p = 0; p < 4; p++)
  62. {
  63. m.data[i, p] = 0;
  64. for (int q = 0; q < 4; q++)
  65. {
  66. m.data[i, p] += mat1.data[i, q] * mat2.data[q, p];
  67. }
  68. }
  69. }
  70. return m;
  71. }
  72. };