SimpleMinimumClearance.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import CoordinateFilter from '../geom/CoordinateFilter'
  2. import Coordinate from '../geom/Coordinate'
  3. import Double from '../../../../java/lang/Double'
  4. import LineSegment from '../geom/LineSegment'
  5. import CoordinateSequenceFilter from '../geom/CoordinateSequenceFilter'
  6. import Distance from '../algorithm/Distance'
  7. export default class SimpleMinimumClearance {
  8. constructor() {
  9. SimpleMinimumClearance.constructor_.apply(this, arguments)
  10. }
  11. static constructor_() {
  12. this._inputGeom = null
  13. this._minClearance = null
  14. this._minClearancePts = null
  15. const geom = arguments[0]
  16. this._inputGeom = geom
  17. }
  18. static getLine(g) {
  19. const rp = new SimpleMinimumClearance(g)
  20. return rp.getLine()
  21. }
  22. static getDistance(g) {
  23. const rp = new SimpleMinimumClearance(g)
  24. return rp.getDistance()
  25. }
  26. getLine() {
  27. this.compute()
  28. return this._inputGeom.getFactory().createLineString(this._minClearancePts)
  29. }
  30. updateClearance() {
  31. if (arguments.length === 3) {
  32. const candidateValue = arguments[0], p0 = arguments[1], p1 = arguments[2]
  33. if (candidateValue < this._minClearance) {
  34. this._minClearance = candidateValue
  35. this._minClearancePts[0] = new Coordinate(p0)
  36. this._minClearancePts[1] = new Coordinate(p1)
  37. }
  38. } else if (arguments.length === 4) {
  39. const candidateValue = arguments[0], p = arguments[1], seg0 = arguments[2], seg1 = arguments[3]
  40. if (candidateValue < this._minClearance) {
  41. this._minClearance = candidateValue
  42. this._minClearancePts[0] = new Coordinate(p)
  43. const seg = new LineSegment(seg0, seg1)
  44. this._minClearancePts[1] = new Coordinate(seg.closestPoint(p))
  45. }
  46. }
  47. }
  48. compute() {
  49. if (this._minClearancePts !== null) return null
  50. this._minClearancePts = new Array(2).fill(null)
  51. this._minClearance = Double.MAX_VALUE
  52. this._inputGeom.apply(new VertexCoordinateFilter(this))
  53. }
  54. getDistance() {
  55. this.compute()
  56. return this._minClearance
  57. }
  58. }
  59. class VertexCoordinateFilter {
  60. constructor() {
  61. VertexCoordinateFilter.constructor_.apply(this, arguments)
  62. }
  63. static constructor_() {
  64. this.smc = null
  65. const smc = arguments[0]
  66. this.smc = smc
  67. }
  68. filter(coord) {
  69. this.smc._inputGeom.apply(new ComputeMCCoordinateSequenceFilter(this.smc, coord))
  70. }
  71. get interfaces_() {
  72. return [CoordinateFilter]
  73. }
  74. }
  75. class ComputeMCCoordinateSequenceFilter {
  76. constructor() {
  77. ComputeMCCoordinateSequenceFilter.constructor_.apply(this, arguments)
  78. }
  79. static constructor_() {
  80. this.smc = null
  81. this._queryPt = null
  82. const smc = arguments[0], queryPt = arguments[1]
  83. this.smc = smc
  84. this._queryPt = queryPt
  85. }
  86. isGeometryChanged() {
  87. return false
  88. }
  89. checkVertexDistance(vertex) {
  90. const vertexDist = vertex.distance(this._queryPt)
  91. if (vertexDist > 0)
  92. this.smc.updateClearance(vertexDist, this._queryPt, vertex)
  93. }
  94. filter(seq, i) {
  95. this.checkVertexDistance(seq.getCoordinate(i))
  96. if (i > 0)
  97. this.checkSegmentDistance(seq.getCoordinate(i - 1), seq.getCoordinate(i))
  98. }
  99. checkSegmentDistance(seg0, seg1) {
  100. if (this._queryPt.equals2D(seg0) || this._queryPt.equals2D(seg1)) return null
  101. const segDist = Distance.pointToSegment(this._queryPt, seg1, seg0)
  102. if (segDist > 0) this.smc.updateClearance(segDist, this._queryPt, seg1, seg0)
  103. }
  104. isDone() {
  105. return false
  106. }
  107. get interfaces_() {
  108. return [CoordinateSequenceFilter]
  109. }
  110. }
  111. SimpleMinimumClearance.VertexCoordinateFilter = VertexCoordinateFilter
  112. SimpleMinimumClearance.ComputeMCCoordinateSequenceFilter = ComputeMCCoordinateSequenceFilter