import { Vec2 } from './interfaces'; export const vec2Length = ([x, y]: Vec2) => Math.abs(Math.sqrt(x * x + y * y)); export const vec2Add = ([x1, y1]: Vec2, [x2, y2]: Vec2): Vec2 => [ x1 + x2, y1 + y2, ]; export const vec2Sub = ([x1, y1]: Vec2, [x2, y2]: Vec2): Vec2 => [ x1 - x2, y1 - y2, ]; export const vec2MultiplyScalar = ([x, y]: Vec2, scalar: number): Vec2 => [ x * scalar, y * scalar, ]; export const vec2DivideScalar = ([x, y]: Vec2, scalar: number): Vec2 => [ x / scalar, y / scalar, ]; export const vec2Normalize = (vec: Vec2): Vec2 => vec2DivideScalar(vec, vec2Length(vec)); export const vec2Distance = (vec1: Vec2, vec2: Vec2) => vec2Length(vec2Sub(vec2, vec1)); export const vec2InCircle = (circle: Vec2, point: Vec2, radius: number) => vec2Distance(circle, point) <= radius; export const vec2Inverse = (vec: Vec2): Vec2 => vec2MultiplyScalar(vec, -1); export const vec2Snap = ([x, y]: Vec2, snapScale: number): Vec2 => vec2MultiplyScalar( [Math.round(x / snapScale), Math.round(y / snapScale)], snapScale ); export const vec2Equals = ([x1, y1]: Vec2, [x2, y2]: Vec2) => x1 === x2 && y1 === y2; export const vec2AngleFromOrigin = ( [x, y]: Vec2, [ox, oy]: Vec2 = [0, 0] ): number => Math.atan2(y - oy, x - ox); export const vec2PointFromAngle = ( angle: number, [ox, oy]: Vec2 = [0, 0] ): Vec2 => [Math.cos(angle) + ox, Math.sin(angle) + oy]; export const deg2rad = (deg: number) => deg * (Math.PI / 180); export const rad2deg = (rad: number) => rad * (180 / Math.PI);