Якорные точки (anchors) — базовые элементы, определяющие форму кривых и сложных фигур в Two.js. Каждая точка хранит координаты и дополнительные параметры, влияющие на кривизну сегментов. В основе лежит использование кубических кривых Безье, где каждая точка может иметь управляющие векторы (handles), задающие направление входа и выхода линии.
Объект якорной точки представлен классом Two.Anchor,
который включает:
x, y — координаты точкиcontrols.left — управляющая точка для входящей
кривойcontrols.right — управляющая точка для исходящей
кривойcommand — тип сегмента (move,
line, curve, close)const anchor = new Two.Anchor(100, 100);
Расширенный вариант с управляющими точками:
const anchor = new Two.Anchor(
100, 100,
50, 50, // left control
150, 150, // right control
Two.Commands.curve
);
Ключевые свойства:
anchor.x, anchor.yanchor.controls.left.x,
anchor.controls.left.yanchor.controls.right.x,
anchor.controls.right.yКаждая якорная точка определяет, как соединяется с предыдущей:
Two.Commands.move — перемещение без рисованияTwo.Commands.line — прямая линияTwo.Commands.curve — кривая БезьеTwo.Commands.close — замыкание путиПример:
anchor.command = Two.Commands.line;
Управляющие точки определяют форму кривой между двумя якорями.
Левая управляющая точка влияет на входящую кривую Правая управляющая точка — на исходящую
anchor.controls.left.set(-20, 0);
anchor.controls.right.set(20, 0);
Смещение происходит относительно самой якорной точки.
Для преобразования кривой в прямую линию:
anchor.command = Two.Commands.line;
Для возврата кривизны:
anchor.command = Two.Commands.curve;
Удаление управляющих точек:
anchor.controls.left.clear();
anchor.controls.right.clear();
Путь (Two.Path) строится из массива якорных точек:
const path = new Two.Path([
new Two.Anchor(0, 0),
new Two.Anchor(100, 0),
new Two.Anchor(100, 100),
new Two.Anchor(0, 100)
], true);
Замкнутый путь задаётся вторым аргументом true.
Изменение координат:
anchor.x = 200;
anchor.y = 150;
Изменение управляющих точек:
anchor.controls.right.x = 30;
anchor.controls.right.y = 10;
После изменения сцена автоматически обновляется при следующем рендере.
Добавление:
path.vertices.push(new Two.Anchor(150, 150));
Удаление:
path.vertices.splice(index, 1);
После изменения массива вершин необходимо обновить флаг:
path._flagVertices = true;
Для плавных анимаций часто используется интерполяция:
anchor.x += (targetX - anchor.x) * 0.1;
anchor.y += (targetY - anchor.y) * 0.1;
Управляющие точки также можно интерполировать для сохранения формы кривой.
Для плавных кривых часто требуется зеркальность:
anchor.controls.left.x = -anchor.controls.right.x;
anchor.controls.left.y = -anchor.controls.right.y;
Это создаёт гладкие переходы без резких изломов.
Two.js поддерживает режим автоматического сглаживания:
path.curved = true;
Библиотека самостоятельно рассчитывает управляющие точки.
При отключённом curved требуется вручную задавать
контроллеры:
path.curved = false;
И затем:
anchor.controls.left.set(-10, -10);
anchor.controls.right.set(10, 10);
В замкнутом пути первая и последняя точки соединяются:
path.closed = true;
Управляющие точки крайних вершин влияют друг на друга, формируя непрерывную кривую.
Доступ к якорям:
const first = path.vertices[0];
Перебор:
path.vertices.forEach(anchor => {
anchor.x += 1;
});
Two.js использует флаги для отслеживания изменений:
_flagVertices_flagControlsПринудительное обновление:
path._flagVertices = true;
Пример деформации фигуры:
two.bind('upd ate', function() {
path.vertices.forEach((anchor, i) => {
anchor.y += Math.sin(i + Date.now() * 0.002);
});
});
Комбинирование сегментов:
const anchors = [
new Two.Anchor(0, 0),
new Two.Anchor(50, 100, 30, 0, -30, 0, Two.Commands.curve),
new Two.Anchor(100, 0)
];
const path = new Two.Path(anchors, false);
Изменение формы по синусоиде:
anchor.x += Math.cos(time) * 5;
anchor.y += Math.sin(time) * 5;
Поворот вокруг точки:
const dx = anchor.x - cx;
const dy = anchor.y - cy;
anchor.x = cx + dx * Math.cos(angle) - dy * Math.sin(angle);
anchor.y = cy + dx * Math.sin(angle) + dy * Math.cos(angle);
Управляющие точки задаются относительно якоря, что важно учитывать при трансформациях:
anchor.controls.left.se t(-anchor.controls.right.x, -anchor.controls.right.y);
_flagVerticesline и curve без контроля
переходовcurved = true вместе с ручными
контроллерамиconst path = two.makePath(0, 0, 100, 0, 100, 100, 0, 100, true);
two.bind('update', () => {
path.vertices.forEach((anchor, i) => {
anchor.x += Math.sin(i + performance.now() * 0.003) * 0.5;
anchor.y += Math.cos(i + performance.now() * 0.003) * 0.5;
});
});
Манипуляция якорными точками — основной инструмент построения сложной векторной графики в Two.js, обеспечивающий полный контроль над геометрией и поведением фигур.