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
98 lines (93 loc) • 2.73 kB
JavaScript
import Orientation from './Orientation'
export default class Angle {
static toDegrees(radians) {
return radians * 180 / Math.PI
}
static normalize(angle) {
while (angle > Math.PI) angle -= Angle.PI_TIMES_2
while (angle <= -Math.PI) angle += Angle.PI_TIMES_2
return angle
}
static angle() {
if (arguments.length === 1) {
const p = arguments[0]
return Math.atan2(p.y, p.x)
} else if (arguments.length === 2) {
const p0 = arguments[0], p1 = arguments[1]
const dx = p1.x - p0.x
const dy = p1.y - p0.y
return Math.atan2(dy, dx)
}
}
static isAcute(p0, p1, p2) {
const dx0 = p0.x - p1.x
const dy0 = p0.y - p1.y
const dx1 = p2.x - p1.x
const dy1 = p2.y - p1.y
const dotprod = dx0 * dx1 + dy0 * dy1
return dotprod > 0
}
static isObtuse(p0, p1, p2) {
const dx0 = p0.x - p1.x
const dy0 = p0.y - p1.y
const dx1 = p2.x - p1.x
const dy1 = p2.y - p1.y
const dotprod = dx0 * dx1 + dy0 * dy1
return dotprod < 0
}
static interiorAngle(p0, p1, p2) {
const anglePrev = Angle.angle(p1, p0)
const angleNext = Angle.angle(p1, p2)
return Math.abs(angleNext - anglePrev)
}
static normalizePositive(angle) {
if (angle < 0.0) {
while (angle < 0.0) angle += Angle.PI_TIMES_2
if (angle >= Angle.PI_TIMES_2) angle = 0.0
} else {
while (angle >= Angle.PI_TIMES_2) angle -= Angle.PI_TIMES_2
if (angle < 0.0) angle = 0.0
}
return angle
}
static angleBetween(tip1, tail, tip2) {
const a1 = Angle.angle(tail, tip1)
const a2 = Angle.angle(tail, tip2)
return Angle.diff(a1, a2)
}
static diff(ang1, ang2) {
let delAngle = null
if (ang1 < ang2)
delAngle = ang2 - ang1
else
delAngle = ang1 - ang2
if (delAngle > Math.PI)
delAngle = 2 * Math.PI - delAngle
return delAngle
}
static toRadians(angleDegrees) {
return angleDegrees * Math.PI / 180.0
}
static getTurn(ang1, ang2) {
const crossproduct = Math.sin(ang2 - ang1)
if (crossproduct > 0)
return Angle.COUNTERCLOCKWISE
if (crossproduct < 0)
return Angle.CLOCKWISE
return Angle.NONE
}
static angleBetweenOriented(tip1, tail, tip2) {
const a1 = Angle.angle(tail, tip1)
const a2 = Angle.angle(tail, tip2)
const angDel = a2 - a1
if (angDel <= -Math.PI) return angDel + Angle.PI_TIMES_2
if (angDel > Math.PI) return angDel - Angle.PI_TIMES_2
return angDel
}
}
Angle.PI_TIMES_2 = 2.0 * Math.PI
Angle.PI_OVER_2 = Math.PI / 2.0
Angle.PI_OVER_4 = Math.PI / 4.0
Angle.COUNTERCLOCKWISE = Orientation.COUNTERCLOCKWISE
Angle.CLOCKWISE = Orientation.CLOCKWISE
Angle.NONE = Orientation.COLLINEAR