npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

javascript-algebra

v1.10.11

Published

Алгебраические методы для матриц, векторов, кватернионови так далее

Downloads

54

Readme

Алгебраические методы для 2d и 3d графики и так далее

Векторы, Кватернионы и Матрицы @chainable

Установка

$ npm install javascript-algebra

Настройка

importmaps

<script type="importmap">
{
  "imports": {
    "javascript-algebra": "/javascript-algebra/index.js",
    "javascript-algebra/": "/javascript-algebra/library/"
  }
}
</script>

Дополнительно

Если вы используете vscode, можно настроить резолв для корректной работы самого редактора с помощью файла jsconfig.json

{
  "compilerOptions": {
    "baseUrl": "../node_modules/",
    "paths": {
      "javascript-algebra/*": ["./javascript-algebra/library/*"]
    }
  }
}

Использование

import { Vector, Quatern, Matrix } from 'javascript-algebra';

Vector
  .from(1, 2, 3) // -> Vector @3d {x: 1,  y: 0,  z: 0}
  .scale(10);    //    Vector @3d {x: 10, y: 20, z: 30}
...

Matrix.identity(10) // -> Matrix {height: 10, width: 10}
...

Список методов

Vector класс для работы с векторами

Векторы могут быть любой размерности, хотя многие штуки дополнительно удобно сделаны для 2D / 3D / 4D

/** Создание вектора */
const vector = new Vector([1, 2, 3, ..., n])
const vector = Vector.from(1, 2, 3, ..., n) // то же самое

const empty    = Vector.empty(n)           // нулевой вектор размерности n
const identity = Vector.identity(n, value) // вектор размерности n, все элементы = value
const basis    = Vector.basis(n, index)    // вектор размерности n, все элементы кроме index, = 0

// значения по осям
// get / set: x, y, z, w;

/** Частые значения (статические значения) */
/** 2D */
Vector.x        = Vector.basis(2, 0)
Vector.y        = Vector.basis(2, 1)
Vector.zero     = Vector.empty(2)
Vector.flipX    = Vector.from(-1,  1)
Vector.flipY    = Vector.from( 1, -1)
Vector.one      = Vector.identity(2)
Vector.half     = Vector.from(0.5, 0.5)
Vector.infinity = Vector.from(Infinity, Infinity)

/** 3D */
Vector.X        = Vector.basis(3, 0)
Vector.Y        = Vector.basis(3, 1)
Vector.Z        = Vector.basis(3, 2)
Vector.ZERO     = Vector.empty(3)
Vector.FlipX    = Vector.from(-1,  1,  1)
Vector.FlipY    = Vector.from( 1, -1,  1)
Vector.FlipZ    = Vector.from( 1,  1, -1)
Vector.ONE      = Vector.identity(3)
Vector.HALF     = Vector.from(0.5, 0.5, 0.5)
Vector.INFINITY = Vector.from(Infinity, Infinity, Infinity)

/** Создание вектора для частых задач */
const vector = Vector.to(A, B)        // Вектор из точки A в B; A и B элементы Vector // B - A
const vector = Vector.distance(A, B)  // Расстояние между двумя точками
const vector = Vector.relation(A, B)  // Вектор отношения двух векторов (одинаковых размерностей)
const normal = Vector.normal(A, B, C) // Единичный вектор нормали к плоскости, заданной тремя точками
const random   = Vector.random(3) // вектор с случайными значениями

/** Ортогональные векторы */
const ortho = Vector.ortho2(vector) // {x, y} -> {-y, x}
const ortho = Vector.ortho3(A, B)   // A multiply B

/** Методы (const vector = new Vector(...)) */
const empty    = vector.empty()     // true, если все компоненты нулевые
const basis    = vector.basis()     // true, если все компоненты нулевые кроме одной
const basis    = vector.axis(index) // true, если все компоненты нулевые кроме index
const number   = vector.index()     // номер ненулевой (единичной) оси\
const identity = vector.identity()  // TODO: true, если все компоненты = 1

const number = vector.length() // Длина вектора
const number = vector.norm()   // Норма вектора

const vec = vector.normalize() // Нормализация вектора
const vec = vector.link()      // Сопряжённый вектор, 1 / vector
const vec = vector.reverse()   // Обратный вектор, все компоненты e => -e
const vec = vector.inverse()   // Вектор из компонент в обратном порядке
const vec = vector.half()      // Половина исходного вектора

/** Аггрегирующие функции */
const number = vector.max()     // Максимальная компонента вектора
const number = vector.min()     // Минимальная компонента вектора
const number = vector.average() // Среднее всех компонент вектора

const vector = vector.level(level = 1) // Приведение покомпонентного максимума (выравнивание) к значению
const vector = vector.align(level = 1) // Приведение покомпонентного максимума (выравнивание) к отношению

/** Основные методы */
const vector = vector.scale(factor)          // Умножение вектора на скаляр (масштабирование)
const vector = vector.divide(factor)         // деление вектора на скаляр (для удобства)
const vector = vector.addition(vector)       // Сложение векторов
const vector = vector.difference(vector)     // Разность векторов
const vector = vector.dot(vector)            // Скалярное умножение векторов (scalar)
const vector = vector.multiplication(vector) // Покомпонентное умножение векторов

/** Основные методы 2D */
const vector = vector.rotate2D(angle)      // Вращение вектора
const bool = vector.in2D(vectorA, vectorB) // попадение в ориентированный прямоугольник
const bool = vector.has2D(point)           // наличие point в прямоугольнике [0, vector]

/** Основные методы 3D */
const vector = vector.multiply(vector)     // Векторное умножение (при размерности 3)
const vector = vector.rotate3D()           // TODO: нет пока такого метода
const bool = vector.in3D(vectorA, vectorB) // попадение в ориентированный параллепипед
const bool = vector.has3D(point)           // наличие point в параллепипеде [0, ...vector]

/** Основные методы (с приведением размерностей) */
const vector = vector.add(vector)          // Сложение векторов (с приведением размерностей)
const vector = vector.diff(vector)         // Разность векторов (с приведением размерностей)
const vector = vector.mult(vector)         // Скалярное умножение векторов (с приведением размерностей)
const vector = vector.multiplicate(vector) // Покомпонентное умножение (с приведением размерностей)

/** Дополнительные методы (const vector = new Vector(...)) */
const copy   = vector.copy()   // копирование объекта вектора
const array  = vector.export() // возвращает массив компонент вектора
const object = vector.symbol() // {x?, y?, z?, w?} - возвращает объект с полями-компонентами (макс 4)

const vector  = vector.resize(n)            // Изменение размерности вектора
const vector  = vector.resizeIdentity(n)    // Изменение размерности вектора c дополнением единицами
const vector  = vector.fill(index, ...data) // Заполнение координат вектора новыми значениями

const vector  = Vector.addition(n, A, B, C, ...vectors)  // Сумма нескольких векторов размерности n
const compare = Vector.compare(A, B, precision = 0.0001) // -> boolean (сравнение векторов)
const number  = Vector.dimension(...vectors) // Приведение размерности векторов (выбор максимальной)

Quatern класс для работы с кватернионами

/** Создание кватерниона */
const quatern = new Quatern(x, y, z, w)     // из чисел
const quatern = Quatern.from(angle, vector) // из угла (number) и вектора (Vector)
const quatern = Quatern.data([x, y, z, w])  // из массива чисел
// TODO: создание кватерниона из матрицы поворота

// значения по осям
// TODO: get / set: x, y, z, w;

/** Частые значения (статические значения) */
Quatern.empty = new Quatern(0, 0, 0, 0)

/** Методы (const quatern = new Quatern(...)) */
const number     = quatern.norm()     // Норма кватерниона    (x^2 + y^2 + z^2 + w^2)
const number     = quatern.absolute() // Модуль кватерниона   (sqrt(norm))
const number     = quatern.argument() // Аргумент кватерниона (2 acos(w))
const quaternion = quatern.sign()     // Знак кватерниона     (.scale(1 / absolute))

/** Основные методы */
const quaternion = quatern.reverse()     // Сопряжённый кватернион  {-x, -y, -z, w}
const quaternion = quatern.inverse()     // Обратный (по умножению) (.reverse().scale(1 / norm))
const quaternion = quatern.scale(factor) // Умножение на скаляр
const quaternion = quatern.addition(Q)   // Сложение кватернионов
const quaternion = quatern.dot(Q)        // Скалярное умножение (scalar)
const quaternion = quatern.multiply(Q)   // Умножение кватернионов

/** Дополнительные методы (const quatern = new Quatern(...)) */
const copy  = quatern.copy() // Копия объекта кватерниона
const array = quatern.data() // export? -> возвращает массив компонент Float32Array[x, y, z, w]

Matrix класс для работы с матрицами

/** Создание матрицы */
const matrix = new Matrix(array, height, width) // из элементов массива параметра
const matrix = Matrix.from(...vector)            // из набора векторов

/** Создание матриц для частых задач */
// TODO: создание матрицы 4x4 из кватерниона
const matrix = Matrix.identity(n)           // Единичная матрица любой размерности
const matrix = Matrix.empty(height, width)  // Нулевая (пустая) матрица
const matrix = Matrix.random(height, width) // Матрица из случайных элементов [0..1)
const matrix = Matrix.diagonal(vector)      // Диагональная матрица из вектора
const matrix = Matrix.diagonalUp(vector)    // Над-диагональная матрица
const matrix = Matrix.diagonalDown(vector)  // Под-диагональная матрица

const matrix = Matrix.sparse(data, height, width) // Разряженная матрица
const matrix = Matrix.concat(...matrix)           // Блок из матриц (Блочная матрица)

/** Матрицы для основных преобразований */
const matrix = Matrix.translate(vector)   // Матрица переноса

const matrix = Matrix.shiftUp(n)          // Матрица сдвига вверх (верхне-сдвиговая матрица)
const matrix = Matrix.shiftDown(n)        // Матрица сдвига вниз (нижне-сдвиговая матрица)

const matrix = Matrix.scale(vector)       // Матрица масштабирования

/** 2D */
const matrix = Matrix.transform2(a, b, c, d, e, f) // Матрица трансформаций [[a,b,0], [c,d,0], [e,f,1]]

const matrix = Matrix.rot(angle)   // Матрица абсолютного поворота
const matrix = Matrix.skew(vector) // Матрица искажения

/** 3D */
const matrix = Matrix.lookAt(eye, center, up) // Видовая матрица (eye, center, up: Vector)
const matrix = Matrix.frustum(top, right, bottom, left, near, far) // Матрица пирамидального отсечения
const matrix = Matrix.ortho(top, right, bottom, left, near, far)   // Матрица прямоугольного отсечения
const matrix = Matrix.perspective(fovy, aspect, near, far) // Матрица симметричной перспективной проекции

const matrix = Matrix.translateX(vector)  // Матрица переноса по оси X
const matrix = Matrix.translateY(vector)  // Матрица переноса по оси Y
const matrix = Matrix.translateZ(vector)  // Матрица переноса по оси Z
const matrix = Matrix.translateXY(vector) // Матрица переноса по плоскости Z
const matrix = Matrix.translateXZ(vector) // Матрица переноса по плоскости Y
const matrix = Matrix.translateYZ(vector) // Матрица переноса по плоскости X

const matrix = Matrix.scaleX(factor)      // Матрица масштабирования по оси X
const matrix = Matrix.scaleY(factor)      // Матрица масштабирования по оси Y
const matrix = Matrix.scaleZ(factor)      // Матрица масштабирования по оси Z
const matrix = Matrix.scaleXYZ(factor)    // Матрица масштабирования по всем осям на одинаковые значения

const matrix = Matrix.rotate(vector, angle) // Матрица абсолютного поворота вокруг вектора
const matrix = Matrix.rotateX(angle)        // Матрица абсолютного поворота вокруг оси X
const matrix = Matrix.rotateY(angle)        // Матрица абсолютного поворота вокруг оси Y
const matrix = Matrix.rotateZ(angle)        // Матрица абсолютного поворота вокруг оси Z

/** Методы */
const number   = matrix.trace()    // След матрицы
const empty    = matrix.empty()    // true, если все элементы матрицы = 0
const identity = matrix.identity() // true, если все элементы главной диагонали = 1

/** Основные методы (const matrix = new Matrix(...)) */
const matx = matrix.transpose()       // Транспонирование матрицы
const matx = matrix.dot(factor)       // Умножение матрицы на скаляр (scalar)
const matx = matrix.addition(M)       // Сложение матриц
const matx = matrix.multiply(M)       // Умножение согласованных матриц
const matx = matrix.translate(vector) // Операция переноса координат
const matx = matrix.scale(vector)     // Операция масштабирования координат

const matx = matrix.vectorCol(vector) // Умножение матрицы на вектор-столбец справа
const matx = matrix.vectorRow(vector) // Умножение матрицы (N x 1) на вектор-строку (N) слева

const matx = matrix.shiftDown()      // Сдвиг квадратной матрицы вниз
const matx = matrix.shiftUp()        // Сдвиг квадратной матрицы вверх
const matx = matrix.shiftLeft()      // Сдвиг квадратной матрицы влево
const matx = matrix.shiftRight()     // Сдвиг квадратной матрицы вправо
const matx = matrix.shiftUpRight()   // Сдвиг квадратной матрицы вверх-вправо
const matx = matrix.shiftUpLeft()    // Сдвиг квадратной матрицы вверх-влево
const matx = matrix.shiftDownRight() // Сдвиг квадратной матрицы вниз-вправо
const matx = matrix.shiftDownLeft()  // Сдвиг квадратной матрицы вниз-влево

const vec = matrix.transition(vector)        // перевод системы координат
const vec = matrix.transitionInverse(vector) // перевод системы координат @slow

/** Основные методы (с приведением размерностей) */
const matx = matrix.add(M)  // Сложение матриц (с приведением размерностей)
const matx = matrix.mult(M) // Умножение матриц с с предварительным согласованием

/** 2D */
const matx = matrix.rot(angle)   // Операция поворота координат
const matx = matrix.skew(vector) // Операция искажения (extended)
const vec = matrix.transition2D(vector) // Перевод точек из одной СК окружения пера в другую через матрицу перехода

/** 3D */
const matx = matrix.rotate(vector, angle) // Операция поворота координат
const matx = matrix.inverse3D()       // Обратная матрица к матрице модели для 3d графики (fast)

const matx = matrix.rotateX(angle)    // Операция поворота координат вокруг оси X
const matx = matrix.rotateY(angle)    // Операция поворота координат вокруг оси Y
const matx = matrix.rotateZ(angle)    // Операция поворота координат вокруг оси Z

const matx = matrix.translateX(coord) // Операция переноса координат по оси X
const matx = matrix.translateY(coord) // Операция переноса координат по оси Y
const matx = matrix.translateZ(coord) // Операция переноса координат по оси Z

const matx = matrix.translateXY(x, y) // Операция переноса координат по плоскости Z
const matx = matrix.translateXZ(x, z) // Операция переноса координат по плоскости Y
const matx = matrix.translateYZ(y, z) // Операция переноса координат по плоскости X

const matx = matrix.scaleX(factor)    // Операция масштабирования координат по оси X
const matx = matrix.scaleY(factor)    // Операция масштабирования координат по оси Y
const matx = matrix.scaleZ(factor)    // Операция масштабирования координат по оси Z

const matx = matrix.scaleXYZ(factor)  // Операция масштабирования координат по всем осям

const vec = matrix.transitionInverse3D(vector) // перевод системы координат @slow

/** Работа с различными векторами матрицы */
const columns = matrix.cols()               // Набор вектор-столбцов матрицы -> [...Vector]
const rows    = matrix.rows()               // Набор вектор-строк матрицы    -> [...Vector]

const column = matrix.col(index)            // Вектор-столбец матрицы -> Vector
const matx   = matrix.setCol(index, vector) // Замена столбца index в матрице на значения из вектора
const matx   = matrix.additionCol(index, vector) // Добавление к столбцу матрицы значение из вектора

const row    = matrix.row(index)            // Вектор-строка матрицы -> Vector
const matx   = matrix.setRow(index, vector) // Замена строки index в матрице на значения из вектора
const matx   = matrix.additionRow(index, vector) // Добавление к строке матрицы значение из вектора

const vector = matrix.diagonal()             // Главная диагональ матрицы -> Vector
const matx   = matrix.DIAGONAL(vector)       // Замена главной диагонали матрицы -> Matrix

/** Применение метода Гаусса */
const matx   = matrix.inverse()     // Обратная матрица
const number = matrix.determinant() // Определитель матрицы
const number = matrix.rank()        // Ранг матрицы
const vec    = matrix.solve(vector) // Решение СЛАУ (Ax = B: matrix = A, vector = B)
const object = Matrix.gauss(matrix, w) // применение метода Гаусса

/** Работа с минорами матрицы */
const matx = matrix.minor(row, col)    // Минор матрицы по строке и столбцу
const matx = matrix.minors(rows, cols) // Минор матрицы любого порядка по строкам и столбцам
const matx = matrix.minore(from, to)   // Минор матрицы любого порядка (from, to: Vector{x, y})

/** Дополнительные методы (const matrix = new Matrix(...)) */
const compare = Matrix.compare(A, B, precision = 0.0001) // -> boolean (сравнение матриц)
const copy    = matrix.copy()                  // Копирование матрицы
const string  = matrix.toString(precision = 2) // Вывод матрицы в терминал @debug
const vector  = matrix.vector()                // Вектор из элементов матрицы
const vector  = matrix.element(start, count)   // Возврат элементов матрицы с любого места (по столбцам)
const matx    = matrix.fill(start, array)      // Заполнение элементов с любого места (по столбцам)
const number  = matrix.get(row, col)           // Получение конкретного элемента матрицы
const matx    = matrix.set(row, col, value)    // Установка конкретного элемента матрицы

const matx    = matrix.resize(height, width)   // Изменение размеров матрицы

/** Элементарные преобразования */
const matx = matrix.swapCol(a, b) // Обмен столбцов с номерами a и b
const matx = matrix.swapRow(a, b) // Обмен строк с номерами a и b
const matx = matrix.scaleCol(index, factor) // Умножение столбца матрицы на скаляр
const matx = matrix.scaleRow(index, factor) // Умножение строки матрицы на скаляр
const matx = matrix.additionCols(a, b, factor) // Добавление к столбцу столбца, помноженного на скаляр
const matx = matrix.additionRows(a, b, factor) // Добавление к строке  строки, помноженной на скаляр

/** Преобразования векторов через матрицы */
const vec = Matrix.transition(matrix, vector)          // перевод системы координат
const vec = Matrix.transition2D(matrix, vector)        // Перевод точек из одной СК окружения пера в другую через матрицу перехода
const vec = Matrix.transitionInverse(matrix, vector)   //
const vec = Matrix.transitionInverse3D(matrix, vector) //

ROADMAP

  • Quatern - повороты, интерполяция (LERP)
  • Matrix - мутабельные методы работы с элементами @faster, жорданки, расчет теней для 3d