export class Vector2D { private _x: number; private _y: number; constructor(x = 0, y = 0) { this._x = x; this._y = y; } public get x(): number { return this._x; } public get y(): number { return this._y; } public plus(other: Vector2D): Vector2D { return new Vector2D(this._x + other._x, this._y + other._y); } public minus(other: Vector2D): Vector2D { return new Vector2D(this._x - other._x, this._y - other._y); } } export class Rectangle { private _corner_1: Vector2D; private _corner_2: Vector2D; constructor(corner_1: Vector2D, corner_2: Vector2D) { this._corner_1 = corner_1; this._corner_2 = corner_2; } public get origin(): Vector2D { return this._corner_1; } public get left(): number { return this.origin.x; } public get top(): number { return this.origin.y; } public get corner(): Vector2D { return this._corner_2; } public get size(): Vector2D { return this._corner_2.minus(this._corner_1); } public get width(): number { return this.size.x; } public get height(): number { return this.size.y; } public get area(): number { return this.width * this.height; } public normalize(): Rectangle { let left = this.left; let top = this.top; let width = this.width; let height = this.height; if (width < 0) { width *= -1; left -= width; } if (height < 0) { height *= -1; top -= height; } const corner_tl = new Vector2D(left, top); const size = new Vector2D(width, height); return new Rectangle(corner_tl, corner_tl.plus(size)); } }