Node.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import NodeBase from './NodeBase'
  2. import Interval from './Interval'
  3. import Assert from '../../util/Assert'
  4. import Key from './Key'
  5. export default class Node extends NodeBase {
  6. constructor() {
  7. super()
  8. Node.constructor_.apply(this, arguments)
  9. }
  10. static constructor_() {
  11. this._interval = null
  12. this._centre = null
  13. this._level = null
  14. const interval = arguments[0], level = arguments[1]
  15. this._interval = interval
  16. this._level = level
  17. this._centre = (interval.getMin() + interval.getMax()) / 2
  18. }
  19. static createNode(itemInterval) {
  20. const key = new Key(itemInterval)
  21. const node = new Node(key.getInterval(), key.getLevel())
  22. return node
  23. }
  24. static createExpanded(node, addInterval) {
  25. const expandInt = new Interval(addInterval)
  26. if (node !== null) expandInt.expandToInclude(node._interval)
  27. const largerNode = Node.createNode(expandInt)
  28. if (node !== null) largerNode.insert(node)
  29. return largerNode
  30. }
  31. getInterval() {
  32. return this._interval
  33. }
  34. find(searchInterval) {
  35. const subnodeIndex = NodeBase.getSubnodeIndex(searchInterval, this._centre)
  36. if (subnodeIndex === -1) return this
  37. if (this._subnode[subnodeIndex] !== null) {
  38. const node = this._subnode[subnodeIndex]
  39. return node.find(searchInterval)
  40. }
  41. return this
  42. }
  43. insert(node) {
  44. Assert.isTrue(this._interval === null || this._interval.contains(node._interval))
  45. const index = NodeBase.getSubnodeIndex(node._interval, this._centre)
  46. if (node._level === this._level - 1) {
  47. this._subnode[index] = node
  48. } else {
  49. const childNode = this.createSubnode(index)
  50. childNode.insert(node)
  51. this._subnode[index] = childNode
  52. }
  53. }
  54. isSearchMatch(itemInterval) {
  55. return itemInterval.overlaps(this._interval)
  56. }
  57. getSubnode(index) {
  58. if (this._subnode[index] === null)
  59. this._subnode[index] = this.createSubnode(index)
  60. return this._subnode[index]
  61. }
  62. getNode(searchInterval) {
  63. const subnodeIndex = NodeBase.getSubnodeIndex(searchInterval, this._centre)
  64. if (subnodeIndex !== -1) {
  65. const node = this.getSubnode(subnodeIndex)
  66. return node.getNode(searchInterval)
  67. } else {
  68. return this
  69. }
  70. }
  71. createSubnode(index) {
  72. let min = 0.0
  73. let max = 0.0
  74. switch (index) {
  75. case 0:
  76. min = this._interval.getMin()
  77. max = this._centre
  78. break
  79. case 1:
  80. min = this._centre
  81. max = this._interval.getMax()
  82. break
  83. }
  84. const subInt = new Interval(min, max)
  85. const node = new Node(subInt, this._level - 1)
  86. return node
  87. }
  88. }