Key.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import Interval from './Interval'
  2. import DoubleBits from '../quadtree/DoubleBits'
  3. export default class Key {
  4. constructor() {
  5. Key.constructor_.apply(this, arguments)
  6. }
  7. static constructor_() {
  8. this._pt = 0.0
  9. this._level = 0
  10. this._interval = null
  11. const interval = arguments[0]
  12. this.computeKey(interval)
  13. }
  14. static computeLevel(interval) {
  15. const dx = interval.getWidth()
  16. const level = DoubleBits.exponent(dx) + 1
  17. return level
  18. }
  19. getInterval() {
  20. return this._interval
  21. }
  22. getLevel() {
  23. return this._level
  24. }
  25. computeKey(itemInterval) {
  26. this._level = Key.computeLevel(itemInterval)
  27. this._interval = new Interval()
  28. this.computeInterval(this._level, itemInterval)
  29. while (!this._interval.contains(itemInterval)) {
  30. this._level += 1
  31. this.computeInterval(this._level, itemInterval)
  32. }
  33. }
  34. computeInterval(level, itemInterval) {
  35. const size = DoubleBits.powerOf2(level)
  36. this._pt = Math.floor(itemInterval.getMin() / size) * size
  37. this._interval.init(this._pt, this._pt + size)
  38. }
  39. getPoint() {
  40. return this._pt
  41. }
  42. }