mat3.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright 2014 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package f32
  5. import "fmt"
  6. // A Mat3 is a 3x3 matrix of float32 values.
  7. // Elements are indexed first by row then column, i.e. m[row][column].
  8. type Mat3 [3]Vec3
  9. func (m Mat3) String() string {
  10. return fmt.Sprintf(`Mat3[% 0.3f, % 0.3f, % 0.3f,
  11. % 0.3f, % 0.3f, % 0.3f,
  12. % 0.3f, % 0.3f, % 0.3f]`,
  13. m[0][0], m[0][1], m[0][2],
  14. m[1][0], m[1][1], m[1][2],
  15. m[2][0], m[2][1], m[2][2])
  16. }
  17. func (m *Mat3) Identity() {
  18. *m = Mat3{
  19. {1, 0, 0},
  20. {0, 1, 0},
  21. {0, 0, 1},
  22. }
  23. }
  24. func (m *Mat3) Eq(n *Mat3, epsilon float32) bool {
  25. for i := range m {
  26. for j := range m[i] {
  27. diff := m[i][j] - n[i][j]
  28. if diff < -epsilon || +epsilon < diff {
  29. return false
  30. }
  31. }
  32. }
  33. return true
  34. }
  35. // Mul stores a × b in m.
  36. func (m *Mat3) Mul(a, b *Mat3) {
  37. // Store the result in local variables, in case m == a || m == b.
  38. m00 := a[0][0]*b[0][0] + a[0][1]*b[1][0] + a[0][2]*b[2][0]
  39. m01 := a[0][0]*b[0][1] + a[0][1]*b[1][1] + a[0][2]*b[2][1]
  40. m02 := a[0][0]*b[0][2] + a[0][1]*b[1][2] + a[0][2]*b[2][2]
  41. m10 := a[1][0]*b[0][0] + a[1][1]*b[1][0] + a[1][2]*b[2][0]
  42. m11 := a[1][0]*b[0][1] + a[1][1]*b[1][1] + a[1][2]*b[2][1]
  43. m12 := a[1][0]*b[0][2] + a[1][1]*b[1][2] + a[1][2]*b[2][2]
  44. m20 := a[2][0]*b[0][0] + a[2][1]*b[1][0] + a[2][2]*b[2][0]
  45. m21 := a[2][0]*b[0][1] + a[2][1]*b[1][1] + a[2][2]*b[2][1]
  46. m22 := a[2][0]*b[0][2] + a[2][1]*b[1][2] + a[2][2]*b[2][2]
  47. m[0][0] = m00
  48. m[0][1] = m01
  49. m[0][2] = m02
  50. m[1][0] = m10
  51. m[1][1] = m11
  52. m[1][2] = m12
  53. m[2][0] = m20
  54. m[2][1] = m21
  55. m[2][2] = m22
  56. }