matrix.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright 2016 The G3N 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 collision implements collision related algorithms and data structures.
  5. package collision
  6. // Matrix is a triangular collision matrix indicating which pairs of bodies are colliding.
  7. type Matrix [][]bool
  8. // NewMatrix creates and returns a pointer to a new collision Matrix.
  9. func NewMatrix() Matrix {
  10. return make([][]bool, 0)
  11. }
  12. // Set sets whether i and j are colliding.
  13. func (m *Matrix) Set(i, j int, val bool) {
  14. var s, l int
  15. if i < j {
  16. s = i
  17. l = j
  18. } else {
  19. s = j
  20. l = i
  21. }
  22. diff := s + 1 - len(*m)
  23. if diff > 0 {
  24. for i := 0; i < diff; i++ {
  25. *m = append(*m, make([]bool, 0))
  26. }
  27. }
  28. for idx := range *m {
  29. diff = l + 1 - len((*m)[idx]) - idx
  30. if diff > 0 {
  31. for i := 0; i < diff; i++ {
  32. (*m)[idx] = append((*m)[idx], false)
  33. }
  34. }
  35. }
  36. (*m)[s][l-s] = val
  37. }
  38. // Get returns whether i and j are colliding.
  39. func (m *Matrix) Get(i, j int) bool {
  40. var s, l int
  41. if i < j {
  42. s = i
  43. l = j
  44. } else {
  45. s = j
  46. l = i
  47. }
  48. return (*m)[s][l-s]
  49. }
  50. // Reset clears all values.
  51. func (m *Matrix) Reset() {
  52. *m = make([][]bool, 0)
  53. }