UNPKG

atum

Version:

A Procedural Graph Based Javascript Library

306 lines (283 loc) 7.9 kB
"use strict"; import seedRandom from "seedRandom"; import Vector from "../geometry/Vector"; class Rand { /** * Wrapper library for David Bau's seeded random number generator which is a * wrapper for the Math.rand() functionality. This library is implemented to * fill out the functionality of the random capabilities as well as build * on the capabilities existing in the framework currently. This class can * be used on a global or local scale. * * @example * Rand.seedRandom(0); // Set the global seed * Rand.rand(); // Predictable based off seed * * @example * var rng = new Rand(0); // Set the local rng seed * rng.rand(); // Predictable based off seed * * Rand.rand(); // Unpredictable since global seed is not set * * @see {@link https://github.com/davidbau/seedrandom} * @param {number|string} [seed=0] The seed to be applied to the local * random number generator * @class Rand */ constructor(seed = 0) { this.rng = seedRandom(seed); } /** * Set the global seed for the seeded random number generator. After the seed has been * set. The random numbers will be predictable and repeatable given the same * input seed. If no seed is specified, then a random seed will be assigned to * the random number generator using added system entropy. * * @export * @param {number|string} [seed=0] The seed to be applied to the global * random number generator * @memberof Rand */ static setSeed(seed = 0) { const options = { global: true, entropy: seed === undefined }; seedRandom(seed, options); } /** * Set the seed for the seeded random number generator. After the seed has been * set. The random numbers will be predictable and repeatable given the same * input seed. If no seed is specified, then a random seed will be assigned to * the random number generator using added system entropy. * * @export * @param {number|string} [seed=0] The seed to be applied to the RNG * * @memberof Rand */ setSeed(seed) { const options = { entropy: seed === undefined }; this.rng = seedRandom(seed, options); } /** * Get a random number from 0 to 1. * * @static * @returns {number} random number from 0 to 1 * * @memberof Rand */ static rand() { return Math.random(); } /** * Get a random number from 0 to 1. * * @returns {number} random number from 0 to 1 * * @memberof Rand */ rand() { return this.rng(); } /** * Private Helper Function: * Get a random float value in a particular range * * @private * @static * @param {any} rng The local or global rng to use (Rand or this) * @param {any} min * @param {any} max * * @memberof Rand */ static _randRange(rng, min, max) { return rng.rand() * (max - min) + min; } /** * Get a random float value in a particular range * * @static * @param {any} min * @param {any} max * @returns {number} Random float number from min (inclusive) * to max (exclusive) * * @memberof Rand */ static randRange(min, max) { return Rand._randRange(Rand, min, max); } /** * Get a random float value in a particular range * * @param {any} min * @param {any} max * @returns {number} Random float number from min (inclusive) * to max (exclusive) * * @memberof Rand */ randRange(min, max) { return Rand._randRange(this, min, max); } /** * Private Helper Function: * Get a random int in a particular range (min and max inclusive) * * @private * @static * @param {any} rng The local or global rng to use (Rand or this) * @param {any} min * @param {any} max * @returns {number} Random float number from min (inclusive) * to max (exclusive) * * @memberOf Rand */ static _randInt(rng, min, max) { return Math.floor(rng.rand() * (max - min + 1)) + min; } /** * Get a random int in a particular range (min and max inclusive) * * @static * @param {any} min * @param {any} max * @returns {number} Random float number from min (inclusive) * to max (exclusive) * * @memberOf Rand */ static randInt(min, max) { return Rand._randInt(Rand, min, max); } /** * Get a random int in a particular range (min and max inclusive) * * @param {any} min * @param {any} max * @returns {number} Random float number from min (inclusive) * to max (exclusive) * * @memberOf Rand */ randInt(min, max) { return Rand._randInt(this, min, max); } /** * Private Helper Function: * Get the random hex value of a color represented in the hexidecimal format * * @private * @static * @param {any} rng The local or global rng to use (Rand or this) * @returns {hex} The random hex value in the color spectrum * * @memberOf Rand */ static _randHex(rng) { return rng.randInt(0, 16777215); } /** * Get the random hex value of a color represented in the hexidecimal format * * @static * @returns {hex} * * @memberOf Rand */ static randHex() { return Rand._randHex(Rand); } /** * Get the random hex value of a color represented in the hexidecimal format * * @returns {hex} * * @memberOf Rand */ randHex() { return Rand._randHex(this); } /** * Private Helper Function: * Get a random hex color string represented in "#HEXSTR" format * * @private * @static * @param {any} rng The local or global rng to use (Rand or this) * @returns {string} * * @memberOf Rand */ static _randHexColor(rng) { return "#" + rng.randHex().toString(16); } /** * Get a random hex color string represented in "#HEXSTR" format * * @static * @returns {string} * * @memberOf Rand */ static randHexColor() { return Rand._randHexColor(Rand); } /** * Get a random hex color string represented in "#HEXSTR" format * * @static * @returns {string} * * @memberOf Rand */ randHexColor() { return Rand._randHexColor(this); } //---- Random Geometry ---- /** * Get a random vector in a bounding box * * @private * @static * @param {any} rng The local or global rng to use (Rand or this) * @param {Rectangle} bbox The bounding box of the random vector * @returns {Vector} A random vector * * @memberOf Rand */ static _vector(rng, bbox) { return new Vector(Rand.randRange(bbox.x, bbox.x + bbox.width), Rand.randRange(bbox.y, bbox.y + bbox.height)); } /** * Get a random vector in a bounding box * * @static * @param {Rectangle} bbox The bounding box of the random vector * @returns {Vector} A random vector * * @memberOf Rand */ static vector(bbox) { return Rand._vector(Rand, bbox); } /** * Get a random vector in a bounding box * * @param {Rectangle} bbox The bounding box of the random vector * @returns {Vector} A random vector * * @memberOf Rand */ vector(bbox) { return Rand._vector(this, bbox); } } export default Rand;