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
101 lines (100 loc) • 4.21 kB
JavaScript
import hasInterface from '../../../../../hasInterface'
import Position from '../../geomgraph/Position'
import Coordinate from '../../geom/Coordinate'
import Orientation from '../../algorithm/Orientation'
import Collections from '../../../../../java/util/Collections'
import DirectedEdge from '../../geomgraph/DirectedEdge'
import LineSegment from '../../geom/LineSegment'
import Comparable from '../../../../../java/lang/Comparable'
import ArrayList from '../../../../../java/util/ArrayList'
import List from '../../../../../java/util/List'
export default class SubgraphDepthLocater {
constructor() {
SubgraphDepthLocater.constructor_.apply(this, arguments)
}
static constructor_() {
this._subgraphs = null
this._seg = new LineSegment()
const subgraphs = arguments[0]
this._subgraphs = subgraphs
}
findStabbedSegments() {
if (arguments.length === 1) {
const stabbingRayLeftPt = arguments[0]
const stabbedSegments = new ArrayList()
for (let i = this._subgraphs.iterator(); i.hasNext(); ) {
const bsg = i.next()
const env = bsg.getEnvelope()
if (stabbingRayLeftPt.y < env.getMinY() || stabbingRayLeftPt.y > env.getMaxY()) continue
this.findStabbedSegments(stabbingRayLeftPt, bsg.getDirectedEdges(), stabbedSegments)
}
return stabbedSegments
} else if (arguments.length === 3) {
if (hasInterface(arguments[2], List) && (arguments[0] instanceof Coordinate && arguments[1] instanceof DirectedEdge)) {
const stabbingRayLeftPt = arguments[0], dirEdge = arguments[1], stabbedSegments = arguments[2]
const pts = dirEdge.getEdge().getCoordinates()
for (let i = 0; i < pts.length - 1; i++) {
this._seg.p0 = pts[i]
this._seg.p1 = pts[i + 1]
if (this._seg.p0.y > this._seg.p1.y) this._seg.reverse()
const maxx = Math.max(this._seg.p0.x, this._seg.p1.x)
if (maxx < stabbingRayLeftPt.x) continue
if (this._seg.isHorizontal()) continue
if (stabbingRayLeftPt.y < this._seg.p0.y || stabbingRayLeftPt.y > this._seg.p1.y) continue
if (Orientation.index(this._seg.p0, this._seg.p1, stabbingRayLeftPt) === Orientation.RIGHT) continue
let depth = dirEdge.getDepth(Position.LEFT)
if (!this._seg.p0.equals(pts[i])) depth = dirEdge.getDepth(Position.RIGHT)
const ds = new DepthSegment(this._seg, depth)
stabbedSegments.add(ds)
}
} else if (hasInterface(arguments[2], List) && (arguments[0] instanceof Coordinate && hasInterface(arguments[1], List))) {
const stabbingRayLeftPt = arguments[0], dirEdges = arguments[1], stabbedSegments = arguments[2]
for (let i = dirEdges.iterator(); i.hasNext(); ) {
const de = i.next()
if (!de.isForward()) continue
this.findStabbedSegments(stabbingRayLeftPt, de, stabbedSegments)
}
}
}
}
getDepth(p) {
const stabbedSegments = this.findStabbedSegments(p)
if (stabbedSegments.size() === 0) return 0
const ds = Collections.min(stabbedSegments)
return ds._leftDepth
}
}
class DepthSegment {
constructor() {
DepthSegment.constructor_.apply(this, arguments)
}
static constructor_() {
this._upwardSeg = null
this._leftDepth = null
const seg = arguments[0], depth = arguments[1]
this._upwardSeg = new LineSegment(seg)
this._leftDepth = depth
}
compareTo(obj) {
const other = obj
if (this._upwardSeg.minX() >= other._upwardSeg.maxX()) return 1
if (this._upwardSeg.maxX() <= other._upwardSeg.minX()) return -1
let orientIndex = this._upwardSeg.orientationIndex(other._upwardSeg)
if (orientIndex !== 0) return orientIndex
orientIndex = -1 * other._upwardSeg.orientationIndex(this._upwardSeg)
if (orientIndex !== 0) return orientIndex
return this._upwardSeg.compareTo(other._upwardSeg)
}
compareX(seg0, seg1) {
const compare0 = seg0.p0.compareTo(seg1.p0)
if (compare0 !== 0) return compare0
return seg0.p1.compareTo(seg1.p1)
}
toString() {
return this._upwardSeg.toString()
}
get interfaces_() {
return [Comparable]
}
}
SubgraphDepthLocater.DepthSegment = DepthSegment