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