import {mat3} from 'gl-matrix'; // Computes the transformation matrix that is used to render scaled // elements to the DOM and draw the view. export class TraceView { public x: number; public y: number; public width: number; public height: number; constructor(x: number, y: number, width: number, height: number) { this.x = x; this.y = y; this.width = width; this.height = height; } static From(view: TraceView): TraceView { return new TraceView(view.x, view.y, view.width, view.height); } static Empty(): TraceView { return new TraceView(0, 0, 1000, 1); } serialize() { return [this.x, this.y, this.width, this.height]; } between(to: TraceView): mat3 { return mat3.fromValues( to.width / this.width, 0, 0, to.height / this.height, 0, 0, to.x - this.x * (to.width / this.width), to.y - this.y * (to.height / this.height), 1 ); } transform(mat: mat3): [number, number, number, number] { const x = this.x * mat[0] + this.y * mat[3] + mat[6]; const y = this.x * mat[1] + this.y * mat[4] + mat[7]; const width = this.width * mat[0] + this.height * mat[3]; const height = this.width * mat[1] + this.height * mat[4]; return [x, y, width, height]; } get center() { return this.x + this.width / 2; } get left() { return this.x; } get right() { return this.x + this.width; } get top() { return this.y; } get bottom() { return this.y + this.height; } }