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
144 lines (142 loc) • 3.18 kB
JavaScript
import CGAlgorithms from '../algorithm/CGAlgorithms'
import Quadrant from '../geomgraph/Quadrant'
import Assert from '../util/Assert'
export default class HalfEdge {
constructor () {
this._orig = null
this._sym = null
this._next = null
const orig = arguments[0]
this._orig = orig
}
find (dest) {
let oNext = this
do {
if (oNext === null) return null
if (oNext.dest().equals2D(dest)) return oNext
oNext = oNext.oNext()
} while (oNext !== this)
return null
}
dest () {
return this._sym._orig
}
oNext () {
return this._sym._next
}
insert (e) {
if (this.oNext() === this) {
this.insertAfter(e)
return null
}
const ecmp = this.compareTo(e)
let ePrev = this
do {
const oNext = ePrev.oNext()
const cmp = oNext.compareTo(e)
if (cmp !== ecmp || oNext === this) {
ePrev.insertAfter(e)
return null
}
ePrev = oNext
} while (ePrev !== this)
Assert.shouldNeverReachHere()
}
insertAfter (e) {
Assert.equals(this._orig, e.orig())
const save = this.oNext()
this._sym.setNext(e)
e.sym().setNext(save)
}
degree () {
let degree = 0
let e = this
do {
degree++
e = e.oNext()
} while (e !== this)
return degree
}
equals () {
if (arguments.length === 2) {
const p0 = arguments[0]
const p1 = arguments[1]
return this._orig.equals2D(p0) && this._sym._orig.equals(p1)
}
}
deltaY () {
return this._sym._orig.y - this._orig.y
}
sym () {
return this._sym
}
prev () {
return this._sym.next()._sym
}
compareAngularDirection (e) {
const dx = this.deltaX()
const dy = this.deltaY()
const dx2 = e.deltaX()
const dy2 = e.deltaY()
if (dx === dx2 && dy === dy2) return 0
const quadrant = Quadrant.quadrant(dx, dy)
const quadrant2 = Quadrant.quadrant(dx2, dy2)
if (quadrant > quadrant2) return 1
if (quadrant < quadrant2) return -1
return CGAlgorithms.computeOrientation(e._orig, e.dest(), this.dest())
}
prevNode () {
let e = this
while (e.degree() === 2) {
e = e.prev()
if (e === this) return null
}
return e
}
compareTo (obj) {
const e = obj
const comp = this.compareAngularDirection(e)
return comp
}
next () {
return this._next
}
setSym (e) {
this._sym = e
}
orig () {
return this._orig
}
toString () {
return 'HE(' + this._orig.x + ' ' + this._orig.y + ', ' + this._sym._orig.x + ' ' + this._sym._orig.y + ')'
}
setNext (e) {
this._next = e
}
init (e) {
this.setSym(e)
e.setSym(this)
this.setNext(e)
e.setNext(this)
}
deltaX () {
return this._sym._orig.x - this._orig.x
}
interfaces_ () {
return []
}
getClass () {
return HalfEdge
}
static init (e0, e1) {
if (e0._sym !== null || e1._sym !== null || e0._next !== null || e1._next !== null) throw new Error('Edges are already initialized')
e0.init(e1)
return e0
}
static create (p0, p1) {
const e0 = new HalfEdge(p0)
const e1 = new HalfEdge(p1)
e0.init(e1)
return e0
}
}