Last active
May 29, 2019 19:47
-
-
Save sbrl/d7ff700d3ca57ab5d52ec12a1ee8b8a0 to your computer and use it in GitHub Desktop.
[Rectangle.mjs] A port of a recent Rectangle class I wrote in C# to an ES6 module. Requires my earlier Vector class. #microlibrary
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| "use strict"; | |
| import Vector from './Vector2.mjs'; | |
| /** | |
| * Represents a rectangle in 2D space. | |
| * @source https://gist.github.com/d7ff700d3ca57ab5d52ec12a1ee8b8a0 | |
| * Changelog: | |
| * 29th May 2019 | |
| * Created this changelog | |
| * Added setters to TopLeft, Top, Size, etc. | |
| */ | |
| class Rectangle | |
| { | |
| /** | |
| * The top-left corner of the rectangle. | |
| * @returns {Vector} | |
| */ | |
| get TopLeft() { | |
| return new Vector(this.x, this.y); | |
| } | |
| /** | |
| * Sets the top-left corner of the rectangle. | |
| * @param {Vector} point The point to set it to. | |
| */ | |
| set TopLeft(point) { | |
| this.x = point.x; | |
| this.y = point.y; | |
| } | |
| /** | |
| * The top-right corner of the rectangle. | |
| * @returns {Vector} | |
| */ | |
| get TopRight() { | |
| return new Vector(this.x + this.width, this.y); | |
| } | |
| /** | |
| * Sets the top-right corner of the rectangle. | |
| * @param {Vector} point The point to set it to. | |
| */ | |
| set TopRight(point) { | |
| this.width = point.x - this.x; | |
| this.y = point.y; | |
| } | |
| /** | |
| * The bottom-left corner of the rectangle. | |
| * @returns {Vector} | |
| */ | |
| get BottomLeft() { | |
| return new Vector(this.x, this.y + this.height); | |
| } | |
| /** | |
| * Sets the bottom-left corner of the rectangle. | |
| * @param {Vector} point The point to set it to. | |
| */ | |
| set BottomLeft(point) { | |
| this.width = point.x; | |
| this.y = point.y - this.y; | |
| } | |
| /** | |
| * The bottom-right corner of the rectangle. | |
| * @returns {Vector} | |
| */ | |
| get BottomRight() { | |
| return new Vector(this.x + this.width, this.y + this.height); | |
| } | |
| /** | |
| * Sets the bottom-right corner of the rectangle. | |
| * @param {Vector} point The point to set it to. | |
| */ | |
| set BottomRight(point) { | |
| this.width = point.x - this.x; | |
| this.y = point.y - this.y; | |
| } | |
| /** | |
| * The centre of the rectangle. | |
| * @returns {Vector} | |
| */ | |
| get Centre() { | |
| return new Vector( | |
| this.x + (this.width/2), | |
| this.y + (this.height/2) | |
| ); | |
| } | |
| /** | |
| * The Y coordinate of the top of the rectangle. | |
| * @returns {Number} | |
| */ | |
| get Top() { | |
| return this.y; | |
| } | |
| /** | |
| * Sets the Y coordinate of the top of the rectangle. | |
| * @param {Number} y | |
| */ | |
| set Top(y) { | |
| this.y = y; | |
| } | |
| /** | |
| * The Y coordinate of the bottom of the rectangle. | |
| * @returns {Number} | |
| */ | |
| get Bottom() { | |
| return this.y + this.height; | |
| } | |
| /** | |
| * Sets the Y coordinate of the bottom of the rectangle. | |
| * @param {Number} y | |
| */ | |
| set Bottom(y) { | |
| this.height = y - this.y; | |
| } | |
| /** | |
| * The X coordinate of the left side of the rectangle. | |
| * @returns {Number} | |
| */ | |
| get Left() { | |
| return this.x; | |
| } | |
| /** | |
| * Sets the X coordinate of the left of the rectangle. | |
| * @param {Number} x | |
| */ | |
| set Left(x) { | |
| this.x = x; | |
| } | |
| /** | |
| * The X coordinate of the right side of the rectangle. | |
| * @returns {Number} | |
| */ | |
| get Right() { | |
| return this.x + this.width; | |
| } | |
| /** | |
| * Sets the X coordinate of the right of the rectangle. | |
| * @param {Number} x | |
| */ | |
| set Right(x) { | |
| this.x = x - this.x; | |
| } | |
| /** | |
| * The size of this rectangle. | |
| * @returns {Vector} | |
| */ | |
| get Size() { | |
| return new Vector(this.width, this.height); | |
| } | |
| /** | |
| * Sets the size of the rectangle. | |
| * @param {Vector} newSize The new size of the rectangle. | |
| */ | |
| set Size(newSize) { | |
| this.width = newSize.x; | |
| this.height = newSize.y; | |
| } | |
| constructor(x, y, width, height) { | |
| this.x = x; | |
| this.y = y; | |
| this.width = width; | |
| this.height = height; | |
| } | |
| /** | |
| * Moves this Rectangle by the specified vector. | |
| * @param {Vector} v The amount to move this Rectangle by. | |
| * @return {Rectangle} The current rectangle. Useful for daisy-chaining. | |
| */ | |
| move_by(v) { | |
| this.x += v.x; | |
| this.y += v.y; | |
| return this; | |
| } | |
| /** | |
| * Figures out whether this rectangle overlaps another rectangle. | |
| * @param {Rectangle} otherRectangle The other rectangle to check the overlap of. | |
| * @return {bool} Whether this rectangle overlaps another rectangle. | |
| */ | |
| overlaps(otherRectangle) | |
| { | |
| if(this.Top > otherRectangle.Bottom || | |
| this.Bottom < otherRectangle.Top || | |
| this.Left > otherRectangle.Right || | |
| this.Right < otherRectangle.Left) | |
| return false; | |
| return true; | |
| } | |
| /** | |
| * Works out whether the specified vector falls within this Rectangle. | |
| * @param {Vector} v The vector to test. | |
| * @return {Boolean} Whether the specified vector falls within this Rectangle or not. | |
| */ | |
| is_inside_vector(v) { | |
| return v.x >= this.x && v.y >= this.y && | |
| v.x <= this.Right && v.y <= this.Bottom; | |
| } | |
| /** | |
| * Works out if this Rectangle falls completely within the specified | |
| * rectangle. | |
| * @param {Rectangle} otherRectangle The other rectangle to compare against. | |
| * @return {Boolean} Whether this Rectangle faalls within the specified Rectangle. | |
| */ | |
| is_inside(otherRectangle) { | |
| if(this.Top >= otherRectangle.Top && | |
| this.Bottom <= otherRectangle.Bottom && | |
| this.Left >= otherRectangle.Left && | |
| this.Right <= otherRectangle.Right) | |
| return true; | |
| return false; | |
| } | |
| /** | |
| * Returns a copy of this rectangle that can be safely edited without affecting the original. | |
| * @returns {Rectangle} | |
| */ | |
| clone() | |
| { | |
| return new Rectangle(this.x, this.y, this.width, this.height); | |
| } | |
| toString() { | |
| return `[Rectangle @ (${this.x}, ${this.y}) ${this.width} x ${this.height}]`; | |
| } | |
| } | |
| /** | |
| * A rectangle with all it's values initalised to zero. | |
| * Don't forget to clone it before editing! | |
| * @type {Rectangle} | |
| */ | |
| Rectangle.Zero = new Rectangle(0, 0, 0, 0); | |
| export default Rectangle; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment