SierpinskiCarpetBuilder.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import CoordinateList from '../../geom/CoordinateList'
  2. import GeometryFactory from '../../geom/GeometryFactory'
  3. import Coordinate from '../../geom/Coordinate'
  4. import ArrayList from '../../../../../java/util/ArrayList'
  5. import GeometricShapeBuilder from '../GeometricShapeBuilder'
  6. export default class SierpinskiCarpetBuilder extends GeometricShapeBuilder {
  7. constructor() {
  8. super()
  9. SierpinskiCarpetBuilder.constructor_.apply(this, arguments)
  10. }
  11. static constructor_() {
  12. this._coordList = new CoordinateList()
  13. const geomFactory = arguments[0]
  14. GeometricShapeBuilder.constructor_.call(this, geomFactory)
  15. }
  16. static recursionLevelForSize(numPts) {
  17. const pow4 = Math.trunc(numPts / 3)
  18. const exp = Math.log(pow4) / Math.log(4)
  19. return Math.trunc(exp)
  20. }
  21. addHoles(n, originX, originY, width, holeList) {
  22. if (n < 0) return null
  23. const n2 = n - 1
  24. const widthThird = width / 3.0
  25. this.addHoles(n2, originX, originY, widthThird, holeList)
  26. this.addHoles(n2, originX + widthThird, originY, widthThird, holeList)
  27. this.addHoles(n2, originX + 2 * widthThird, originY, widthThird, holeList)
  28. this.addHoles(n2, originX, originY + widthThird, widthThird, holeList)
  29. this.addHoles(n2, originX + 2 * widthThird, originY + widthThird, widthThird, holeList)
  30. this.addHoles(n2, originX, originY + 2 * widthThird, widthThird, holeList)
  31. this.addHoles(n2, originX + widthThird, originY + 2 * widthThird, widthThird, holeList)
  32. this.addHoles(n2, originX + 2 * widthThird, originY + 2 * widthThird, widthThird, holeList)
  33. holeList.add(this.createSquareHole(originX + widthThird, originY + widthThird, widthThird))
  34. }
  35. getHoles(n, originX, originY, width) {
  36. const holeList = new ArrayList()
  37. this.addHoles(n, originX, originY, width, holeList)
  38. return GeometryFactory.toLinearRingArray(holeList)
  39. }
  40. createSquareHole(x, y, width) {
  41. const pts = [new Coordinate(x, y), new Coordinate(x + width, y), new Coordinate(x + width, y + width), new Coordinate(x, y + width), new Coordinate(x, y)]
  42. return this._geomFactory.createLinearRing(pts)
  43. }
  44. getGeometry() {
  45. const level = SierpinskiCarpetBuilder.recursionLevelForSize(this._numPts)
  46. const baseLine = this.getSquareBaseLine()
  47. const origin = baseLine.getCoordinate(0)
  48. const holes = this.getHoles(level, origin.x, origin.y, this.getDiameter())
  49. const shell = this._geomFactory.toGeometry(this.getSquareExtent()).getExteriorRing()
  50. return this._geomFactory.createPolygon(shell, holes)
  51. }
  52. }