| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- import CoordinateList from '../geom/CoordinateList'
- import Geometry from '../geom/Geometry'
- import Arrays from '../../../../java/util/Arrays'
- import hasInterface from '../../../../hasInterface'
- import Collection from '../../../../java/util/Collection'
- import IncrementalDelaunayTriangulator from './IncrementalDelaunayTriangulator'
- import QuadEdgeSubdivision from './quadedge/QuadEdgeSubdivision'
- import Vertex from './quadedge/Vertex'
- import CoordinateArrays from '../geom/CoordinateArrays'
- import ArrayList from '../../../../java/util/ArrayList'
- import Envelope from '../geom/Envelope'
- export default class DelaunayTriangulationBuilder {
- constructor() {
- DelaunayTriangulationBuilder.constructor_.apply(this, arguments)
- }
- static constructor_() {
- this._siteCoords = null
- this._tolerance = 0.0
- this._subdiv = null
- }
- static extractUniqueCoordinates(geom) {
- if (geom === null) return new CoordinateList()
- const coords = geom.getCoordinates()
- return DelaunayTriangulationBuilder.unique(coords)
- }
- static envelope(coords) {
- const env = new Envelope()
- for (let i = coords.iterator(); i.hasNext(); ) {
- const coord = i.next()
- env.expandToInclude(coord)
- }
- return env
- }
- static unique(coords) {
- const coordsCopy = CoordinateArrays.copyDeep(coords)
- Arrays.sort(coordsCopy)
- const coordList = new CoordinateList(coordsCopy, false)
- return coordList
- }
- static toVertices(coords) {
- const verts = new ArrayList()
- for (let i = coords.iterator(); i.hasNext(); ) {
- const coord = i.next()
- verts.add(new Vertex(coord))
- }
- return verts
- }
- create() {
- if (this._subdiv !== null) return null
- const siteEnv = DelaunayTriangulationBuilder.envelope(this._siteCoords)
- const vertices = DelaunayTriangulationBuilder.toVertices(this._siteCoords)
- this._subdiv = new QuadEdgeSubdivision(siteEnv, this._tolerance)
- const triangulator = new IncrementalDelaunayTriangulator(this._subdiv)
- triangulator.insertSites(vertices)
- }
- setTolerance(tolerance) {
- this._tolerance = tolerance
- }
- setSites() {
- if (arguments[0] instanceof Geometry) {
- const geom = arguments[0]
- this._siteCoords = DelaunayTriangulationBuilder.extractUniqueCoordinates(geom)
- } else if (hasInterface(arguments[0], Collection)) {
- const coords = arguments[0]
- this._siteCoords = DelaunayTriangulationBuilder.unique(CoordinateArrays.toCoordinateArray(coords))
- }
- }
- getEdges(geomFact) {
- this.create()
- return this._subdiv.getEdges(geomFact)
- }
- getSubdivision() {
- this.create()
- return this._subdiv
- }
- getTriangles(geomFact) {
- this.create()
- return this._subdiv.getTriangles(geomFact)
- }
- }
|