В Two.js кривые представляют собой последовательность опорных точек (вершин), между которыми библиотека автоматически вычисляет плавные переходы. Это достигается за счёт встроенной системы интерполяции, которая преобразует набор дискретных точек в непрерывную геометрическую форму.
Ключевым элементом является объект Two.Path, содержащий
массив вершин (vertices). Каждая вершина может включать
дополнительные управляющие параметры, позволяющие формировать кривизну
сегмента.
const path = new Two.Path([
new Two.Anchor(0, 0),
new Two.Anchor(100, 50),
new Two.Anchor(200, 0)
], true);
Параметр true указывает, что путь должен быть
замкнутым.
Каждая вершина (Two.Anchor) содержит:
x, ycontrols.left,
controls.rightcommandПо умолчанию Two.js автоматически рассчитывает управляющие точки, если вершины заданы без них. Это позволяет быстро создавать сглаженные линии без ручной настройки.
const anchor = new Two.Anchor(100, 100);
При необходимости можно явно задать управляющие точки:
anchor.controls.left.set(-20, 0);
anchor.controls.right.set(20, 0);
Two.js использует алгоритмы сглаживания, аналогичные кривым Безье.
При включённом флаге curved библиотека:
path.curved = true;
В этом режиме:
Автоматическое вычисление основано на следующих принципах:
Для каждой вершины вычисляется вектор направления:
tangent = nextVertex - previousVertex
Этот вектор нормализуется и используется как основа для управляющих точек.
Длина управляющих векторов пропорциональна расстоянию между соседними вершинами:
controlLength = distance * smoothingFactor
Затем:
Для гладкой кривой используется симметрия:
controls.left = -controls.right
Это обеспечивает плавность без изломов.
Two.js не предоставляет явного параметра “жёсткости” кривой, однако поведение можно контролировать косвенно:
Чем ближе точки — тем более резкая кривая.
Резкие углы создают более выраженные изгибы.
Позволяет переопределить автоматическое поведение.
Two.js допускает смешанный режим:
const a = new Two.Anchor(0, 0);
const b = new Two.Anchor(100, 100);
b.controls.left.set(-50, 0);
b.controls.right.set(50, 0);
const c = new Two.Anchor(200, 0);
const path = new Two.Path([a, b, c]);
path.curved = true;
В этом случае:
b использует ручные настройкиПри замыкании пути (closed = true) алгоритм учитывает
циклическую структуру:
path.closed = true;
Особенности:
Two.js автоматически пересчитывает кривые при изменении вершин:
path.vertices[1].x += 10;
path.vertices[1].y += 20;
После изменения:
При использовании анимации это позволяет создавать плавные морфинги форм.
Изменяя координаты вершин во времени, можно получать динамические эффекты:
two.bind('upd ate', function() {
path.vertices.forEach((v, i) => {
v.y += Math.sin(Date.now() * 0.001 + i) * 0.5;
});
});
Особенности:
Чтобы уменьшить сглаживание:
path.curved = false;
Создание дополнительных точек уменьшает плавность:
new Two.Anchor(100, 100),
new Two.Anchor(105, 102),
new Two.Anchor(110, 100)
Явное задание коротких управляющих векторов:
anchor.controls.left.se t(-5, 0);
anchor.controls.right.set(5, 0);
Автоматическое вычисление кривых требует дополнительных ресурсов:
Рекомендации:
curved = false, если сглаживание не
требуетсяДля отладки полезно отображать контролы:
path.vertices.forEach(v => {
const left = two.makeCircle(
v.x + v.controls.left.x,
v.y + v.controls.left.y,
3
);
const right = two.makeCircle(
v.x + v.controls.right.x,
v.y + v.controls.right.y,
3
);
left.fill = 'red';
right.fill = 'blue';
});
Это позволяет:
Для сложных задач рекомендуется:
Автоматическое вычисление кривых используется для:
Пример волнообразной линии:
const points = [];
for (let i = 0; i < 20; i++) {
points.push(new Two.Anchor(i * 20, 200));
}
const wave = new Two.Path(points, false);
wave.curved = true;
two.bind('update', function() {
wave.vertices.forEach((v, i) => {
v.y = 200 + Math.sin(i + Date.now() * 0.002) * 20;
});
});
Автоматическая интерполяция делает движение плавным без дополнительной логики.
Кривые могут комбинироваться с:
Two.Group)Это позволяет строить сложные сцены с минимальными усилиями, опираясь на автоматическую генерацию геометрии.
При изменении пути:
curved = true)Это происходит автоматически при каждом кадре, если сцена активна.
Основные свойства:
path.curved = true;
path.closed = false;
path.automatic = true;
curved — включает сглаживаниеclosed — замыкает путьautomatic — управляет автоматическим пересчётом
контроловОтключение автоматического режима:
path.automatic = false;
Теперь все управляющие точки должны задаваться вручную.
В одном пути могут сочетаться:
Это достигается через настройку отдельных вершин:
anchor.command = Two.Commands.line;
или
anchor.command = Two.Commands.curve;
Такой подход позволяет точно контролировать форму, сохраняя преимущества автоматической интерполяции.
Автоматическое вычисление кривых в Two.js представляет собой баланс между простотой и гибкостью:
Эта модель делает библиотеку особенно удобной для визуализации и интерактивной графики, где важна скорость разработки и визуальная плавность, а не математическая точность кривых.