Для создания фигур в Two.js необходимо сначала инициализировать
экземпляр библиотеки и подготовить область рендеринга. Обычно это
делается с помощью конструктора Two и указания размеров
холста:
const elem = document.getElementById('draw-shapes');
const params = { width: 800, height: 600 };
const two = new Two(params).appendTo(elem);
Здесь elem — HTML-элемент контейнера, а
params определяет размеры холста. После этого можно
приступать к созданию фигур, линий и сложных композиций.
Two.js поддерживает несколько базовых примитивов: линии, прямоугольники, окружности, многоугольники и эллипсы. Каждое создание фигуры возвращает объект, который можно модифицировать через свойства и методы.
const line = two.makeLine(50, 50, 200, 200);
line.stroke = '#FF0000';
line.linewidth = 5;
makeLine(x1, y1, x2, y2) — координаты начала и конца
линии.stroke задает цвет линии.linewidth определяет толщину.const rect = two.makeRectangle(400, 300, 150, 100);
rect.fill = '#00FF00';
rect.stroke = '#000000';
rect.linewidth = 2;
makeRectangle(x, y, width, height) — позиция центра и
размеры.fill задает заливку фигуры.stroke и linewidth управляют
контуром.const circle = two.makeCircle(600, 150, 75);
circle.fill = 'blue';
circle.opacity = 0.7;
const ellipse = two.makeEllipse(200, 450, 100, 50);
ellipse.fill = 'orange';
ellipse.stroke = 'black';
makeCircle(x, y, radius) — создаёт окружность с центром
(x, y) и радиусом.makeEllipse(x, y, width, height) — создаёт эллипс с
указанными размерами.Two.js позволяет создавать многоугольники через массив вершин:
const vertices = [
new Two.Anchor(0, 0),
new Two.Anchor(100, 0),
new Two.Anchor(50, 80)
];
const polygon = two.makePolygon(vertices);
polygon.fill = 'purple';
polygon.stroke = 'black';
polygon.linewidth = 3;
Two.Anchor(x, y) — точка вершины.makePolygon(vertices) автоматически соединяет все точки
и замыкает фигуру.Для произвольных форм можно использовать путь через
makePath:
const path = two.makePath(
300, 300,
350, 350,
400, 300,
375, 250,
true // замкнутый путь
);
path.fill = 'cyan';
path.stroke = 'navy';
path.linewidth = 2;
true замыкает путь, превращая его в
фигуру.Для удобства управления несколькими фигурами применяется
Two.Group:
const group = two.makeGroup(rect, circle, ellipse);
group.translation.set(100, 50);
group.rotation = Math.PI / 6;
makeGroup объединяет объекты, позволяя управлять ими
как единым целым.translation, rotation,
scale применяются ко всей группе.Каждая фигура имеет набор ключевых свойств:
translation.x,
translation.yscale, scale.x,
scale.yrotation (в радианах)opacityfill, strokelinewidthcircle.translation.set(500, 400);
circle.rotation = Math.PI / 4;
circle.scale = 1.5;
circle.opacity = 0.5;
Two.js предоставляет встроенный цикл рендеринга и возможность динамически изменять свойства фигур:
two.bind('update', function(frameCount) {
circle.rotation += 0.02;
rect.translation.x += 1;
if(rect.translation.x > 800) rect.translation.x = 0;
}).play();
bind('update', callback) вызывается на каждом
кадре.rotation, translation,
scale создают плавные анимации.Для сложных форм можно использовать функцию генерации вершин:
function createStar(cx, cy, spikes, outerRadius, innerRadius) {
const vertices = [];
let angle = Math.PI / spikes;
for(let i = 0; i < 2 * spikes; i++) {
const r = (i % 2 === 0) ? outerRadius : innerRadius;
const x = cx + Math.cos(i * angle) * r;
const y = cy + Math.sin(i * angle) * r;
vertices.push(new Two.Anchor(x, y));
}
return two.makePolygon(vertices);
}
const star = createStar(400, 300, 5, 100, 50);
star.fill = 'gold';
star.stroke = 'red';
star.linewidth = 4;
Two.js поддерживает обработку событий через HTML-контейнер:
elem.addEventListener('click', function(e) {
circle.fill = circle.fill === 'blue' ? 'green' : 'blue';
});
update и
слушатели событий.bind('update').Этот подход обеспечивает гибкость и позволяет строить сложные динамические сцены, комбинируя простые и пользовательские фигуры, а также управлять ими в реальном времени.