angles
Version:
A function collection for working with angles
151 lines (88 loc) • 4.1 kB
Markdown
# Angles.js
[](https://npmjs.org/package/angles "View this project on npm")
[](http://opensource.org/licenses/MIT)
Angles.js is a collection of functions to work with angles. The aim is to have a fast and correct library, which can effortlessly convert between different units and can seamlessly work within different units. The result is a static library, which works on a configurable scale.
## Examples
```javascript
var angles = require('angles');
angles.SCALE = 360;
console.log(angles.normalize(365)); // 5
console.log(angles.normalize(-365)); // 355
```
Simply calculate the linear interpolation of the smaller angle.
```javascript
var a = -30; // 330°
var b = 30;
var pct = 0.5; // Percentage between a and b
angles.SCALE = 360;
var dir = angles.shortestDirection(a, b); // -1 => Rotate CCW
console.log(angles.lerp(a, b, pct, dir)); // => 0
```
Having the scale configurable opens a lot of possibilities, like calculating clock-angles:
```javascript
angles.SCALE = 60;
var time = new Date;
var s = time.getSeconds();
var m = time.getMinutes();
var h = time.getHours() / 23 * 59;
console.log(angles.between(s, m, h)); // true or false, if seconds clockhand is between the minutes and hours clockhand
```
## Functions
### normalizeHalf(n)
Normalizes an angle to be in the interval [-180, 180), if `SCALE` is 360 or [-π, π) if `SCALE` is 2π.
### normalize(n)
Normalizes an angle to be in the interval [0, 360), if `SCALE` is 360 or [0, 2π) if `SCALE` is 2π.
### shortestDirection(from, to)
Determines what the shortest rotation direction is to go from one angle to another. The result is positive if it's clock-wise.
### between(n, a, b)
Determines if an angle `n` is between two other angles `a, b`. The angles don't have to be normalized.
### equals(a, b)
Determines if two angles `a` and `b` are equal.
### diff(a, b)
Calculates the angular difference between two angles
### lerp(a, b, p[, dir=-1])
Calculates the linear interpolation of two angles
### distance(a, b)
Calculate the minimal distance between two angles
### toRad(n)
Calculate radians from current angle (Unit 2PI)
### toDeg(n)
Calculate degrees from current angle (Unit 360)
### toGon(n)
Calculate gons from current angle (Unit 400)
### fromSlope(p1, p2)
Calculates the angle between the x-axis and the line formed by two points.
### fromSinCos(sin, cos)
Calculates the original angle (in full resolution) based on the sine and co-sine of the angle.
### quadrant(x, y[k=4[, shift=0]])
Calculates the quadrant (with `k=4`, or octant with `k=8`) in which a point with coordinates `x,y` falls. Optionally, the coordinate system can be rotated with the `shift` parameter, which follows the `SCALE`-attribute. A positive value rotates counter-clockwise.
### compass(angle)
Translates the angle to a point of the compass ("N", "NE", "E", "SE", "S", "SW", "W", "NW") in the normal windrose way (N=0, E=90, S=180, W=270). If you want to want to have the major directions only, remove every second element from the array `DIRECTIONS`.
## Installation
Installing Angles.js is as easy as cloning this repo or use one of the following command:
```
npm install angles
```
## Using Angles.js with the browser
```html
<script src="angles.min.js"></script>
<script>
console.log(Angles.normalize(128));
</script>
```
## Coding Style
As every library I publish, Angles.js is also built to be as small as possible after compressing it with Google Closure Compiler in advanced mode. Thus the coding style orientates a little on maxing-out the compression rate. Please make sure you keep this style if you plan to extend the library.
## Building the library
After cloning the Git repository run:
```
npm install
npm run build
```
## Run a test
Testing the source against the shipped test suite is as easy as
```
npm run test
```
## Copyright and Licensing
Copyright (c) 2025, [Robert Eisele](https://raw.org/)
Licensed under the MIT license.