import Coord from "./Coord"; /** A rectangle on a grid whose origin is in the top left. */ export default class Rect { private readonly _topLeft: Coord; private readonly _width: number; private readonly _height: number; constructor( topLeftX: number, topLeftY: number, width: number, height: number, ) { this._topLeft = new Coord(topLeftX, topLeftY); this._width = width; this._height = height; } /** Width of this rectangle. */ get width(): number { return this._width; } /** Height of this rectangle. */ get height(): number { return this._height; } /** Coord of the top-left point of this rectangle. */ get topLeft(): Coord { return this._topLeft; } /** Coord of the bottom-right point of this rectangle. */ get bottomRight(): Coord { return new Coord( this._topLeft.x + this._width, this._topLeft.y + this._height, ); } /** Determine if this rectangle contains the point at `coord`. */ containsCoord(coord: Coord): boolean { return ( this.topLeft.x <= coord.x && coord.x <= this.bottomRight.x && this.topLeft.y <= coord.y && coord.y <= this.bottomRight.y ); } verticallyContainsCoord(coord: Coord): boolean { return this.topLeft.y <= coord.y && coord.y <= this.bottomRight.y; } horizontallyContainsCoord(coord: Coord): boolean { return this.topLeft.x <= coord.x && coord.x <= this.bottomRight.x; } extend(other: Rect): Rect { const topLeftX = Math.min( this.topLeft.x, this.bottomRight.x, other.topLeft.x, other.bottomRight.x, ); const topLeftY = Math.min( this.topLeft.y, this.bottomRight.y, other.topLeft.y, other.bottomRight.y, ); const bottomRightX = Math.max( this.topLeft.x, this.bottomRight.x, other.topLeft.x, other.bottomRight.x, ); const bottomRightY = Math.max( this.topLeft.y, this.bottomRight.y, other.topLeft.y, other.bottomRight.y, ); return new Rect( topLeftX, topLeftY, bottomRightX - topLeftX, bottomRightY - topLeftY, ); } }