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
250 lines (248 loc) • 7.59 kB
JavaScript
import PolygonizeDirectedEdge from './PolygonizeDirectedEdge'
import HashSet from '../../../../../java/util/HashSet'
import Stack from '../../../../../java/util/Stack'
import Node from '../../planargraph/Node'
import PolygonizeEdge from './PolygonizeEdge'
import EdgeRing from './EdgeRing'
import CoordinateArrays from '../../geom/CoordinateArrays'
import ArrayList from '../../../../../java/util/ArrayList'
import Assert from '../../util/Assert'
import PlanarGraph from '../../planargraph/PlanarGraph'
export default class PolygonizeGraph extends PlanarGraph {
constructor () {
super()
this._factory = arguments[0] || null
}
findEdgeRing (startDE) {
const er = new EdgeRing(this._factory)
er.build(startDE)
return er
}
computeDepthParity () {
if (arguments.length === 0) {
while (true) {
const de = null
if (de === null) return null
this.computeDepthParity(de)
}
} else if (arguments.length === 1) {
// let de = arguments[0]
}
}
computeNextCWEdges () {
for (const iNode = this.nodeIterator(); iNode.hasNext();) {
const node = iNode.next()
PolygonizeGraph.computeNextCWEdges(node)
}
}
addEdge (line) {
if (line.isEmpty()) {
return null
}
const linePts = CoordinateArrays.removeRepeatedPoints(line.getCoordinates())
if (linePts.length < 2) {
return null
}
const startPt = linePts[0]
const endPt = linePts[linePts.length - 1]
const nStart = this.getNode(startPt)
const nEnd = this.getNode(endPt)
const de0 = new PolygonizeDirectedEdge(nStart, nEnd, linePts[1], true)
const de1 = new PolygonizeDirectedEdge(nEnd, nStart, linePts[linePts.length - 2], false)
const edge = new PolygonizeEdge(line)
edge.setDirectedEdges(de0, de1)
this.add(edge)
}
deleteCutEdges () {
this.computeNextCWEdges()
PolygonizeGraph.findLabeledEdgeRings(this._dirEdges)
const cutLines = new ArrayList()
for (let i = this._dirEdges.iterator(); i.hasNext();) {
const de = i.next()
if (de.isMarked()) continue
const sym = de.getSym()
if (de.getLabel() === sym.getLabel()) {
de.setMarked(true)
sym.setMarked(true)
const e = de.getEdge()
cutLines.add(e.getLine())
}
}
return cutLines
}
getEdgeRings () {
this.computeNextCWEdges()
PolygonizeGraph.label(this._dirEdges, -1)
const maximalRings = PolygonizeGraph.findLabeledEdgeRings(this._dirEdges)
this.convertMaximalToMinimalEdgeRings(maximalRings)
const edgeRingList = new ArrayList()
for (let i = this._dirEdges.iterator(); i.hasNext();) {
const de = i.next()
if (de.isMarked()) continue
if (de.isInRing()) continue
const er = this.findEdgeRing(de)
edgeRingList.add(er)
}
return edgeRingList
}
getNode (pt) {
let node = this.findNode(pt)
if (node === null) {
node = new Node(pt)
this.add(node)
}
return node
}
convertMaximalToMinimalEdgeRings (ringEdges) {
for (let i = ringEdges.iterator(); i.hasNext();) {
const de = i.next()
const label = de.getLabel()
const intNodes = PolygonizeGraph.findIntersectionNodes(de, label)
if (intNodes === null) continue
for (const iNode = intNodes.iterator(); iNode.hasNext();) {
const node = iNode.next()
PolygonizeGraph.computeNextCCWEdges(node, label)
}
}
}
deleteDangles () {
const nodesToRemove = this.findNodesOfDegree(1)
const dangleLines = new HashSet()
const nodeStack = new Stack()
for (let i = nodesToRemove.iterator(); i.hasNext();) {
nodeStack.push(i.next())
}
while (!nodeStack.isEmpty()) {
const node = nodeStack.pop()
PolygonizeGraph.deleteAllEdges(node)
const nodeOutEdges = node.getOutEdges().getEdges()
for (let i = nodeOutEdges.iterator(); i.hasNext();) {
const de = i.next()
de.setMarked(true)
const sym = de.getSym()
if (sym !== null) sym.setMarked(true)
const e = de.getEdge()
dangleLines.add(e.getLine())
const toNode = de.getToNode()
if (PolygonizeGraph.getDegreeNonDeleted(toNode) === 1) nodeStack.push(toNode)
}
}
return dangleLines
}
interfaces_ () {
return []
}
getClass () {
return PolygonizeGraph
}
static findLabeledEdgeRings (dirEdges) {
const edgeRingStarts = new ArrayList()
let currLabel = 1
for (let i = dirEdges.iterator(); i.hasNext();) {
const de = i.next()
if (de.isMarked()) continue
if (de.getLabel() >= 0) continue
edgeRingStarts.add(de)
const edges = EdgeRing.findDirEdgesInRing(de)
PolygonizeGraph.label(edges, currLabel)
currLabel++
}
return edgeRingStarts
}
static getDegreeNonDeleted (node) {
const edges = node.getOutEdges().getEdges()
let degree = 0
for (let i = edges.iterator(); i.hasNext();) {
const de = i.next()
if (!de.isMarked()) degree++
}
return degree
}
static deleteAllEdges (node) {
const edges = node.getOutEdges().getEdges()
for (let i = edges.iterator(); i.hasNext();) {
const de = i.next()
de.setMarked(true)
const sym = de.getSym()
if (sym !== null) sym.setMarked(true)
}
}
static label (dirEdges, label) {
for (let i = dirEdges.iterator(); i.hasNext();) {
const de = i.next()
de.setLabel(label)
}
}
static computeNextCWEdges (node) {
const deStar = node.getOutEdges()
let startDE = null
let prevDE = null
for (let i = deStar.getEdges().iterator(); i.hasNext();) {
const outDE = i.next()
if (outDE.isMarked()) continue
if (startDE === null) startDE = outDE
if (prevDE !== null) {
const sym = prevDE.getSym()
sym.setNext(outDE)
}
prevDE = outDE
}
if (prevDE !== null) {
const sym = prevDE.getSym()
sym.setNext(startDE)
}
}
static computeNextCCWEdges (node, label) {
const deStar = node.getOutEdges()
let firstOutDE = null
let prevInDE = null
const edges = deStar.getEdges()
for (let i = edges.size() - 1; i >= 0; i--) {
const de = edges.get(i)
const sym = de.getSym()
let outDE = null
if (de.getLabel() === label) outDE = de
let inDE = null
if (sym.getLabel() === label) inDE = sym
if (outDE === null && inDE === null) continue
if (inDE !== null) {
prevInDE = inDE
}
if (outDE !== null) {
if (prevInDE !== null) {
prevInDE.setNext(outDE)
prevInDE = null
}
if (firstOutDE === null) firstOutDE = outDE
}
}
if (prevInDE !== null) {
Assert.isTrue(firstOutDE !== null)
prevInDE.setNext(firstOutDE)
}
}
static getDegree (node, label) {
const edges = node.getOutEdges().getEdges()
let degree = 0
for (let i = edges.iterator(); i.hasNext();) {
const de = i.next()
if (de.getLabel() === label) degree++
}
return degree
}
static findIntersectionNodes (startDE, label) {
let de = startDE
let intNodes = null
do {
const node = de.getFromNode()
if (PolygonizeGraph.getDegree(node, label) > 1) {
if (intNodes === null) intNodes = new ArrayList()
intNodes.add(node)
}
de = de.getNext()
Assert.isTrue(de !== null, 'found null DE in ring')
Assert.isTrue(de === startDE || !de.isInRing(), 'found DE already in ring')
} while (de !== startDE)
return intNodes
}
}