UNPKG

tui-calendar

Version:
341 lines (288 loc) 7.72 kB
/** * @fileoverview * Class for represent two dimensional x, y coordinates. * * It suppliy a group of functions for manipulate coordinates. * @author NHN FE Development Lab <dl_javascript@nhn.com> * @example * var p = point(10, 10); * var r1 = p.add(Point(5, 5)); * console.log(p.toString()) // "Point(10, 10)" * console.log(r1.toString()) // "Point(15, 15)" * * var p2 = new Point(10, 10); * p2._add(point(5, 5)); * console.log(p2.toString()) // "Point(15, 15)" */ 'use strict'; var util = require('tui-code-snippet'); /** * Class for represent two dimentional x, y coordinates. * @constructor * @param {number} x The number of X coordinates. * @param {number} y The number of Y coordinates. * @param {boolean} [useRound=false] set true when each coordinates are rounded before initialize. * @example * var t = new Point(13, 5); */ function Point(x, y, useRound) { /** * @type {number} */ this.x = (useRound ? Math.round(x) : x); /** * @type {number} */ this.y = (useRound ? Math.round(y) : y); } /********** * static props **********/ /** * Calculate point ratio. * @param {Point} point The instance of point. * @param {number} factor From factor * @param {number} toFactor To factor * @returns {Point} Point instance calculated. */ Point.getRatio = function(point, factor, toFactor) { if (factor === toFactor) { return point.clone(); } return point.multiplyBy(toFactor)._divideBy(factor); }; /** * Syntatic sugar of new Point() * @param {(Point|number|number[])} x X coordinate value. * @param {(number|boolean)} [y] Y coordinate value or boolean value for coordinates round. * @param {boolean} [useRound] Set true then round initial coordinate values. * @returns {Point} The instance of point. * @example * var p1 = point(10, 15); * var p2 = point([10, 15]); */ Point.n = function(x, y, useRound) { if (x instanceof Point) { return x; } if (util.isArray(x)) { return new Point(x[0], x[1], y); } return new Point(x, y, useRound); }; /********** * prototype props **********/ /** * Clone points * @returns {Point} The point instance cloned. */ Point.prototype.clone = function() { return new Point(this.x, this.y); }; /** * Add points. * @param {Point} point The point instance to add. * @returns {Point} Point calculated. */ Point.prototype.add = function(point) { return this.clone()._add(Point.n(point)); }; /** * Add self points. * @param {Point} point The point instance to add. * @returns {Point} Point calculated. */ Point.prototype._add = function(point) { this.x += point.x; this.y += point.y; return this; }; /** * Subtract points. * @param {Point} point The point instance to subtract. * @returns {Point} Point calculated. */ Point.prototype.subtract = function(point) { return this.clone()._subtract(Point.n(point)); }; /** * Subtract points. (manipulate self) * @param {Point} point The point instance to subtract. * @returns {Point} Point calculated. */ Point.prototype._subtract = function(point) { this.x -= point.x; this.y -= point.y; return this; }; /** * Divide points. * @param {number} num The number to divide. * @returns {Point} Point calculated. */ Point.prototype.divideBy = function(num) { return this.clone()._divideBy(num); }; /** * Divide points. (manipulate self) * @param {number} num The number to divide. * @returns {Point} Point calculated. */ Point.prototype._divideBy = function(num) { this.x /= num; this.y /= num; return this; }; /** * Multiply coordinates. * @param {number} num Thyen number to multiply * @returns {Point} Point calculated. */ Point.prototype.multiplyBy = function(num) { return this.clone()._multiplyBy(num); }; /** * Multiply self coordinates. * @param {number} num The number to multiply. * @returns {Point} Point calculated. */ Point.prototype._multiplyBy = function(num) { this.x *= num; this.y *= num; return this; }; /** * Round coordinates. * @returns {Point} Point calculated. */ Point.prototype.round = function() { return this.clone()._round(); }; /** * Round self coordinates. * @returns {Point} Point calculated. */ Point.prototype._round = function() { this.x = Math.round(this.x); this.y = Math.round(this.y); return this; }; /** * Reverse values between positive and negative. * @returns {Point} Point calculated. */ Point.prototype.reverse = function() { return this.clone()._reverse(); }; /** * Reverse self values between positive and negative. * @returns {Point} Point calculated. */ Point.prototype._reverse = function() { this.x *= -1; this.y *= -1; return this; }; /** * Floor coordinates. * @returns {Point} Point calculated. */ Point.prototype.floor = function() { return this.clone()._floor(); }; /** * Floor self coordinates. * @returns {Point} Point calculated. */ Point.prototype._floor = function() { this.x = Math.floor(this.x); this.y = Math.floor(this.y); return this; }; /** * Ceil coordinates. * @returns {Point} Point calculated. */ Point.prototype.ceil = function() { return this.clone()._ceil(); }; /** * Ceil self coordinates. * @returns {Point} Point calculated. */ Point.prototype._ceil = function() { this.x = Math.ceil(this.x); this.y = Math.ceil(this.y); return this; }; /** * Rotate point. * @param {number} deg The number of rotate degree. * @param {Point} [center=this] Center point instance to use rotate center. use own when not supplied. * @param {number} [cos] Cosine values for rotate. it useful when multi point rotate. * @param {number} [sin] Sine values for rotate. it useful when multi point rotate. * @returns {Point} The point instance rotated. */ Point.prototype.rotate = function(deg, center, cos, sin) { return this.clone()._rotate(deg, center, cos, sin); }; /** * Rotate self. * @param {number} deg The number of rotate degree. * @param {Point} [center=this] Center point instance to use rotate center. use own when not supplied. * @param {number} [cos] Cosine values for rotate. it useful when multi point rotate. * @param {number} [sin] Sine values for rotate. it useful when multi point rotate. * @returns {Point} The point instance rotated. */ Point.prototype._rotate = function(deg, center, cos, sin) { var rad = deg * (Math.PI / 180), x, y; cos = cos || parseFloat(Math.cos(rad).toFixed(8)); sin = sin || parseFloat(Math.sin(rad).toFixed(8)); this._subtract(center); x = this.x; y = this.y; this.x = (x * cos) - (y * sin); this.y = (x * sin) + (y * cos); this._add(center); return this; }; /** * Calculate distance between two points. * @param {Point} point Point instance. * @returns {number} The number of distance between two points. */ Point.prototype.distanceTo = function(point) { var x, y; point = Point.n(point); x = point.x - this.x; y = point.y - this.y; return Math.sqrt((x * x) + (y * y)); }; /** * Check point equals. * @param {Point} point Point instance to compare * @returns {boolean} equality */ Point.prototype.equals = function(point) { point = Point.n(point); return point.x === this.x && point.y === this.y; }; /** * Return formatted string. 'Point(x, y)' * @returns {string} string */ Point.prototype.toString = function() { return 'Point(' + this.x + ', ' + this.y + ')'; }; /** * Return coordinates to array. [x, y] * @returns {number[]} coordinate array. */ Point.prototype.toArray = function() { return [this.x, this.y]; }; module.exports = Point;