UNPKG

@vicimpa/lib-vec2

Version:

A comprehensive TypeScript library for 2D vector manipulation, compatible with CanvasRenderingContext2D.

222 lines (175 loc) 15 kB
Выберите язык: [Английский](README.md) | **`Русский`** --- # @vicimpa/lib-vec2 `@vicimpa/lib-vec2` — это библиотека для работы с 2D-векторами в TypeScript. Она предоставляет различные утилиты и классы для выполнения операций с векторами, таких как сложение, вычитание, нормализация и многое другое. Библиотека поддерживает как изменяемые, так и неизменяемые операции, что делает её подходящей для функционального программирования. Кроме того, она предлагает структуры данных, такие как `Vec2Map` и `Vec2Set`, которые используют векторы в качестве ключей и элементов соответственно. ### Типы - **Vec2Point**: Представляет точку в 2D-пространстве с координатами x и y. ```ts type Vec2Point = { x: number; y: number; }; ``` - **Vec2Tuple**: Представляет кортеж координат x и y. ```ts type Vec2Tuple = [x: number, y: number]; ``` - **Vec2Size**: Представляет размер с шириной и высотой. ```ts type Vec2Size = { width: number, height: number; }; ``` - **Vec2PageXY**: Представляет координаты страницы с pageX и pageY. ```ts type Vec2PageXY = { pageX: number, pageY: number; }; ``` - **Vec2OffsetXY**: Представляет смещенные координаты с offsetX и offsetY. ```ts type Vec2OffsetXY = { offsetX: number, offsetY: number; }; ``` - **Vec2DeltaXY**: Представляет дельта-координаты с deltaX и deltaY. ```ts type Vec2DeltaXY = { deltaX: number, deltaY: number; }; ``` - **Vec2OffsetSize**: Представляет смещенный размер с offsetWidth и offsetHeight. ```ts type Vec2OffsetSize = { offsetWidth: number, offsetHeight: number; }; ``` - **Vec2InnerSize**: Представляет внутренний размер с innerWidth и innerHeight. ```ts type Vec2InnerSize = { innerWidth: number, innerHeight: number; }; ``` - **Vec2Args**: Представляет аргументы для операций с векторами, которые могут быть одним числом, `Vec2Point` или двумя числами. ```ts type Vec2Args = [xy: number] | [xy: Vec2Point] | [x: number, y: number]; ``` - **Vec2Clamp**: Представляет аргументы для ограничения, которые могут быть двумя или четырьмя числами. ```ts type Vec2Clamp = [min: Vec2Args[0], max: Vec2Args[0]] | [minX: number, minY: number, maxX: number, maxY: number]; ``` ### Функции - **vec2**: Фабричная функция для создания экземпляра `Vec2`. ```ts function vec2(): Vec2; function vec2(xy: number | Vec2Point): Vec2; function vec2(x: number, y: number): Vec2; ``` ### Классы #### Vec2 Представляет 2D-вектор с различными утилитными методами. - **Свойства**: - `x`: Координата X. - `y`: Координата Y. - **Геттеры**: - `point`: Возвращает вектор как `Vec2Point`. - `tuple`: Возвращает вектор как `Vec2Tuple`. - `size`: Возвращает вектор как `Vec2Size`. - **Методы**: - `equal(xy: number | Vec2Point): boolean`: Проверяет, равен ли вектор другому вектору или точке. - `set(xy: number | Vec2Point): this`: Устанавливает координаты вектора. - `toObject(o: Vec2Point): this`: Копирует координаты вектора в `Vec2Point`. - `toObjectSize(o: Vec2Size): this`: Копирует координаты вектора в `Vec2Size`. - `toTuple(o: Vec2Tuple): this`: Копирует координаты вектора в `Vec2Tuple`. - `clone(): Vec2`: Возвращает новый экземпляр с теми же координатами. - `min(): number`: Возвращает минимальное значение из координат x и y. - `max(): number`: Возвращает максимальное значение из координат x и y. - `angle(): number`: Возвращает угол вектора в радианах. - `length(): number`: Возвращает длину вектора. - `distance(xy: number | Vec2Point): number`: Вычисляет расстояние до другого вектора или точки. - `dot(xy: number | Vec2Point): number`: Вычисляет скалярное произведение с другим вектором или точкой. - `scalar(xy: number | Vec2Point): number`: Вычисляет скалярную проекцию на другой вектор или точку. - `plus(xy: number | Vec2Point): this`: Добавляет другой вектор или точку. - `minus(xy: number | Vec2Point): this`: Вычитает другой вектор или точку. - `times(xy: number | Vec2Point): this`: Умножает на другой вектор или точку. - `div(xy: number | Vec2Point): this`: Делит на другой вектор или точку. - `rem(xy: number | Vec2Point): this`: Вычисляет остаток с другим вектором или точкой. - `pow(xy: number | Vec2Point): this`: Возводит в степень другого вектора или точки. - `abs(): this`: Применяет абсолютное значение к обеим координатам. - `sign(): this`: Применяет функцию знака к обеим координатам. - `round(): this`: Округляет обе координаты. - `ceil(): this`: Применяет функцию потолка к обеим координатам. - `floor(): this`: Применяет функцию пола к обеим координатам. - `normalize(): this`: Нормализует вектор. - `inverse(): this`: Меняет местами координаты x и y. - `clampMin(xy: number | Vec2Point): this`: Ограничивает вектор минимальным значением. - `clampMax(xy: number | Vec2Point): this`: Ограничивает вектор максимальным значением. - `clamp(...args: Vec2Clamp): this`: Ограничивает вектор между двумя или четырьмя значениями. - **Методы с префиксом c**: - `cplus(xy: number | Vec2Point): Vec2`: Возвращает новый вектор, являющийся результатом сложения другого вектора или точки с текущим вектором. - `cminus(xy: number | Vec2Point): Vec2`: Возвращает новый вектор, являющийся результатом вычитания другого вектора или точки из текущего вектора. - `ctimes(xy: number | Vec2Point): Vec2`: Возвращает новый вектор, являющийся результатом умножения текущего вектора на другой вектор или точку. - `cdiv(xy: number | Vec2Point): Vec2`: Возвращает новый вектор, являющийся результатом деления текущего вектора на другой вектор или точку. - `crem(xy: number | Vec2Point): Vec2`: Возвращает новый вектор, являющийся результатом вычисления остатка текущего вектора с другим вектором или точкой. - `cpow(xy: number | Vec2Point): Vec2`: Возвращает новый вектор, являющийся результатом возведения текущего вектора в степень другого вектора или точки. - `cabs(): Vec2`: Возвращает новый вектор с абсолютными значениями координат текущего вектора. - `csign(): Vec2`: Возвращает новый вектор со знаками координат текущего вектора. - `cround(): Vec2`: Возвращает новый вектор с округленными значениями координат текущего вектора. - `cceil(): Vec2`: Возвращает новый вектор с потолочными значениями координат текущего вектора. - `cfloor(): Vec2`: Возвращает новый вектор с полными значениями координат текущего вектора. - `cnormalize(): Vec2`: Возвращает новый вектор, являющийся нормализованной версией текущего вектора. - `cinverse(): Vec2`: Возвращает новый вектор с поменянными местами координатами x и y. - `cclampMin(xy: number | Vec2Point): Vec2`: Возвращает новый вектор, ограниченный минимальным значением, определенным другим вектором или точкой. - `cclampMax(xy: number | Vec2Point): Vec2`: Возвращает новый вектор, ограниченный максимальным значением, определенным другим вектором или точкой. - `cclamp(...args: Vec2Clamp): Vec2`: Возвращает новый вектор, ограниченный между двумя или четырьмя значениями. - **Статические методы**: - `fromAngle(angle: number, vec = new this()): Vec2`: Создает вектор из угла. - `fromRandom(vec = new this()): Vec2`: Создает вектор с случайными координатами. - `fromSrandom(vec = new this()): Vec2`: Создает вектор с подписанными случайными координатами. - `fromSize(size: Vec2Size, vec = new this()): Vec2`: Создает вектор из размера. - `fromDeltaXY(page: Vec2DeltaXY, vec = new this()): Vec2`: Создает вектор из дельта-координат. - `fromPageXY(page: Vec2PageXY, vec = new this()): Vec2`: Создает вектор из координат страницы. - `fromOffsetXY(offset: Vec2OffsetXY, vec = new this()): Vec2`: Создает вектор из смещенных координат. - `fromInnerSize(offsetSize: Vec2InnerSize, vec = new this()): Vec2`: Создает вектор из внутреннего размера. - `fromOffsetSize(offsetSize: Vec2OffsetSize, vec = new this()): Vec2`: Создает вектор из смещенного размера. - `fromSvgLength(x: SVGAnimatedLength, y: SVGAnimatedLength, vec = new this()): Vec2`: Создает вектор из длин SVG. #### Vec2Map<T> Структура, похожая на карту, которая использует `Vec2` в качестве ключей. - **Методы**: - `has(xy: number | Vec2Point): boolean`: Проверяет, находится ли вектор в карте. - `get(xy: number | Vec2Point): T | undefined`: Извлекает значение по ключу-вектору. - `set(xy: number | Vec2Point, value: T): this`: Устанавливает значение по ключу-вектору. - `delete(xy: number | Vec2Point): boolean`: Удаляет значение по ключу-вектору. - `clear(): this`: Очищает карту. - `forEach(callback: (value: T, key: Vec2) => any): void`: Итерация по карте. #### Vec2Set Структура, похожая на множество, которая использует `Vec2` в качестве элементов. - **Методы**: - `has(xy: number | Vec2Point): boolean`: Проверяет, находится ли вектор в множестве. - `add(xy: number | Vec2Point): this`: Добавляет вектор в множество. - `delete(xy: number | Vec2Point): boolean`: Удаляет вектор из множества. - `clear(): this`: Очищает множество. - `forEach(callback: (value: Vec2) => any): void`: Итерация по множеству. ### Патч CanvasRenderingContext2D Библиотека включает патч для `CanvasRenderingContext2D`, позволяющий использовать векторы непосредственно в операциях с canvas. Этот патч расширяет API canvas, чтобы принимать типы `Vec2` в различных методах. #### Пример использования ```ts const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const vec = new Vec2(50, 50); // Использование Vec2 с методами canvas ctx?.moveTo(vec); ctx?.lineTo(new Vec2(100, 100)); ctx?.stroke(); ``` ### Примеры кода #### Создание и манипуляция векторами ```ts import { vec2, Vec2 } from '@vicimpa/lib-vec2'; // Создание нового вектора const v1 = vec2(3, 4); // Клонирование и изменение вектора const v2 = v1.clone().plus(1, 2); // Вычисление расстояния между двумя векторами const distance = v1.distance(v2); // Нормализация вектора const normalized = v1.clone().normalize(); ``` #### Использование Vec2Map и Vec2Set ```ts import { Vec2, Vec2Map, Vec2Set } from '@vicimpa/lib-vec2'; // Создание Vec2Map const map = new Vec2Map<string>(); map.set(new Vec2(1, 2), 'Точка A'); console.log(map.get(new Vec2(1, 2))); // Вывод: 'Точка A' // Создание Vec2Set const set = new Vec2Set(); set.add(new Vec2(3, 4)); console.log(set.has(new Vec2(3, 4))); // Вывод: true ``` Эта библиотека предоставляет обширный набор инструментов для работы с 2D-векторами, что делает её подходящей для различных приложений, таких как графика, физические симуляции и многое другое.