diff options
Diffstat (limited to 'src/model/vec2.ts')
-rw-r--r-- | src/model/vec2.ts | 73 |
1 files changed, 68 insertions, 5 deletions
diff --git a/src/model/vec2.ts b/src/model/vec2.ts index 4bec53d..46ffc7e 100644 --- a/src/model/vec2.ts +++ b/src/model/vec2.ts @@ -1,15 +1,78 @@ +import * as Number from 'util/number' +import * as Size from 'model/size' + export interface Vec2 { x: number, y: number, } -export function zero(): Vec2 { - return { - x: 0, - y: 0, - } +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 + } +} |