/**
|
|
* @prototype Range
|
|
*
|
|
* Helper class to make working with related min and max values easier.
|
|
*
|
|
* The range is inclusive; a given value is considered part of the range if:
|
|
*
|
|
* this.min <= value <= this.max
|
|
*/
|
|
function Range() {
|
|
this.min = undefined;
|
|
this.max = undefined;
|
|
}
|
|
|
|
|
|
/**
|
|
* Adjust the range so that the passed value fits in it.
|
|
*
|
|
* If the value is outside of the current extremes, adjust
|
|
* the min or max so that the value is within the range.
|
|
*
|
|
* @param {number} value Numeric value to fit in range
|
|
*/
|
|
Range.prototype.adjust = function(value) {
|
|
if (value === undefined) return;
|
|
|
|
if (this.min === undefined || this.min > value ) {
|
|
this.min = value;
|
|
}
|
|
|
|
if (this.max === undefined || this.max < value) {
|
|
this.max = value;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Adjust the current range so that the passed range fits in it.
|
|
*
|
|
* @param {Range} range Range instance to fit in current instance
|
|
*/
|
|
Range.prototype.combine = function(range) {
|
|
this.add(range.min);
|
|
this.add(range.max);
|
|
};
|
|
|
|
|
|
/**
|
|
* Expand the range by the given value
|
|
*
|
|
* min will be lowered by given value;
|
|
* max will be raised by given value
|
|
*
|
|
* Shrinking by passing a negative value is allowed.
|
|
*
|
|
* @param {number} val Amount by which to expand or shrink current range with
|
|
*/
|
|
Range.prototype.expand = function(val) {
|
|
if (val === undefined) {
|
|
return;
|
|
}
|
|
|
|
var newMin = this.min - val;
|
|
var newMax = this.max + val;
|
|
|
|
// Note that following allows newMin === newMax.
|
|
// This should be OK, since method expand() allows this also.
|
|
if (newMin > newMax) {
|
|
throw new Error('Passed expansion value makes range invalid');
|
|
}
|
|
|
|
this.min = newMin;
|
|
this.max = newMax;
|
|
};
|
|
|
|
|
|
/**
|
|
* Determine the full range width of current instance.
|
|
*
|
|
* @returns {num} The calculated width of this range
|
|
*/
|
|
Range.prototype.range = function() {
|
|
return this.max - this.min;
|
|
};
|
|
|
|
|
|
/**
|
|
* Determine the central point of current instance.
|
|
*
|
|
* @returns {number} the value in the middle of min and max
|
|
*/
|
|
Range.prototype.center = function() {
|
|
return (this.min + this.max) / 2;
|
|
};
|
|
|
|
|
|
module.exports = Range;
|