LineBuilder.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import ArrayList from '../../../../../java/util/ArrayList'
  2. import Assert from '../../util/Assert'
  3. import OverlayOp from './OverlayOp'
  4. export default class LineBuilder {
  5. constructor() {
  6. LineBuilder.constructor_.apply(this, arguments)
  7. }
  8. static constructor_() {
  9. this._op = null
  10. this._geometryFactory = null
  11. this._ptLocator = null
  12. this._lineEdgesList = new ArrayList()
  13. this._resultLineList = new ArrayList()
  14. const op = arguments[0], geometryFactory = arguments[1], ptLocator = arguments[2]
  15. this._op = op
  16. this._geometryFactory = geometryFactory
  17. this._ptLocator = ptLocator
  18. }
  19. collectLines(opCode) {
  20. for (let it = this._op.getGraph().getEdgeEnds().iterator(); it.hasNext(); ) {
  21. const de = it.next()
  22. this.collectLineEdge(de, opCode, this._lineEdgesList)
  23. this.collectBoundaryTouchEdge(de, opCode, this._lineEdgesList)
  24. }
  25. }
  26. labelIsolatedLine(e, targetIndex) {
  27. const loc = this._ptLocator.locate(e.getCoordinate(), this._op.getArgGeometry(targetIndex))
  28. e.getLabel().setLocation(targetIndex, loc)
  29. }
  30. build(opCode) {
  31. this.findCoveredLineEdges()
  32. this.collectLines(opCode)
  33. this.buildLines(opCode)
  34. return this._resultLineList
  35. }
  36. collectLineEdge(de, opCode, edges) {
  37. const label = de.getLabel()
  38. const e = de.getEdge()
  39. if (de.isLineEdge())
  40. if (!de.isVisited() && OverlayOp.isResultOfOp(label, opCode) && !e.isCovered()) {
  41. edges.add(e)
  42. de.setVisitedEdge(true)
  43. }
  44. }
  45. findCoveredLineEdges() {
  46. for (let nodeit = this._op.getGraph().getNodes().iterator(); nodeit.hasNext(); ) {
  47. const node = nodeit.next()
  48. node.getEdges().findCoveredLineEdges()
  49. }
  50. for (let it = this._op.getGraph().getEdgeEnds().iterator(); it.hasNext(); ) {
  51. const de = it.next()
  52. const e = de.getEdge()
  53. if (de.isLineEdge() && !e.isCoveredSet()) {
  54. const isCovered = this._op.isCoveredByA(de.getCoordinate())
  55. e.setCovered(isCovered)
  56. }
  57. }
  58. }
  59. labelIsolatedLines(edgesList) {
  60. for (let it = edgesList.iterator(); it.hasNext(); ) {
  61. const e = it.next()
  62. const label = e.getLabel()
  63. if (e.isIsolated())
  64. if (label.isNull(0)) this.labelIsolatedLine(e, 0); else this.labelIsolatedLine(e, 1)
  65. }
  66. }
  67. buildLines(opCode) {
  68. for (let it = this._lineEdgesList.iterator(); it.hasNext(); ) {
  69. const e = it.next()
  70. const line = this._geometryFactory.createLineString(e.getCoordinates())
  71. this._resultLineList.add(line)
  72. e.setInResult(true)
  73. }
  74. }
  75. collectBoundaryTouchEdge(de, opCode, edges) {
  76. const label = de.getLabel()
  77. if (de.isLineEdge()) return null
  78. if (de.isVisited()) return null
  79. if (de.isInteriorAreaEdge()) return null
  80. if (de.getEdge().isInResult()) return null
  81. Assert.isTrue(!(de.isInResult() || de.getSym().isInResult()) || !de.getEdge().isInResult())
  82. if (OverlayOp.isResultOfOp(label, opCode) && opCode === OverlayOp.INTERSECTION) {
  83. edges.add(de.getEdge())
  84. de.setVisitedEdge(true)
  85. }
  86. }
  87. }