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

106 lines (104 loc) 2.96 kB
import CGAlgorithms from './CGAlgorithms' export default class Angle { interfaces_ () { return [] } getClass () { return 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] const 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 } static get PI_TIMES_2 () { return 2.0 * Math.PI } static get PI_OVER_2 () { return Math.PI / 2.0 } static get PI_OVER_4 () { return Math.PI / 4.0 } static get COUNTERCLOCKWISE () { return CGAlgorithms.COUNTERCLOCKWISE } static get CLOCKWISE () { return CGAlgorithms.CLOCKWISE } static get NONE () { return CGAlgorithms.COLLINEAR } }