UNPKG

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

127 lines (123 loc) 3.66 kB
import CGAlgorithms from '../algorithm/CGAlgorithms' import CoordinateFilter from '../geom/CoordinateFilter' import Coordinate from '../geom/Coordinate' import Double from '../../../../java/lang/Double' import LineSegment from '../geom/LineSegment' import CoordinateSequenceFilter from '../geom/CoordinateSequenceFilter' export default class SimpleMinimumClearance { constructor () { this._inputGeom = null this._minClearance = null this._minClearancePts = null const geom = arguments[0] this._inputGeom = geom } getLine () { this.compute() return this._inputGeom.getFactory().createLineString(this._minClearancePts) } updateClearance () { if (arguments.length === 3) { const candidateValue = arguments[0] const p0 = arguments[1] const p1 = arguments[2] if (candidateValue < this._minClearance) { this._minClearance = candidateValue this._minClearancePts[0] = new Coordinate(p0) this._minClearancePts[1] = new Coordinate(p1) } } else if (arguments.length === 4) { const candidateValue = arguments[0] const p = arguments[1] const seg0 = arguments[2] const seg1 = arguments[3] if (candidateValue < this._minClearance) { this._minClearance = candidateValue this._minClearancePts[0] = new Coordinate(p) const seg = new LineSegment(seg0, seg1) this._minClearancePts[1] = new Coordinate(seg.closestPoint(p)) } } } compute () { if (this._minClearancePts !== null) return null this._minClearancePts = new Array(2).fill(null) this._minClearance = Double.MAX_VALUE this._inputGeom.apply(new VertexCoordinateFilter(this)) } getDistance () { this.compute() return this._minClearance } interfaces_ () { return [] } getClass () { return SimpleMinimumClearance } static getLine (g) { const rp = new SimpleMinimumClearance(g) return rp.getLine() } static getDistance (g) { const rp = new SimpleMinimumClearance(g) return rp.getDistance() } static get VertexCoordinateFilter () { return VertexCoordinateFilter } static get ComputeMCCoordinateSequenceFilter () { return ComputeMCCoordinateSequenceFilter } } class VertexCoordinateFilter { constructor () { this.smc = null const smc = arguments[0] this.smc = smc } filter (coord) { this.smc._inputGeom.apply(new ComputeMCCoordinateSequenceFilter(this.smc, coord)) } interfaces_ () { return [CoordinateFilter] } getClass () { return VertexCoordinateFilter } } class ComputeMCCoordinateSequenceFilter { constructor () { this.smc = null this._queryPt = null const smc = arguments[0] const queryPt = arguments[1] this.smc = smc this._queryPt = queryPt } isGeometryChanged () { return false } checkVertexDistance (vertex) { const vertexDist = vertex.distance(this._queryPt) if (vertexDist > 0) { this.smc.updateClearance(vertexDist, this._queryPt, vertex) } } filter (seq, i) { this.checkVertexDistance(seq.getCoordinate(i)) if (i > 0) { this.checkSegmentDistance(seq.getCoordinate(i - 1), seq.getCoordinate(i)) } } checkSegmentDistance (seg0, seg1) { if (this._queryPt.equals2D(seg0) || this._queryPt.equals2D(seg1)) return null const segDist = CGAlgorithms.distancePointLine(this._queryPt, seg1, seg0) if (segDist > 0) this.smc.updateClearance(segDist, this._queryPt, seg1, seg0) } isDone () { return false } interfaces_ () { return [CoordinateSequenceFilter] } getClass () { return ComputeMCCoordinateSequenceFilter } }