ConformingDelaunayTriangulationBuilder.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import ConformingDelaunayTriangulator from './ConformingDelaunayTriangulator'
  2. import ConstraintVertex from './ConstraintVertex'
  3. import DelaunayTriangulationBuilder from './DelaunayTriangulationBuilder'
  4. import Segment from './Segment'
  5. import ArrayList from '../../../../java/util/ArrayList'
  6. import LinearComponentExtracter from '../geom/util/LinearComponentExtracter'
  7. import TreeMap from '../../../../java/util/TreeMap'
  8. export default class ConformingDelaunayTriangulationBuilder {
  9. constructor() {
  10. ConformingDelaunayTriangulationBuilder.constructor_.apply(this, arguments)
  11. }
  12. static constructor_() {
  13. this._siteCoords = null
  14. this._constraintLines = null
  15. this._tolerance = 0.0
  16. this._subdiv = null
  17. this._constraintVertexMap = new TreeMap()
  18. }
  19. static createConstraintSegments() {
  20. if (arguments.length === 1) {
  21. const geom = arguments[0]
  22. const lines = LinearComponentExtracter.getLines(geom)
  23. const constraintSegs = new ArrayList()
  24. for (let i = lines.iterator(); i.hasNext(); ) {
  25. const line = i.next()
  26. ConformingDelaunayTriangulationBuilder.createConstraintSegments(line, constraintSegs)
  27. }
  28. return constraintSegs
  29. } else if (arguments.length === 2) {
  30. const line = arguments[0], constraintSegs = arguments[1]
  31. const coords = line.getCoordinates()
  32. for (let i = 1; i < coords.length; i++)
  33. constraintSegs.add(new Segment(coords[i - 1], coords[i]))
  34. }
  35. }
  36. createSiteVertices(coords) {
  37. const verts = new ArrayList()
  38. for (let i = coords.iterator(); i.hasNext(); ) {
  39. const coord = i.next()
  40. if (this._constraintVertexMap.containsKey(coord)) continue
  41. verts.add(new ConstraintVertex(coord))
  42. }
  43. return verts
  44. }
  45. create() {
  46. if (this._subdiv !== null) return null
  47. const siteEnv = DelaunayTriangulationBuilder.envelope(this._siteCoords)
  48. let segments = new ArrayList()
  49. if (this._constraintLines !== null) {
  50. siteEnv.expandToInclude(this._constraintLines.getEnvelopeInternal())
  51. this.createVertices(this._constraintLines)
  52. segments = ConformingDelaunayTriangulationBuilder.createConstraintSegments(this._constraintLines)
  53. }
  54. const sites = this.createSiteVertices(this._siteCoords)
  55. const cdt = new ConformingDelaunayTriangulator(sites, this._tolerance)
  56. cdt.setConstraints(segments, new ArrayList(this._constraintVertexMap.values()))
  57. cdt.formInitialDelaunay()
  58. cdt.enforceConstraints()
  59. this._subdiv = cdt.getSubdivision()
  60. }
  61. setTolerance(tolerance) {
  62. this._tolerance = tolerance
  63. }
  64. setConstraints(constraintLines) {
  65. this._constraintLines = constraintLines
  66. }
  67. setSites(geom) {
  68. this._siteCoords = DelaunayTriangulationBuilder.extractUniqueCoordinates(geom)
  69. }
  70. getEdges(geomFact) {
  71. this.create()
  72. return this._subdiv.getEdges(geomFact)
  73. }
  74. getSubdivision() {
  75. this.create()
  76. return this._subdiv
  77. }
  78. getTriangles(geomFact) {
  79. this.create()
  80. return this._subdiv.getTriangles(geomFact)
  81. }
  82. createVertices(geom) {
  83. const coords = geom.getCoordinates()
  84. for (let i = 0; i < coords.length; i++) {
  85. const v = new ConstraintVertex(coords[i])
  86. this._constraintVertexMap.put(coords[i], v)
  87. }
  88. }
  89. }