node-red-contrib-tak-registration
Version:
A Node-RED node to register to TAK and to help wrap files as datapackages to send to TAK
81 lines (80 loc) • 2.73 kB
JavaScript
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)
}
}