Векторы: Vec3

Координаты, расстояния, углы и преобразования в библиотеке tera-vec3.

Создание вектора

tera-vec3 — библиотека трехмерных векторов. Поля vec3 из определений пакетов представлены объектами с координатами x, y, z и методами Vec3.

const Vec3 = require('tera-vec3');
const a = new Vec3(1, 2, 3);
const b = new Vec3([1, 2, 3]);
const c = new Vec3({ x: 1, y: 2, z: 3 });

Конструктор и методы с аргументом-вектором принимают три числа, массив или объект. Отсутствующие координаты по умолчанию равны 0, остальные приводятся через Number(). Для mult/div отсутствующие координаты равны 1. Значение NaN не отбрасывается; преобразование неподходящего типа вроде Symbol может вызвать исключение JavaScript.

Методы с изменением объекта

Все следующие методы изменяют текущий вектор и возвращают this, поэтому вызовы можно объединять:

Метод Действие
add(vector), sub(vector) Покомпонентное сложение/вычитание
mult(vector), div(vector) Покомпонентное умножение/деление
scale(scalar) Умножение всех координат на число
rotate(radians) Поворот вокруг оси Z; Z не меняется
normalize() Приведение длины ненулевого вектора к 1
abs() Модуль каждой координаты
round() Округление координат до ближайших целых
const v = new Vec3(1, 2, 3);
v.add({ x: 3 });
// v is now 4,2,3

Методы с новым объектом

addN, subN, multN, divN, scaleN, rotateN, normalizeN, absN, roundN выполняют те же операции, но возвращают новый Vec3, сохраняя исходный.

const start = new Vec3(1, 2, 3);
const end = start.addN(1, 1, 1);
// start: 1,2,3; end: 2,3,4

При расчете по event.loc используйте вариант N или clone(), если не хотите изменить объект события. Для сохранения изменений пакета все равно требуется return true из обычного хука.

Измерения и сравнение

Метод Результат
length(), sqrLength() Длина и квадрат длины
dist2D(vector), sqrDist2D(vector) Расстояние и его квадрат без учета Z
dist3D(vector), sqrDist3D(vector) Расстояние и его квадрат по трем координатам
angleTo(vector) atan2 направления к другой точке в XY, в радианах
isNaN() Есть ли хотя бы одна координата NaN
equals(vector) Точное равенство всех координат
clone() Копия вектора
toString() Строка x,y,z
const delta = end.subN(start);
if (delta.sqrLength() > 0) delta.normalize();
const nearby = start.sqrDist2D(end) <= 50 * 50;

Особые случаи

Нормализация нулевого вектора дает NaN; сначала проверяйте длину. Деление на ноль может дать Infinity/NaN. isNaN() не обнаруживает Infinity — для внешних данных проверяйте Number.isFinite каждой координаты. В текущем scale используется Number(scalar) || 0, поэтому непреобразуемая строка становится масштабом 0. Для расчетов с погрешностью используйте расстояние/допуск, а не equals.

Источники: node_modules/tera-vec3/README.md, node_modules/tera-vec3/index.js.