summaryrefslogtreecommitdiff
path: root/web/src/math/Rect.ts
diff options
context:
space:
mode:
Diffstat (limited to 'web/src/math/Rect.ts')
-rw-r--r--web/src/math/Rect.ts97
1 files changed, 97 insertions, 0 deletions
diff --git a/web/src/math/Rect.ts b/web/src/math/Rect.ts
new file mode 100644
index 0000000..e26fbae
--- /dev/null
+++ b/web/src/math/Rect.ts
@@ -0,0 +1,97 @@
+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,
+ );
+ }
+}