| import { MatrixArray } from './matrix'; | 
|   | 
| export interface PointLike { | 
|     x: number | 
|     y: number | 
| } | 
| export default class Point { | 
|   | 
|     x: number | 
|   | 
|     y: number | 
|   | 
|     constructor(x?: number, y?: number) { | 
|         this.x = x || 0; | 
|         this.y = y || 0; | 
|     } | 
|   | 
|     /** | 
|      * Copy from another point | 
|      */ | 
|     copy(other: PointLike) { | 
|         this.x = other.x; | 
|         this.y = other.y; | 
|         return this; | 
|     } | 
|   | 
|     /** | 
|      * Clone a point | 
|      */ | 
|     clone() { | 
|         return new Point(this.x, this.y); | 
|     } | 
|   | 
|     /** | 
|      * Set x and y | 
|      */ | 
|     set(x: number, y: number) { | 
|         this.x = x; | 
|         this.y = y; | 
|         return this; | 
|     } | 
|   | 
|     /** | 
|      * If equal to another point | 
|      */ | 
|     equal(other: PointLike) { | 
|         return other.x === this.x && other.y === this.y; | 
|     } | 
|   | 
|     /** | 
|      * Add another point | 
|      */ | 
|     add(other: PointLike) { | 
|         this.x += other.x; | 
|         this.y += other.y; | 
|         return this; | 
|     } | 
|   | 
|     scale(scalar: number) { | 
|         this.x *= scalar; | 
|         this.y *= scalar; | 
|     } | 
|   | 
|     scaleAndAdd(other: PointLike, scalar: number) { | 
|         this.x += other.x * scalar; | 
|         this.y += other.y * scalar; | 
|     } | 
|   | 
|     /** | 
|      * Sub another point | 
|      */ | 
|     sub(other: PointLike) { | 
|         this.x -= other.x; | 
|         this.y -= other.y; | 
|         return this; | 
|     } | 
|   | 
|     /** | 
|      * Dot product with other point | 
|      */ | 
|     dot(other: PointLike) { | 
|         return this.x * other.x + this.y * other.y; | 
|     } | 
|   | 
|     /** | 
|      * Get length of point | 
|      */ | 
|     len() { | 
|         return Math.sqrt(this.x * this.x + this.y * this.y); | 
|     } | 
|   | 
|     /** | 
|      * Get squared length | 
|      */ | 
|     lenSquare() { | 
|         return this.x * this.x + this.y * this.y; | 
|     } | 
|   | 
|     /** | 
|      * Normalize | 
|      */ | 
|     normalize() { | 
|         const len = this.len(); | 
|         this.x /= len; | 
|         this.y /= len; | 
|         return this; | 
|     } | 
|   | 
|     /** | 
|      * Distance to another point | 
|      */ | 
|     distance(other: PointLike) { | 
|         const dx = this.x - other.x; | 
|         const dy = this.y - other.y; | 
|         return Math.sqrt(dx * dx + dy * dy); | 
|     } | 
|   | 
|     /** | 
|      * Square distance to another point | 
|      */ | 
|     distanceSquare(other: Point) { | 
|         const dx = this.x - other.x; | 
|         const dy = this.y - other.y; | 
|         return dx * dx + dy * dy; | 
|     } | 
|   | 
|     /** | 
|      * Negate | 
|      */ | 
|     negate() { | 
|         this.x = -this.x; | 
|         this.y = -this.y; | 
|         return this; | 
|     } | 
|   | 
|     /** | 
|      * Apply a transform matrix array. | 
|      */ | 
|     transform(m: MatrixArray) { | 
|         if (!m) { | 
|             return; | 
|         } | 
|         const x = this.x; | 
|         const y = this.y; | 
|         this.x = m[0] * x + m[2] * y + m[4]; | 
|         this.y = m[1] * x + m[3] * y + m[5]; | 
|         return this; | 
|     } | 
|   | 
|     toArray(out: number[]) { | 
|         out[0] = this.x; | 
|         out[1] = this.y; | 
|         return out; | 
|     } | 
|   | 
|     fromArray(input: number[]) { | 
|         this.x = input[0]; | 
|         this.y = input[1]; | 
|     } | 
|   | 
|     static set(p: PointLike, x: number, y: number) { | 
|         p.x = x; | 
|         p.y = y; | 
|     } | 
|   | 
|     static copy(p: PointLike, p2: PointLike) { | 
|         p.x = p2.x; | 
|         p.y = p2.y; | 
|     } | 
|   | 
|     static len(p: PointLike) { | 
|         return Math.sqrt(p.x * p.x + p.y * p.y); | 
|     } | 
|   | 
|     static lenSquare(p: PointLike) { | 
|         return p.x * p.x + p.y * p.y; | 
|     } | 
|   | 
|     static dot(p0: PointLike, p1: PointLike) { | 
|         return p0.x * p1.x + p0.y * p1.y; | 
|     } | 
|   | 
|     static add(out: PointLike, p0: PointLike, p1: PointLike) { | 
|         out.x = p0.x + p1.x; | 
|         out.y = p0.y + p1.y; | 
|     } | 
|   | 
|     static sub(out: PointLike, p0: PointLike, p1: PointLike) { | 
|         out.x = p0.x - p1.x; | 
|         out.y = p0.y - p1.y; | 
|     } | 
|   | 
|     static scale(out: PointLike, p0: PointLike, scalar: number) { | 
|         out.x = p0.x * scalar; | 
|         out.y = p0.y * scalar; | 
|     } | 
|   | 
|     static scaleAndAdd(out: PointLike, p0: PointLike, p1: PointLike, scalar: number) { | 
|         out.x = p0.x + p1.x * scalar; | 
|         out.y = p0.y + p1.y * scalar; | 
|     } | 
|   | 
|     static lerp(out: PointLike, p0: PointLike, p1: PointLike, t: number) { | 
|         const onet = 1 - t; | 
|         out.x = onet * p0.x + t * p1.x; | 
|         out.y = onet * p0.y + t * p1.y; | 
|     } | 
| } |