field.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. class Field {
  2. constructor(...sizes) {
  3. this.n = sizes.length
  4. this.sizes = sizes
  5. this.data = []
  6. const g = (p, n) => {
  7. if (n < sizes.length) {
  8. const end = n === sizes.length - 1
  9. for (let i = 0; i < sizes[n]; i++) {
  10. p[i] = end ? 0 : []
  11. g(p[i], n + 1)
  12. }
  13. }
  14. }
  15. g(this.data, 0)
  16. }
  17. * indices() {
  18. const self = this
  19. const g = function*(p, n) {
  20. if (n === self.sizes.length) yield p
  21. const size = self.sizes[n]
  22. for (let i = 0; i < size; i++) {
  23. yield* g([...p, i], n + 1)
  24. }
  25. }
  26. yield* g([], 0)
  27. }
  28. get(...indices) {
  29. const g = (o, n) => {
  30. if (n === indices.length || n === this.sizes.length) return o
  31. const i = indices[n]
  32. console.log(i, n)
  33. const f = Math.floor(i)
  34. const r = i - f
  35. if (r) {
  36. // Return weighted value
  37. const a = g(o[f], n + 1)
  38. const b = g(o[f + 1], n + 1)
  39. return a * (1 - r) + b * r
  40. } else {
  41. return g(o[f], n + 1)
  42. }
  43. }
  44. return g(this.data, 0)
  45. }
  46. set(value, ...indices) {
  47. const g = (o, w, n) => {
  48. const end = (n === indices.length - 1 || n === this.sizes.length - 1)
  49. const i = indices[n]
  50. console.log(i, w, n)
  51. const f = Math.floor(i)
  52. const r = i - f
  53. if (r) {
  54. if (end) {
  55. // o[f] = 1, v = .3, w = 1 ... expected result o[f] = .3
  56. // value - o[f] = -.7 ... * w = 1.. yep
  57. o[f] = o[f] + (1 - r) * w * (value - o[f])
  58. o[f + 1] = o[f + 1] + r * w * (value - o[f + 1])
  59. } else {
  60. g(o[f], (1 - r) * w, n + 1)
  61. g(o[f + 1], r * w, n + 1)
  62. }
  63. } else {
  64. if (end) {
  65. o[f] = o[f] + w * (value - o[f])
  66. } else {
  67. g(o[f], w, n + 1)
  68. }
  69. }
  70. }
  71. return g(this.data, 1, 0)
  72. }
  73. }
  74. const f = new Field(2,2,2)
  75. for (let i of f.indices()) {
  76. console.log(i)
  77. }
  78. f.set(1, .5,.5, .5)
  79. console.log(JSON.stringify(f.data))
  80. console.log(f.get(.5, .5, .5))