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
96 lines (94 loc) • 3.27 kB
JavaScript
import ConformingDelaunayTriangulator from './ConformingDelaunayTriangulator'
import ConstraintVertex from './ConstraintVertex'
import DelaunayTriangulationBuilder from './DelaunayTriangulationBuilder'
import Segment from './Segment'
import ArrayList from '../../../../java/util/ArrayList'
import LinearComponentExtracter from '../geom/util/LinearComponentExtracter'
import TreeMap from '../../../../java/util/TreeMap'
export default class ConformingDelaunayTriangulationBuilder {
constructor () {
this._siteCoords = null
this._constraintLines = null
this._tolerance = 0.0
this._subdiv = null
this._constraintVertexMap = new TreeMap()
}
createSiteVertices (coords) {
const verts = new ArrayList()
for (const i = coords.iterator(); i.hasNext();) {
const coord = i.next()
if (this._constraintVertexMap.containsKey(coord)) continue
verts.add(new ConstraintVertex(coord))
}
return verts
}
create () {
if (this._subdiv !== null) return null
const siteEnv = DelaunayTriangulationBuilder.envelope(this._siteCoords)
let segments = new ArrayList()
if (this._constraintLines !== null) {
siteEnv.expandToInclude(this._constraintLines.getEnvelopeInternal())
this.createVertices(this._constraintLines)
segments = ConformingDelaunayTriangulationBuilder.createConstraintSegments(this._constraintLines)
}
const sites = this.createSiteVertices(this._siteCoords)
const cdt = new ConformingDelaunayTriangulator(sites, this._tolerance)
cdt.setConstraints(segments, new ArrayList(this._constraintVertexMap.values()))
cdt.formInitialDelaunay()
cdt.enforceConstraints()
this._subdiv = cdt.getSubdivision()
}
setTolerance (tolerance) {
this._tolerance = tolerance
}
setConstraints (constraintLines) {
this._constraintLines = constraintLines
}
setSites (geom) {
this._siteCoords = DelaunayTriangulationBuilder.extractUniqueCoordinates(geom)
}
getEdges (geomFact) {
this.create()
return this._subdiv.getEdges(geomFact)
}
getSubdivision () {
this.create()
return this._subdiv
}
getTriangles (geomFact) {
this.create()
return this._subdiv.getTriangles(geomFact)
}
createVertices (geom) {
const coords = geom.getCoordinates()
for (let i = 0; i < coords.length; i++) {
const v = new ConstraintVertex(coords[i])
this._constraintVertexMap.put(coords[i], v)
}
}
interfaces_ () {
return []
}
getClass () {
return ConformingDelaunayTriangulationBuilder
}
static createConstraintSegments () {
if (arguments.length === 1) {
const geom = arguments[0]
const lines = LinearComponentExtracter.getLines(geom)
const constraintSegs = new ArrayList()
for (const i = lines.iterator(); i.hasNext();) {
const line = i.next()
ConformingDelaunayTriangulationBuilder.createConstraintSegments(line, constraintSegs)
}
return constraintSegs
} else if (arguments.length === 2) {
const line = arguments[0]
const constraintSegs = arguments[1]
const coords = line.getCoordinates()
for (let i = 1; i < coords.length; i++) {
constraintSegs.add(new Segment(coords[i - 1], coords[i]))
}
}
}
}