DelaunayTriangulationBuilder.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import CoordinateList from '../geom/CoordinateList'
  2. import Geometry from '../geom/Geometry'
  3. import Arrays from '../../../../java/util/Arrays'
  4. import hasInterface from '../../../../hasInterface'
  5. import Collection from '../../../../java/util/Collection'
  6. import IncrementalDelaunayTriangulator from './IncrementalDelaunayTriangulator'
  7. import QuadEdgeSubdivision from './quadedge/QuadEdgeSubdivision'
  8. import Vertex from './quadedge/Vertex'
  9. import CoordinateArrays from '../geom/CoordinateArrays'
  10. import ArrayList from '../../../../java/util/ArrayList'
  11. import Envelope from '../geom/Envelope'
  12. export default class DelaunayTriangulationBuilder {
  13. constructor() {
  14. DelaunayTriangulationBuilder.constructor_.apply(this, arguments)
  15. }
  16. static constructor_() {
  17. this._siteCoords = null
  18. this._tolerance = 0.0
  19. this._subdiv = null
  20. }
  21. static extractUniqueCoordinates(geom) {
  22. if (geom === null) return new CoordinateList()
  23. const coords = geom.getCoordinates()
  24. return DelaunayTriangulationBuilder.unique(coords)
  25. }
  26. static envelope(coords) {
  27. const env = new Envelope()
  28. for (let i = coords.iterator(); i.hasNext(); ) {
  29. const coord = i.next()
  30. env.expandToInclude(coord)
  31. }
  32. return env
  33. }
  34. static unique(coords) {
  35. const coordsCopy = CoordinateArrays.copyDeep(coords)
  36. Arrays.sort(coordsCopy)
  37. const coordList = new CoordinateList(coordsCopy, false)
  38. return coordList
  39. }
  40. static toVertices(coords) {
  41. const verts = new ArrayList()
  42. for (let i = coords.iterator(); i.hasNext(); ) {
  43. const coord = i.next()
  44. verts.add(new Vertex(coord))
  45. }
  46. return verts
  47. }
  48. create() {
  49. if (this._subdiv !== null) return null
  50. const siteEnv = DelaunayTriangulationBuilder.envelope(this._siteCoords)
  51. const vertices = DelaunayTriangulationBuilder.toVertices(this._siteCoords)
  52. this._subdiv = new QuadEdgeSubdivision(siteEnv, this._tolerance)
  53. const triangulator = new IncrementalDelaunayTriangulator(this._subdiv)
  54. triangulator.insertSites(vertices)
  55. }
  56. setTolerance(tolerance) {
  57. this._tolerance = tolerance
  58. }
  59. setSites() {
  60. if (arguments[0] instanceof Geometry) {
  61. const geom = arguments[0]
  62. this._siteCoords = DelaunayTriangulationBuilder.extractUniqueCoordinates(geom)
  63. } else if (hasInterface(arguments[0], Collection)) {
  64. const coords = arguments[0]
  65. this._siteCoords = DelaunayTriangulationBuilder.unique(CoordinateArrays.toCoordinateArray(coords))
  66. }
  67. }
  68. getEdges(geomFact) {
  69. this.create()
  70. return this._subdiv.getEdges(geomFact)
  71. }
  72. getSubdivision() {
  73. this.create()
  74. return this._subdiv
  75. }
  76. getTriangles(geomFact) {
  77. this.create()
  78. return this._subdiv.getTriangles(geomFact)
  79. }
  80. }