ts-useful
Version:
Functions for animation, color transitions, ecliptic, bezier, decasteljau, curves, three dimensional curves, smooth scrolling, random range, randomItem, mobius index, vectors, physics vectors, and easing.
108 lines • 3.23 kB
JavaScript
import { ClampAngle } from './clampAngle';
import { tau } from './constants';
export class Ecliptic {
}
Ecliptic.deadXY = { x: 0, y: 0 };
Ecliptic.deg2Rad = tau / 360;
/**
*
* @param count number
* @returns number
*/
Ecliptic.EqualRadians = (count) => tau / count;
/**
*
* @param count number
* @returns number
*/
Ecliptic.EqualDegrees = (count) => 360 / count;
/**
*
* @param radian number
* @returns number
*/
Ecliptic.ToDegree = (radian) => (radian >= 0 ? radian : (tau + radian)) * 360 / tau;
/**
*
* @param degree number
* @returns number
*/
Ecliptic.ToRadian = (degree) => degree * Ecliptic.deg2Rad;
Ecliptic.surroundDefaults = (options) => {
options ?? (options = {});
const { spacing, amplitudeX, amplitudeY } = options;
const equal = typeof (spacing) === 'undefined';
let { distance, degree } = options;
distance ?? (distance = 0);
degree ?? (degree = 0);
return { distance, degree, spacing, equal, amplitudeX, amplitudeY };
};
/**
*
* @param origin coordinate
* @param target coordinate
* @returns number
*/
Ecliptic.Radian = (origin, target) => {
const [dx, dy] = [origin.x - target.x, origin.y - target.y];
return Math.atan2(dy, dx);
};
/**
*
* @param origin coordinate
* @param target coordinate
* @returns number
*/
Ecliptic.Degree = (origin, target) => {
return Ecliptic.ToDegree(Ecliptic.Radian(origin, target));
};
/**
*
* @param center HTMLElement | coordinate
* @param radius number
* @param radian number
* @returns coordinate
*/
Ecliptic.LocationByRadian = (center, radius, radian) => {
return {
x: Math.round(center.x + radius * Math.sin(radian)),
y: Math.round(center.y + radius * Math.cos(radian))
};
};
/**
*
* @param center HTMLElement | coordinate
* @param radius number
* @param degree number
* @returns coordinate
*/
Ecliptic.LocationByDegree = (center, radius, degree) => {
const radian = Ecliptic.ToRadian(ClampAngle(degree, -360, 360));
return Ecliptic.LocationByRadian(center, radius, radian);
};
/**
*
* @param center coordinate
* @param amount number
* @param options surroundOptions
* @returns coordinate[]
*/
Ecliptic.Surround = (center, amount, options) => {
const { distance, degree, equal, spacing, amplitudeX, amplitudeY } = Ecliptic.surroundDefaults(options);
const radians = Ecliptic.EqualRadians(amount);
const separation = Ecliptic.ToRadian(spacing ?? 0);
const applyAmplitude = (amplitude, originPoint, destinationPoint) => {
return typeof (amplitude) === 'undefined' ? destinationPoint : (originPoint * (1 - amplitude)) + (destinationPoint * amplitude);
};
let radian = Ecliptic.ToRadian(ClampAngle(degree, -360, 360));
const results = Array.apply(null, new Array(amount)).map((o, i) => {
const { x, y } = Ecliptic.LocationByRadian(center, distance, radian);
radian += equal ? radians : separation;
return {
x: applyAmplitude(amplitudeX, center.x, x),
y: applyAmplitude(amplitudeY, center.y, y)
};
});
return results;
};
//# sourceMappingURL=ecliptic.js.map