Repository files navigation

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

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

Установка

$ npm install javascript-algebra

Настройка

importmaps

<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}...

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

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

Векторы могут быть любой размерности, хотя многие штуки дополнительно удобно сделаны для 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)// Приведение размерности векторов (выбор максимальной)

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

/** Создание кватерниона */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]

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

/** Создание матрицы */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)//

ROADMAP

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

About

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

Topics

Resources

Contributing

Stars

10 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

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

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

Установка

$ npm install javascript-algebra

Настройка

importmaps

<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}...

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

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

Векторы могут быть любой размерности, хотя многие штуки дополнительно удобно сделаны для 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)// Приведение размерности векторов (выбор максимальной)

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

/** Создание кватерниона */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]

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

/** Создание матрицы */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)//

ROADMAP

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

About

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

Topics

Resources

Contributing

Stars

10 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

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

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

Установка

$ npm install javascript-algebra

Настройка

importmaps

<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}...

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

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

Векторы могут быть любой размерности, хотя многие штуки дополнительно удобно сделаны для 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)// Приведение размерности векторов (выбор максимальной)

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

/** Создание кватерниона */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]

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

/** Создание матрицы */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)//

ROADMAP

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

About

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

Topics

Resources

Contributing

Stars

10 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

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

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

Установка

$ npm install javascript-algebra

Настройка

importmaps

<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}...

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

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

Векторы могут быть любой размерности, хотя многие штуки дополнительно удобно сделаны для 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)// Приведение размерности векторов (выбор максимальной)

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

/** Создание кватерниона */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]

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

/** Создание матрицы */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)//

ROADMAP

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

About

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

Topics

Resources

Contributing

Stars

10 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

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

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

Установка

$ npm install javascript-algebra

Настройка

importmaps

<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}...

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

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

Векторы могут быть любой размерности, хотя многие штуки дополнительно удобно сделаны для 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)// Приведение размерности векторов (выбор максимальной)

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

/** Создание кватерниона */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]

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

/** Создание матрицы */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)//

ROADMAP

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

About

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

Topics

Resources

Contributing

Stars

10 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

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

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

Установка

$ npm install javascript-algebra

Настройка

importmaps

<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}...

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

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

Векторы могут быть любой размерности, хотя многие штуки дополнительно удобно сделаны для 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)// Приведение размерности векторов (выбор максимальной)

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

/** Создание кватерниона */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]

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

/** Создание матрицы */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)//

ROADMAP

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

About

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

Topics

Resources

Contributing

Stars

10 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

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

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

Установка

$ npm install javascript-algebra

Настройка

importmaps

<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}...

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

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

Векторы могут быть любой размерности, хотя многие штуки дополнительно удобно сделаны для 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)// Приведение размерности векторов (выбор максимальной)

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

/** Создание кватерниона */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]

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

/** Создание матрицы */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)//

ROADMAP

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

About

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

Topics

Resources

Contributing

Stars

10 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

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

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

Установка

$ npm install javascript-algebra

Настройка

importmaps

<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}...

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

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

Векторы могут быть любой размерности, хотя многие штуки дополнительно удобно сделаны для 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)// Приведение размерности векторов (выбор максимальной)

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

/** Создание кватерниона */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]

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

/** Создание матрицы */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)//

ROADMAP

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

About

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

Topics

Resources

Contributing

Stars

10 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages