import * as Number from 'util/number' import * as Size from 'model/size' export interface Vec2 { x: number, y: number, } export const zero: Vec2 = { x: 0, y: 0, } export function equals(v1: Vec2, v2: Vec2): boolean { return v1.x === v2.x && v1.y === v2.y } export function length(v: Vec2): number { return Math.sqrt(v.x ** 2 + v.y ** 2) } export function normalize(v: Vec2): Vec2 { if (v.x === 0 && v.y === 0) { return zero } else { const im = 1 / length(v) return { x: v.x * im, y: v.y * im } } } export function applyOnLength(f: (n: number) => number, v: Vec2): Vec2 { return scale(normalize(v), f(length(v))) } export function sub(v1: Vec2, v2: Vec2): Vec2 { return { x: v1.x - v2.x, y: v1.y - v2.y } } export function div(v: Vec2, k: number): Vec2 { return { x: v.x / k, y: v.y / k } } export function add(v1: Vec2, v2: Vec2): Vec2 { return { x: v1.x + v2.x, y: v1.y + v2.y } } export function scale(v: Vec2, k: number): Vec2 { return { x: v.x * k, y: v.y * k } } export function clamp(v: Vec2, vMin: Vec2, vMax: Vec2): Vec2 { return { x: Number.clamp(v.x, vMin.x, vMax.x), y: Number.clamp(v.y, vMin.y, vMax.y) } } export function project(from: Size.Size, to: Size.Size, v: Vec2): Vec2 { return { x: v.x / from.width * to.width, y: v.y / from.height * to.height } }