Векторы в Two.Vector

Two.Vector — это фундаментальный класс библиотеки Two.js, предназначенный для работы с векторами в двухмерном пространстве. Вектор представляет собой упорядоченную пару координат x и y, но его функциональность выходит далеко за пределы простого хранения чисел. Класс обеспечивает методы для арифметических операций, нормализации, вычисления длины и углов, что делает его незаменимым при работе с графикой и анимацией.

let v = new Two.Vector(100, 50);
console.log(v.x, v.y); // 100, 50

В конструкторе Two.Vector(x, y) параметры x и y по умолчанию равны нулю.


Основные свойства

  • x, y — координаты вектора.
  • length — длина вектора (рассчитывается как √(x² + y²)).
  • isZero() — проверяет, является ли вектор нулевым.
  • clone() — создаёт копию вектора.
  • toString() — выводит строковое представление вектора.

Пример вычисления длины и проверки нулевого вектора:

let v = new Two.Vector(3, 4);
console.log(v.length()); // 5
console.log(v.isZero()); // false

Арифметические операции

Two.Vector предоставляет методы для сложения, вычитания, умножения и деления векторов, как с другими векторами, так и со скалярами.

  • add(v) — прибавляет другой вектор.
  • sub(v) — вычитает другой вектор.
  • multiply(scalar) — умножает на число.
  • divide(scalar) — делит на число.
  • negate() — меняет направление на противоположное.
let a = new Two.Vector(2, 3);
let b = new Two.Vector(1, 1);

a.add(b);      // a теперь (3, 4)
a.sub(b);      // a теперь (2, 3)
a.multiply(2); // a теперь (4, 6)
a.divide(2);   // a теперь (2, 3)
a.negate();    // a теперь (-2, -3)

Эти операции модифицируют исходный вектор, что важно учитывать при работе с анимацией и математическими вычислениями.


Нормализация и длина

Нормализация вектора переводит его в единичный вектор, сохраняя направление, но делая длину равной 1. Это необходимо для вычисления направлений движения, углов и при работе с физикой.

let v = new Two.Vector(3, 4);
v.normalize();
console.log(v.length()); // 1

Дополнительно доступны методы:

  • set(x, y) — задаёт новые координаты.
  • setLength(length) — изменяет длину вектора, сохраняя направление.
  • distanceTo(v) — вычисляет расстояние до другого вектора.
  • distanceToSquared(v) — возвращает квадрат расстояния (эффективнее для вычислений).
let a = new Two.Vector(0, 0);
let b = new Two.Vector(3, 4);

console.log(a.distanceTo(b));        // 5
console.log(a.distanceToSquared(b)); // 25

Углы и направления

Важной частью работы с векторами является определение углов и направлений. Two.Vector предоставляет:

  • angle() — возвращает угол в радианах относительно оси X.
  • angleTo(v) — угол между двумя векторами.
  • rotate(theta) — поворачивает вектор на заданный угол в радианах.
let v = new Two.Vector(1, 0);
console.log(v.angle()); // 0
v.rotate(Math.PI / 2);
console.log(v.x, v.y); // 0, 1

Эти методы полезны при создании анимаций, вращении объектов и вычислении траекторий.


Скаляры и произведения

  • dot(v) — скалярное произведение, используется для вычисления угла между векторами и проекций.
  • cross(v) — псевдоскалярное произведение в 2D, указывает направление поворота.
let a = new Two.Vector(1, 0);
let b = new Two.Vector(0, 1);

console.log(a.dot(b));   // 0
console.log(a.cross(b)); // 1

Скалярное произведение позволяет определять, параллельны ли векторы, а псевдоскалярное — направление вращения.


Интерполяция и плавные переходы

Для создания анимаций и динамических эффектов Two.Vector предлагает:

  • lerp(v, t) — линейная интерполяция между двумя векторами. Параметр t от 0 до 1.
  • setTo(v) — мгновенно устанавливает координаты другого вектора.
let a = new Two.Vector(0, 0);
let b = new Two.Vector(10, 10);

a.lerp(b, 0.5); // a теперь (5, 5)

Это позволяет создавать плавное движение объектов, эффект «следования» за курсором и постепенные трансформации.


Примеры практического использования

Движение объекта вдоль направления:

let position = new Two.Vector(100, 100);
let velocity = new Two.Vector(2, 3);

function update() {
  position.add(velocity);
}

Вращение объекта вокруг точки:

let center = new Two.Vector(200, 200);
let point = new Two.Vector(250, 200);
point.sub(center).rotate(Math.PI / 180).add(center);

Реализация гравитации или силы притяжения:

let p1 = new Two.Vector(0, 0);
let p2 = new Two.Vector(100, 0);

let force = p2.clone().sub(p1).normalize().multiply(0.1);
p1.add(force);

Эти примеры демонстрируют, как Two.Vector становится основой для движений, столкновений и физики объектов в 2D пространстве.


Резюме возможностей

  • Представление координат и длины вектора.
  • Арифметические операции с векторами и скалярами.
  • Нормализация, изменение длины и копирование вектора.
  • Вычисление углов, поворотов и направлений.
  • Скалярные и псевдоскалярные произведения.
  • Линейная интерполяция и плавные трансформации.
  • Применение в анимациях, физике и динамической графике.

Two.Vector — универсальный инструмент, делающий работу с двумерными координатами эффективной и удобной, позволяя сосредоточиться на логике графики и анимации, а не на рутинных математических вычислениях.