Векторы, Кватернионы и Матрицы @chainable
$ npm install javascript-algebraimportmaps
<scripttype="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}...Векторы могут быть любой размерности, хотя многие штуки дополнительно удобно сделаны для 2D / 3D / 4D
/** Создание вектора */constvector=newVector([1,2,3, ...,n])constvector=Vector.from(1,2,3, ...,n)// то же самоеconstempty=Vector.empty(n)// нулевой вектор размерности nconstidentity=Vector.identity(n,value)// вектор размерности n, все элементы = valueconstbasis=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)/** Создание вектора для частых задач */constvector=Vector.to(A,B)// Вектор из точки A в B; A и B элементы Vector // B - Aconstvector=Vector.distance(A,B)// Расстояние между двумя точкамиconstvector=Vector.relation(A,B)// Вектор отношения двух векторов (одинаковых размерностей)constnormal=Vector.normal(A,B,C)// Единичный вектор нормали к плоскости, заданной тремя точкамиconstrandom=Vector.random(3)// вектор с случайными значениями/** Ортогональные векторы */constortho=Vector.ortho2(vector)// {x, y} -> {-y, x}constortho=Vector.ortho3(A,B)// A multiply B/** Методы (const vector = new Vector(...)) */constempty=vector.empty()// true, если все компоненты нулевыеconstbasis=vector.basis()// true, если все компоненты нулевые кроме однойconstbasis=vector.axis(index)// true, если все компоненты нулевые кроме indexconstnumber=vector.index()// номер ненулевой (единичной) оси\constidentity=vector.identity()// TODO: true, если все компоненты = 1constnumber=vector.length()// Длина вектораconstnumber=vector.norm()// Норма вектораconstvec=vector.normalize()// Нормализация вектораconstvec=vector.link()// Сопряжённый вектор, 1 / vectorconstvec=vector.reverse()// Обратный вектор, все компоненты e => -econstvec=vector.inverse()// Вектор из компонент в обратном порядкеconstvec=vector.half()// Половина исходного вектора/** Аггрегирующие функции */constnumber=vector.max()// Максимальная компонента вектораconstnumber=vector.min()// Минимальная компонента вектораconstnumber=vector.average()// Среднее всех компонент вектораconstvector=vector.level(level=1)// Приведение покомпонентного максимума (выравнивание) к значениюconstvector=vector.align(level=1)// Приведение покомпонентного максимума (выравнивание) к отношению/** Основные методы */constvector=vector.scale(factor)// Умножение вектора на скаляр (масштабирование)constvector=vector.divide(factor)// деление вектора на скаляр (для удобства)constvector=vector.addition(vector)// Сложение векторовconstvector=vector.difference(vector)// Разность векторовconstvector=vector.dot(vector)// Скалярное умножение векторов (scalar)constvector=vector.multiplication(vector)// Покомпонентное умножение векторов/** Основные методы 2D */constvector=vector.rotate2D(angle)// Вращение вектораconstbool=vector.in2D(vectorA,vectorB)// попадение в ориентированный прямоугольникconstbool=vector.has2D(point)// наличие point в прямоугольнике [0, vector]/** Основные методы 3D */constvector=vector.multiply(vector)// Векторное умножение (при размерности 3)constvector=vector.rotate3D()// TODO: нет пока такого методаconstbool=vector.in3D(vectorA,vectorB)// попадение в ориентированный параллепипедconstbool=vector.has3D(point)// наличие point в параллепипеде [0, ...vector]/** Основные методы (с приведением размерностей) */constvector=vector.add(vector)// Сложение векторов (с приведением размерностей)constvector=vector.diff(vector)// Разность векторов (с приведением размерностей)constvector=vector.mult(vector)// Скалярное умножение векторов (с приведением размерностей)constvector=vector.multiplicate(vector)// Покомпонентное умножение (с приведением размерностей)/** Дополнительные методы (const vector = new Vector(...)) */constcopy=vector.copy()// копирование объекта вектораconstarray=vector.export()// возвращает массив компонент вектораconstobject=vector.symbol()// {x?, y?, z?, w?} - возвращает объект с полями-компонентами (макс 4)constvector=vector.resize(n)// Изменение размерности вектораconstvector=vector.resizeIdentity(n)// Изменение размерности вектора c дополнением единицамиconstvector=vector.fill(index, ...data)// Заполнение координат вектора новыми значениямиconstvector=Vector.addition(n,A,B,C, ...vectors)// Сумма нескольких векторов размерности nconstcompare=Vector.compare(A,B,precision=0.0001)// -> boolean (сравнение векторов)constnumber=Vector.dimension(...vectors)// Приведение размерности векторов (выбор максимальной)/** Создание кватерниона */constquatern=newQuatern(x,y,z,w)// из чиселconstquatern=Quatern.from(angle,vector)// из угла (number) и вектора (Vector)constquatern=Quatern.data([x,y,z,w])// из массива чисел// TODO: создание кватерниона из матрицы поворота// значения по осям// TODO: get / set: x, y, z, w;/** Частые значения (статические значения) */Quatern.empty=newQuatern(0,0,0,0)/** Методы (const quatern = new Quatern(...)) */constnumber=quatern.norm()// Норма кватерниона (x^2 + y^2 + z^2 + w^2)constnumber=quatern.absolute()// Модуль кватерниона (sqrt(norm))constnumber=quatern.argument()// Аргумент кватерниона (2 acos(w))constquaternion=quatern.sign()// Знак кватерниона (.scale(1 / absolute))/** Основные методы */constquaternion=quatern.reverse()// Сопряжённый кватернион {-x, -y, -z, w}constquaternion=quatern.inverse()// Обратный (по умножению) (.reverse().scale(1 / norm))constquaternion=quatern.scale(factor)// Умножение на скалярconstquaternion=quatern.addition(Q)// Сложение кватернионовconstquaternion=quatern.dot(Q)// Скалярное умножение (scalar)constquaternion=quatern.multiply(Q)// Умножение кватернионов/** Дополнительные методы (const quatern = new Quatern(...)) */constcopy=quatern.copy()// Копия объекта кватернионаconstarray=quatern.data()// export? -> возвращает массив компонент Float32Array[x, y, z, w]/** Создание матрицы */constmatrix=newMatrix(array,height,width)// из элементов массива параметраconstmatrix=Matrix.from(...vector)// из набора векторов/** Создание матриц для частых задач */// TODO: создание матрицы 4x4 из кватернионаconstmatrix=Matrix.identity(n)// Единичная матрица любой размерностиconstmatrix=Matrix.empty(height,width)// Нулевая (пустая) матрицаconstmatrix=Matrix.random(height,width)// Матрица из случайных элементов [0..1)constmatrix=Matrix.diagonal(vector)// Диагональная матрица из вектораconstmatrix=Matrix.diagonalUp(vector)// Над-диагональная матрицаconstmatrix=Matrix.diagonalDown(vector)// Под-диагональная матрицаconstmatrix=Matrix.sparse(data,height,width)// Разряженная матрицаconstmatrix=Matrix.concat(...matrix)// Блок из матриц (Блочная матрица)/** Матрицы для основных преобразований */constmatrix=Matrix.translate(vector)// Матрица переносаconstmatrix=Matrix.shiftUp(n)// Матрица сдвига вверх (верхне-сдвиговая матрица)constmatrix=Matrix.shiftDown(n)// Матрица сдвига вниз (нижне-сдвиговая матрица)constmatrix=Matrix.scale(vector)// Матрица масштабирования/** 2D */constmatrix=Matrix.transform2(a,b,c,d,e,f)// Матрица трансформаций [[a,b,0], [c,d,0], [e,f,1]]constmatrix=Matrix.rot(angle)// Матрица абсолютного поворотаconstmatrix=Matrix.skew(vector)// Матрица искажения/** 3D */constmatrix=Matrix.lookAt(eye,center,up)// Видовая матрица (eye, center, up: Vector)constmatrix=Matrix.frustum(top,right,bottom,left,near,far)// Матрица пирамидального отсеченияconstmatrix=Matrix.ortho(top,right,bottom,left,near,far)// Матрица прямоугольного отсеченияconstmatrix=Matrix.perspective(fovy,aspect,near,far)// Матрица симметричной перспективной проекцииconstmatrix=Matrix.translateX(vector)// Матрица переноса по оси Xconstmatrix=Matrix.translateY(vector)// Матрица переноса по оси Yconstmatrix=Matrix.translateZ(vector)// Матрица переноса по оси Zconstmatrix=Matrix.translateXY(vector)// Матрица переноса по плоскости Zconstmatrix=Matrix.translateXZ(vector)// Матрица переноса по плоскости Yconstmatrix=Matrix.translateYZ(vector)// Матрица переноса по плоскости Xconstmatrix=Matrix.scaleX(factor)// Матрица масштабирования по оси Xconstmatrix=Matrix.scaleY(factor)// Матрица масштабирования по оси Yconstmatrix=Matrix.scaleZ(factor)// Матрица масштабирования по оси Zconstmatrix=Matrix.scaleXYZ(factor)// Матрица масштабирования по всем осям на одинаковые значенияconstmatrix=Matrix.rotate(vector,angle)// Матрица абсолютного поворота вокруг вектораconstmatrix=Matrix.rotateX(angle)// Матрица абсолютного поворота вокруг оси Xconstmatrix=Matrix.rotateY(angle)// Матрица абсолютного поворота вокруг оси Yconstmatrix=Matrix.rotateZ(angle)// Матрица абсолютного поворота вокруг оси Z/** Методы */constnumber=matrix.trace()// След матрицыconstempty=matrix.empty()// true, если все элементы матрицы = 0constidentity=matrix.identity()// true, если все элементы главной диагонали = 1/** Основные методы (const matrix = new Matrix(...)) */constmatx=matrix.transpose()// Транспонирование матрицыconstmatx=matrix.dot(factor)// Умножение матрицы на скаляр (scalar)constmatx=matrix.addition(M)// Сложение матрицconstmatx=matrix.multiply(M)// Умножение согласованных матрицconstmatx=matrix.translate(vector)// Операция переноса координатconstmatx=matrix.scale(vector)// Операция масштабирования координатconstmatx=matrix.vectorCol(vector)// Умножение матрицы на вектор-столбец справаconstmatx=matrix.vectorRow(vector)// Умножение матрицы (N x 1) на вектор-строку (N) слеваconstmatx=matrix.shiftDown()// Сдвиг квадратной матрицы внизconstmatx=matrix.shiftUp()// Сдвиг квадратной матрицы вверхconstmatx=matrix.shiftLeft()// Сдвиг квадратной матрицы влевоconstmatx=matrix.shiftRight()// Сдвиг квадратной матрицы вправоconstmatx=matrix.shiftUpRight()// Сдвиг квадратной матрицы вверх-вправоconstmatx=matrix.shiftUpLeft()// Сдвиг квадратной матрицы вверх-влевоconstmatx=matrix.shiftDownRight()// Сдвиг квадратной матрицы вниз-вправоconstmatx=matrix.shiftDownLeft()// Сдвиг квадратной матрицы вниз-влевоconstvec=matrix.transition(vector)// перевод системы координатconstvec=matrix.transitionInverse(vector)// перевод системы координат @slow/** Основные методы (с приведением размерностей) */constmatx=matrix.add(M)// Сложение матриц (с приведением размерностей)constmatx=matrix.mult(M)// Умножение матриц с с предварительным согласованием/** 2D */constmatx=matrix.rot(angle)// Операция поворота координатconstmatx=matrix.skew(vector)// Операция искажения (extended)constvec=matrix.transition2D(vector)// Перевод точек из одной СК окружения пера в другую через матрицу перехода/** 3D */constmatx=matrix.rotate(vector,angle)// Операция поворота координатconstmatx=matrix.inverse3D()// Обратная матрица к матрице модели для 3d графики (fast)constmatx=matrix.rotateX(angle)// Операция поворота координат вокруг оси Xconstmatx=matrix.rotateY(angle)// Операция поворота координат вокруг оси Yconstmatx=matrix.rotateZ(angle)// Операция поворота координат вокруг оси Zconstmatx=matrix.translateX(coord)// Операция переноса координат по оси Xconstmatx=matrix.translateY(coord)// Операция переноса координат по оси Yconstmatx=matrix.translateZ(coord)// Операция переноса координат по оси Zconstmatx=matrix.translateXY(x,y)// Операция переноса координат по плоскости Zconstmatx=matrix.translateXZ(x,z)// Операция переноса координат по плоскости Yconstmatx=matrix.translateYZ(y,z)// Операция переноса координат по плоскости Xconstmatx=matrix.scaleX(factor)// Операция масштабирования координат по оси Xconstmatx=matrix.scaleY(factor)// Операция масштабирования координат по оси Yconstmatx=matrix.scaleZ(factor)// Операция масштабирования координат по оси Zconstmatx=matrix.scaleXYZ(factor)// Операция масштабирования координат по всем осямconstvec=matrix.transitionInverse3D(vector)// перевод системы координат @slow/** Работа с различными векторами матрицы */constcolumns=matrix.cols()// Набор вектор-столбцов матрицы -> [...Vector]constrows=matrix.rows()// Набор вектор-строк матрицы -> [...Vector]constcolumn=matrix.col(index)// Вектор-столбец матрицы -> Vectorconstmatx=matrix.setCol(index,vector)// Замена столбца index в матрице на значения из вектораconstmatx=matrix.additionCol(index,vector)// Добавление к столбцу матрицы значение из вектораconstrow=matrix.row(index)// Вектор-строка матрицы -> Vectorconstmatx=matrix.setRow(index,vector)// Замена строки index в матрице на значения из вектораconstmatx=matrix.additionRow(index,vector)// Добавление к строке матрицы значение из вектораconstvector=matrix.diagonal()// Главная диагональ матрицы -> Vectorconstmatx=matrix.DIAGONAL(vector)// Замена главной диагонали матрицы -> Matrix/** Применение метода Гаусса */constmatx=matrix.inverse()// Обратная матрицаconstnumber=matrix.determinant()// Определитель матрицыconstnumber=matrix.rank()// Ранг матрицыconstvec=matrix.solve(vector)// Решение СЛАУ (Ax = B: matrix = A, vector = B)constobject=Matrix.gauss(matrix,w)// применение метода Гаусса/** Работа с минорами матрицы */constmatx=matrix.minor(row,col)// Минор матрицы по строке и столбцуconstmatx=matrix.minors(rows,cols)// Минор матрицы любого порядка по строкам и столбцамconstmatx=matrix.minore(from,to)// Минор матрицы любого порядка (from, to: Vector{x, y})/** Дополнительные методы (const matrix = new Matrix(...)) */constcompare=Matrix.compare(A,B,precision=0.0001)// -> boolean (сравнение матриц)constcopy=matrix.copy()// Копирование матрицыconststring=matrix.toString(precision=2)// Вывод матрицы в терминал @debugconstvector=matrix.vector()// Вектор из элементов матрицыconstvector=matrix.element(start,count)// Возврат элементов матрицы с любого места (по столбцам)constmatx=matrix.fill(start,array)// Заполнение элементов с любого места (по столбцам)constnumber=matrix.get(row,col)// Получение конкретного элемента матрицыconstmatx=matrix.set(row,col,value)// Установка конкретного элемента матрицыconstmatx=matrix.resize(height,width)// Изменение размеров матрицы/** Элементарные преобразования */constmatx=matrix.swapCol(a,b)// Обмен столбцов с номерами a и bconstmatx=matrix.swapRow(a,b)// Обмен строк с номерами a и bconstmatx=matrix.scaleCol(index,factor)// Умножение столбца матрицы на скалярconstmatx=matrix.scaleRow(index,factor)// Умножение строки матрицы на скалярconstmatx=matrix.additionCols(a,b,factor)// Добавление к столбцу столбца, помноженного на скалярconstmatx=matrix.additionRows(a,b,factor)// Добавление к строке строки, помноженной на скаляр/** Преобразования векторов через матрицы */constvec=Matrix.transition(matrix,vector)// перевод системы координатconstvec=Matrix.transition2D(matrix,vector)// Перевод точек из одной СК окружения пера в другую через матрицу переходаconstvec=Matrix.transitionInverse(matrix,vector)//constvec=Matrix.transitionInverse3D(matrix,vector)//Quatern- повороты, интерполяция (LERP)Matrix- мутабельные методы работы с элементами @faster, жорданки, расчет теней для 3d