From ce88c66ced30a46984cabf2d4e42cf1cb0634bc0 Mon Sep 17 00:00:00 2001 From: PromiSe#### Date: Mon, 30 Dec 2024 18:12:01 +0700 Subject: [PATCH] [lib-vec2] 0.3.0 Release --- README.md | 2 +- packages/lib-vec2/README.md | 34 ++++++++++++++--------------- packages/lib-vec2/package.json | 2 +- packages/lib-vec2/src/vec2.ts | 40 ++++++++++++++++++---------------- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index c22663f..7443767 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ npm. Теперь все библиотеки можно и нужно буде - A simple project demonstrating drag-and-drop functionality using @vicimpa/easy-drag. - [@vicimpa/events (0.0.11)](packages/events) - [открыть на npm](https://www.npmjs.com/package/@vicimpa/events) - A lightweight TypeScript library for managing event listeners on HTML elements, document, and window. -- [@vicimpa/lib-vec2 (0.2.18)](packages/lib-vec2) - [открыть на npm](https://www.npmjs.com/package/@vicimpa/lib-vec2) +- [@vicimpa/lib-vec2 (0.3.0)](packages/lib-vec2) - [открыть на npm](https://www.npmjs.com/package/@vicimpa/lib-vec2) - Библиотека предоставляет обширный набор утилит для работы с2D-векторами - [@vicimpa/math (0.0.9)](packages/math) - [открыть на npm](https://www.npmjs.com/package/@vicimpa/math) - A collection of mathematical utility functions including operations like clamp, lerp, normalize, and more. diff --git a/packages/lib-vec2/README.md b/packages/lib-vec2/README.md index b530963..26cef05 100644 --- a/packages/lib-vec2/README.md +++ b/packages/lib-vec2/README.md @@ -1,3 +1,5 @@ +Обновим описание библиотеки @vicimpa/lib-vec2 с учетом нового файла `index.d.ts`. + # @vicimpa/lib-vec2 Библиотека @vicimpa/lib-vec2 предоставляет обширный набор утилит для работы с 2D-векторами. Эта библиотека особенно полезна для графических приложений, симуляций физики и любых других областей, где требуется математика 2D-векторов. @@ -23,10 +25,9 @@ const v1 = new Vec2(); // По умолчанию (0, 0) const v2 = new Vec2(1, 2); // Из координат const v3 = new Vec2({ x: 3, y: 4 }); // Из объекта const v4 = new Vec2(v2); // Из другого Vec2 -const v5 = new Vec2("1:2"); // Из строки Vec2Hash ``` -Создать новый вектор можно и при помощи функции: `vec2` +Создать новый вектор можно и при помощи функции: vec2 ```ts import { vec2 } from "@vicimpa/lib-vec2"; @@ -34,7 +35,6 @@ const v1 = vec2(); // По умолчанию (0, 0) const v2 = vec2(1, 2); // Из координат const v3 = vec2({ x: 3, y: 4 }); // Из объекта const v4 = vec2(v2); // Из другого Vec2 -const v5 = vec2("1:2"); // Из строки Vec2Hash ``` ### Свойства @@ -44,7 +44,6 @@ const v5 = vec2("1:2"); // Из строки Vec2Hash - **tuple**: [number, number] - Возвращает вектор в виде кортежа. - **size**: { width: number, height: number } - Возвращает вектор в виде объекта размера. - **point**: { x: number, y: number } - Возвращает вектор в виде объекта точки. -- **hash**: string - Возвращает хэш вектора в формате `${x}:${y}`. ### Методы @@ -65,7 +64,7 @@ const v5 = vec2("1:2"); // Из строки Vec2Hash - **round**(): this - Округляет координаты вектора. - **ceil**(): this - Приводит координаты вектора к ближайшему большему целому. - **floor**(): this - Приводит координаты вектора к ближайшему меньшему целому. -- **inverse**(): this - Меняет местами координаты x и y. +- **inverse**(): this - Инвертирует координаты вектора. - **lerp**(to: Vec2, i: number): this - Линейно интерполирует между этим вектором и другим. - **sign**(): this - Устанавливает координаты вектора в их знаковое значение. - **abs**(): this - Устанавливает координаты вектора в их абсолютные значения. @@ -107,7 +106,6 @@ const v5 = vec2("1:2"); // Из строки Vec2Hash - **fromRandom**(vec?: Vec2): Vec2 - **fromSrandom**(vec?: Vec2): Vec2 -- **fromHash**(hash: Vec2Hash, vec?: Vec2): Vec2 - **fromAngle**(d: number, vec?: Vec2): Vec2 - **fromPoint**(point: Vec2Point, vec?: Vec2): Vec2 - **fromSize**(size: Vec2Size, vec?: Vec2): Vec2 @@ -171,33 +169,33 @@ console.log(v4.toString()); // Выводит "0.707 0.707" ## Vec2Map -Класс `Vec2Map` предоставляет структуру данных, аналогичную стандартной карте (Map), но с использованием объектов `Vec2` в качестве ключей. Это полезно, когда вам нужно сопоставить значения с 2D-векторами. +Класс Vec2Map предоставляет структуру данных, аналогичную стандартной карте (Map), но с использованием объектов Vec2 в качестве ключей. Это полезно, когда вам нужно сопоставить значения с 2D-векторами. ### Свойства - **size**: number - Возвращает размер коллекции. ### Методы -- **has(...args: Vec2Args): boolean** - Проверяет, существует ли элемент с заданным ключом `Vec2`. -- **get(...args: Vec2Args): T** - Возвращает значение, связанное с заданным ключом `Vec2`. -- **set(value: T, ...args: Vec2Args): this** - Устанавливает значение для заданного ключа `Vec2`. -- **delete(...args: Vec2Args): boolean** - Удаляет элемент с заданным ключом `Vec2`. +- **has(...args: Vec2Args): boolean** - Проверяет, существует ли элемент с заданным ключом Vec2. +- **get(...args: Vec2Args): T** - Возвращает значение, связанное с заданным ключом Vec2. +- **set(vec: Vec2Args[0], value: T): this** - Устанавливает значение для заданного ключа Vec2. +- **delete(...args: Vec2Args): boolean** - Удаляет элемент с заданным ключом Vec2. - **clear(): void** - Очищает все элементы в карте. - **forEach(callback: (key: Vec2, value: T, self: this) => any): void** - Выполняет указанную функцию один раз для каждого элемента в карте. - **[Symbol.iterator](): Generator<[key: Vec2, value: T], void, unknown>** - Возвращает итератор для перебора элементов карты. ## Vec2Set -Класс `Vec2Set` предоставляет структуру данных, аналогичную стандартному множеству (Set), но с использованием объектов `Vec2` в качестве элементов. Это полезно для хранения уникальных 2D-векторов. +Класс Vec2Set предоставляет структуру данных, аналогичную стандартному множеству (Set), но с использованием объектов Vec2 в качестве элементов. Это полезно для хранения уникальных 2D-векторов. ### Свойства - **size**: number - Возвращает размер коллекции. ### Методы -- **has(...args: Vec2Args): boolean** - Проверяет, существует ли элемент `Vec2` в множестве. -- **add(...args: Vec2Args): this** - Добавляет элемент `Vec2` в множество. -- **delete(...args: Vec2Args): boolean** - Удаляет элемент с заданным ключом `Vec2`. +- **has(...args: Vec2Args): boolean** - Проверяет, существует ли элемент Vec2 в множестве. +- **add(...args: Vec2Args): this** - Добавляет элемент Vec2 в множество. +- **delete(...args: Vec2Args): boolean** - Удаляет элемент с заданным ключом Vec2. - **clear(): void** - Очищает все элементы в множестве. - **forEach(callback: (key: Vec2, self: this) => any): void** - Выполняет указанную функцию один раз для каждого элемента в множестве. - **[Symbol.iterator](): Generator** - Возвращает итератор для перебора элементов множества. @@ -217,8 +215,8 @@ const v1 = new Vec2(1, 2); const v2 = new Vec2(3, 4); // Устанавливаем значения для векторов -map.set(10, v1); -map.set(20, v2); +map.set(v1, 10); +map.set(v2, 20); // Получаем значения по ключу console.log(map.get(v1)); // Выводит 10 @@ -266,4 +264,4 @@ set.clear(); console.log(set.has(v1)); // Выводит false ``` -Эти примеры демонстрируют, как использовать `Vec2Map` и `Vec2Set` для работы с коллекциями 2D-векторов, обеспечивая уникальность и быстрый доступ к элементам. \ No newline at end of file +Эти примеры демонстрируют, как использовать Vec2Map и Vec2Set для работы с коллекциями 2D-векторов, обеспечивая уникальность и быстрый доступ к элементам. \ No newline at end of file diff --git a/packages/lib-vec2/package.json b/packages/lib-vec2/package.json index 84e3b77..b40f415 100644 --- a/packages/lib-vec2/package.json +++ b/packages/lib-vec2/package.json @@ -1,6 +1,6 @@ { "name": "@vicimpa/lib-vec2", - "version": "0.2.18", + "version": "0.3.0", "description": "Библиотека предоставляет обширный набор утилит для работы с2D-векторами", "repository": "github:vicimpa/vicimpa-library", "funding": "https://boosty.to/vic_dev", diff --git a/packages/lib-vec2/src/vec2.ts b/packages/lib-vec2/src/vec2.ts index 6f14489..e9bc41f 100644 --- a/packages/lib-vec2/src/vec2.ts +++ b/packages/lib-vec2/src/vec2.ts @@ -5,7 +5,6 @@ export type Vec2Size = { width: number, height: number; }; export type TPageXY = { pageX: number, pageY: number; }; export type TOffsetXY = { offsetX: number, offsetY: number; }; export type TDeltaXY = { deltaX: number, deltaY: number; }; -export type Vec2Hash = `${number}:${number}`; export type TRect2 = [ ...([x: number, y: number] | [xy: Vec2]), ...([w: number, h: number] | [wh: Vec2]) @@ -15,8 +14,7 @@ export type Vec2Args = ( never | [] | [vec: Vec2] - | [xy: Vec2Point | number] - | [hash: Vec2Hash] + | [xy: Vec2Point | Vec2Tuple | number] | Vec2Tuple ); @@ -33,17 +31,16 @@ export function vec2(...args: Vec2Args) { export function vec2run(args: Vec2Args, mutation: F): ReturnType { var first = args[0] ?? 0; - if (typeof first === 'string') { - const [x = 0, y = 0] = first.split(':').map(Number); - return mutation.call(x, y); - } - if (typeof first === 'number') { if (typeof args[1] === 'number') return mutation.call(null, first, args[1]); return mutation.call(null, first, first); } + if (Array.isArray(first)) { + return mutation.call(null, first[0], first[1]); + } + if (first && ('x' in first) && ('y' in first)) return mutation.call(null, first.x, first.y); @@ -86,10 +83,6 @@ export class Vec2 { }; } - get hash(): Vec2Hash { - return `${this.x}:${this.y}`; - } - constructor(...args: Vec2Args) { this.set(...args); } @@ -380,10 +373,6 @@ export class Vec2 { }); } - static fromHash(hash: Vec2Hash, vec = new this()) { - return vec.set(hash); - } - static fromAngle(d: number, vec = new this()) { return vec.set(Math.sin(d), Math.cos(d)); } @@ -428,6 +417,12 @@ export class Vec2 { export class Vec2Map { private __data = new Map>(); + constructor(points?: Iterable<[Vec2 | Vec2Point | number, T]>) { + for (const [key, value] of points) { + this.set(key, value); + } + } + get size() { var count = 0; this.__data.forEach(row => count += row.size); @@ -452,8 +447,8 @@ export class Vec2Map { }); } - set(value: T, ...args: Vec2Args) { - return vec2run(args, (x, y) => { + set(vec: Vec2Args[0], value: T) { + return vec2run([vec], (x, y) => { (this.__data.get(y) ?? ( this.__data.set(y, new Map()), this.__data.get(y)! @@ -485,6 +480,12 @@ export class Vec2Map { export class Vec2Set { private __data = new Map>(); + constructor(points?: Iterable) { + for (const point of points) { + this.add(point); + } + } + get size() { var count = 0; this.__data.forEach(row => count += row.size); @@ -531,4 +532,5 @@ export class Vec2Set { } } } -} \ No newline at end of file +} +new Vec2Set([1]); \ No newline at end of file