UNPKG

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.

112 lines 3.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Ecliptic = void 0; const clampAngle_1 = require("./clampAngle"); const constants_1 = require("./constants"); class Ecliptic { } exports.Ecliptic = Ecliptic; Ecliptic.deadXY = { x: 0, y: 0 }; Ecliptic.deg2Rad = constants_1.tau / 360; /** * * @param count number * @returns number */ Ecliptic.EqualRadians = (count) => constants_1.tau / count; /** * * @param count number * @returns number */ Ecliptic.EqualDegrees = (count) => 360 / count; /** * * @param radian number * @returns number */ Ecliptic.ToDegree = (radian) => (radian >= 0 ? radian : (constants_1.tau + radian)) * 360 / constants_1.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((0, clampAngle_1.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((0, clampAngle_1.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