HilbertCurveBuilder.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import Coordinate from '../../geom/Coordinate'
  2. import HilbertCode from './HilbertCode'
  3. import GeometricShapeBuilder from '../GeometricShapeBuilder'
  4. export default class HilbertCurveBuilder extends GeometricShapeBuilder {
  5. constructor() {
  6. super()
  7. HilbertCurveBuilder.constructor_.apply(this, arguments)
  8. }
  9. static constructor_() {
  10. this._order = -1
  11. const geomFactory = arguments[0]
  12. GeometricShapeBuilder.constructor_.call(this, geomFactory)
  13. this._extent = null
  14. }
  15. static transform(val, scale, offset) {
  16. return val * scale + offset
  17. }
  18. getGeometry() {
  19. const level = HilbertCode.level(this._numPts)
  20. const nPts = HilbertCode.size(level)
  21. let scale = 1
  22. let baseX = 0
  23. let baseY = 0
  24. if (this._extent !== null) {
  25. const baseLine = this.getSquareBaseLine()
  26. baseX = baseLine.minX()
  27. baseY = baseLine.minY()
  28. const width = baseLine.getLength()
  29. const maxOrdinate = HilbertCode.maxOrdinate(level)
  30. scale = width / maxOrdinate
  31. }
  32. const pts = new Array(nPts).fill(null)
  33. for (let i = 0; i < nPts; i++) {
  34. const pt = HilbertCode.decode(level, i)
  35. const x = HilbertCurveBuilder.transform(pt.getX(), scale, baseX)
  36. const y = HilbertCurveBuilder.transform(pt.getY(), scale, baseY)
  37. pts[i] = new Coordinate(x, y)
  38. }
  39. return this._geomFactory.createLineString(pts)
  40. }
  41. setLevel(level) {
  42. this._numPts = HilbertCode.size(level)
  43. }
  44. }