angles
Version:
A function collection for working with angles
12 lines (10 loc) • 1.9 kB
JavaScript
/*
Angles.js v0.4.1 3/13/2025
https://github.com/rawify/Angles.js
Copyright (c) 2025, Robert Eisele (https://raw.org/)
Licensed under the MIT license.
*/
;(function(l){function e(a,b){return(a%b+b)%b}var g=2*Math.PI,k="N NE E SE S SW W NW".split(" "),h={SCALE:360,normalizeHalf:function(a){var b=this.SCALE,c=b/2;return e(a+c,b)-c},normalize:function(a){return e(a,this.SCALE)},shortestDirection:function(a,b){return a===b?0:0>this.normalizeHalf(a-b)?-1:1},between:function(a,b,c){var d=this.SCALE;a=e(a,d);b=e(b,d);c=e(c,d);return b<c?b<=a&&a<=c:b<=a||a<=c},diff:function(a,b){return Math.abs(b-a)%this.SCALE},distance:function(a,b){var c=this.SCALE,
d=c/2;a=this.normalizeHalf(a-b);a>d&&(a-=c);return Math.abs(a)},toRad:function(a){return a/this.SCALE*g},toDeg:function(a){return a/this.SCALE*360},toGon:function(a){return a/this.SCALE*400},fromSinCos:function(a,b){var c=this.SCALE;b=(1+Math.acos(b)/g)*c;0>a&&(b=c-b);return e(b,c)},fromSlope:function(a,b){return(g+Math.atan2(b[1]-a[1],b[0]-a[0]))%g/g*this.SCALE},quadrant:function(a,b,c,d){var f=this.SCALE;void 0===c&&(c=4);void 0===d&&(d=0);a=(Math.atan2(b,a)+g)/g;return 1E-10>Math.abs(a*f%(f/c))?
0:1+e(Math.floor(c*d/f+c*a),c)},compass:function(a){var b=k.length;return k[e(Math.round(a/this.SCALE*b),b)]},lerp:function(a,b,c,d){var f=this.SCALE;a=e(a,f);b=e(b,f);if(a===b)return a;d=d?1===d===a<b?d*f:0:-f;return e(a+c*(b-a-d),f)},average:function(a){var b=this.SCALE,c=a.map(d=>Math.sin(d*g/b)).reduce((d,f)=>d+f);a=a.map(d=>Math.cos(d*g/b)).reduce((d,f)=>d+f);return Math.atan2(c,a)*b/g},equals:function(a,b){var c=this.SCALE;a=e(a,c);b=e(b,c);b=Math.abs(a-b);c=Math.abs(b-2*Math.PI);return 1E-10>
b||1E-10>c}};"function"===typeof define&&define.amd?define([],function(){return h}):"object"===typeof exports?(Object.defineProperty(h,"__esModule",{value:!0}),h["default"]=h,h.Angles=h,module.exports=h):l.Angles=h})(this);