NodingIntersectionFinder.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import SegmentIntersector from './SegmentIntersector'
  2. import ArrayList from '../../../../java/util/ArrayList'
  3. export default class NodingIntersectionFinder {
  4. constructor() {
  5. NodingIntersectionFinder.constructor_.apply(this, arguments)
  6. }
  7. static constructor_() {
  8. this._findAllIntersections = false
  9. this._isCheckEndSegmentsOnly = false
  10. this._keepIntersections = true
  11. this._isInteriorIntersectionsOnly = false
  12. this._li = null
  13. this._interiorIntersection = null
  14. this._intSegments = null
  15. this._intersections = new ArrayList()
  16. this._intersectionCount = 0
  17. const li = arguments[0]
  18. this._li = li
  19. this._interiorIntersection = null
  20. }
  21. static createAllIntersectionsFinder(li) {
  22. const finder = new NodingIntersectionFinder(li)
  23. finder.setFindAllIntersections(true)
  24. return finder
  25. }
  26. static isInteriorVertexIntersection() {
  27. if (arguments.length === 4) {
  28. const p0 = arguments[0], p1 = arguments[1], isEnd0 = arguments[2], isEnd1 = arguments[3]
  29. if (isEnd0 && isEnd1) return false
  30. if (p0.equals2D(p1))
  31. return true
  32. return false
  33. } else if (arguments.length === 8) {
  34. const p00 = arguments[0], p01 = arguments[1], p10 = arguments[2], p11 = arguments[3], isEnd00 = arguments[4], isEnd01 = arguments[5], isEnd10 = arguments[6], isEnd11 = arguments[7]
  35. if (NodingIntersectionFinder.isInteriorVertexIntersection(p00, p10, isEnd00, isEnd10)) return true
  36. if (NodingIntersectionFinder.isInteriorVertexIntersection(p00, p11, isEnd00, isEnd11)) return true
  37. if (NodingIntersectionFinder.isInteriorVertexIntersection(p01, p10, isEnd01, isEnd10)) return true
  38. if (NodingIntersectionFinder.isInteriorVertexIntersection(p01, p11, isEnd01, isEnd11)) return true
  39. return false
  40. }
  41. }
  42. static createInteriorIntersectionCounter(li) {
  43. const finder = new NodingIntersectionFinder(li)
  44. finder.setInteriorIntersectionsOnly(true)
  45. finder.setFindAllIntersections(true)
  46. finder.setKeepIntersections(false)
  47. return finder
  48. }
  49. static createIntersectionCounter(li) {
  50. const finder = new NodingIntersectionFinder(li)
  51. finder.setFindAllIntersections(true)
  52. finder.setKeepIntersections(false)
  53. return finder
  54. }
  55. static isEndSegment(segStr, index) {
  56. if (index === 0) return true
  57. if (index >= segStr.size() - 2) return true
  58. return false
  59. }
  60. static createAnyIntersectionFinder(li) {
  61. return new NodingIntersectionFinder(li)
  62. }
  63. static createInteriorIntersectionsFinder(li) {
  64. const finder = new NodingIntersectionFinder(li)
  65. finder.setFindAllIntersections(true)
  66. finder.setInteriorIntersectionsOnly(true)
  67. return finder
  68. }
  69. setCheckEndSegmentsOnly(isCheckEndSegmentsOnly) {
  70. this._isCheckEndSegmentsOnly = isCheckEndSegmentsOnly
  71. }
  72. getIntersectionSegments() {
  73. return this._intSegments
  74. }
  75. count() {
  76. return this._intersectionCount
  77. }
  78. getIntersections() {
  79. return this._intersections
  80. }
  81. setFindAllIntersections(findAllIntersections) {
  82. this._findAllIntersections = findAllIntersections
  83. }
  84. setKeepIntersections(keepIntersections) {
  85. this._keepIntersections = keepIntersections
  86. }
  87. getIntersection() {
  88. return this._interiorIntersection
  89. }
  90. processIntersections(e0, segIndex0, e1, segIndex1) {
  91. if (!this._findAllIntersections && this.hasIntersection()) return null
  92. const isSameSegString = e0 === e1
  93. const isSameSegment = isSameSegString && segIndex0 === segIndex1
  94. if (isSameSegment) return null
  95. if (this._isCheckEndSegmentsOnly) {
  96. const isEndSegPresent = NodingIntersectionFinder.isEndSegment(e0, segIndex0) || NodingIntersectionFinder.isEndSegment(e1, segIndex1)
  97. if (!isEndSegPresent) return null
  98. }
  99. const p00 = e0.getCoordinate(segIndex0)
  100. const p01 = e0.getCoordinate(segIndex0 + 1)
  101. const p10 = e1.getCoordinate(segIndex1)
  102. const p11 = e1.getCoordinate(segIndex1 + 1)
  103. const isEnd00 = segIndex0 === 0
  104. const isEnd01 = segIndex0 + 2 === e0.size()
  105. const isEnd10 = segIndex1 === 0
  106. const isEnd11 = segIndex1 + 2 === e1.size()
  107. this._li.computeIntersection(p00, p01, p10, p11)
  108. const isInteriorInt = this._li.hasIntersection() && this._li.isInteriorIntersection()
  109. let isInteriorVertexInt = false
  110. if (!this._isInteriorIntersectionsOnly) {
  111. const isAdjacentSegment = isSameSegString && Math.abs(segIndex1 - segIndex0) <= 1
  112. isInteriorVertexInt = !isAdjacentSegment && NodingIntersectionFinder.isInteriorVertexIntersection(p00, p01, p10, p11, isEnd00, isEnd01, isEnd10, isEnd11)
  113. }
  114. if (isInteriorInt || isInteriorVertexInt) {
  115. this._intSegments = new Array(4).fill(null)
  116. this._intSegments[0] = p00
  117. this._intSegments[1] = p01
  118. this._intSegments[2] = p10
  119. this._intSegments[3] = p11
  120. this._interiorIntersection = this._li.getIntersection(0)
  121. if (this._keepIntersections) this._intersections.add(this._interiorIntersection)
  122. this._intersectionCount++
  123. }
  124. }
  125. hasIntersection() {
  126. return this._interiorIntersection !== null
  127. }
  128. isDone() {
  129. if (this._findAllIntersections) return false
  130. return this._interiorIntersection !== null
  131. }
  132. setInteriorIntersectionsOnly(isInteriorIntersectionsOnly) {
  133. this._isInteriorIntersectionsOnly = isInteriorIntersectionsOnly
  134. }
  135. get interfaces_() {
  136. return [SegmentIntersector]
  137. }
  138. }