homemanager-fe/src/modules/house-planner/utils.ts

57 lines
1.5 KiB
TypeScript

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);