PixiJS предоставляет мощный инструмент для создания графики на основе
WebGL и Canvas через класс Graphics,
который позволяет рисовать примитивы, включая линии, многоугольники,
окружности и эллипсы. Для создания окружности или эллипса используется
метод drawCircle и
drawEllipse соответственно.
const graphics = new PIXI.Graphics();
// Пример окружности
graphics.beginFill(0xff0000); // цвет заливки
graphics.lineStyle(2, 0x000000); // толщина и цвет контура
graphics.drawCircle(150, 150, 50); // x, y, радиус
graphics.endFill();
app.stage.addChild(graphics);
Ключевые моменты:
beginFill(color, alpha) — начинает заливку фигуры. Цвет
задается в формате 0xRRGGBB, alpha по умолчанию равен
1.lineStyle(width, color, alpha) — задает стиль контура.
Если не вызывать, контур не будет отображаться.drawCircle(x, y, radius) — рисует окружность с центром
в (x, y) и радиусом radius.endFill() — завершает заливку текущей фигуры.Для эллипсов используется аналогичный подход:
graphics.beginFill(0x00ff00);
graphics.lineStyle(3, 0x000000);
graphics.drawEllipse(300, 150, 80, 50); // x, y, радиусы по осям
graphics.endFill();
app.stage.addChild(graphics);
Особенности метода drawEllipse:
x центра эллипса.y центра эллипса.PixiJS позволяет комбинировать цвета контура и заливки с прозрачностью. Можно использовать альфа-канал для создания полупрозрачных фигур:
graphics.beginFill(0x0000ff, 0.5); // синяя заливка с 50% прозрачностью
graphics.lineStyle(4, 0xff00ff, 0.8); // фиолетовый контур с 80% прозрачностью
graphics.drawEllipse(500, 200, 100, 60);
graphics.endFill();
Хотя drawCircle создаёт идеальную окружность, иногда
требуется более точная настройка, например, для сегментов или дуг. Для
этого применяется arc:
graphics.beginFill(0xffff00);
graphics.lineStyle(2, 0x000000);
graphics.arc(200, 400, 70, 0, Math.PI / 2); // дуга от 0 до 90 градусов
graphics.endFill();
Параметры arc:
x, y — центр дуги.radius — радиус.startAngle и endAngle — углы в
радианах.anticlockwise — необязательный параметр, направление
рисования дуги.Для эллипсов с сегментами необходимо использовать трансформации, так
как встроенной функции ellipseArc нет. Создание
эллиптической дуги можно осуществить через
arc и масштабирование контейнера:
const ellipseContainer = new PIXI.Container();
ellipseContainer.scale.set(1.5, 1); // масштаб по осям
app.stage.addChild(ellipseContainer);
const ellipseSegment = new PIXI.Graphics();
ellipseSegment.beginFill(0xffa500);
ellipseSegment.lineStyle(2, 0x000000);
ellipseSegment.arc(0, 0, 50, 0, Math.PI); // полу-дуга
ellipseSegment.endFill();
ellipseContainer.addChild(ellipseSegment);
ellipseContainer.position.set(400, 400);
PixiJS позволяет динамически изменять размеры и свойства фигур для создания анимации. Например, изменение радиуса окружности по времени:
let radius = 10;
app.ticker.add(() => {
graphics.clear();
graphics.beginFill(0xff0000);
graphics.drawCircle(150, 150, radius);
graphics.endFill();
radius += 1;
if (radius > 100) radius = 10;
});
Одним из преимуществ Graphics является возможность
комбинировать несколько фигур в одном объекте:
graphics.clear();
graphics.lineStyle(2, 0x000000);
graphics.beginFill(0xff0000);
graphics.drawCircle(100, 100, 50);
graphics.endFill();
graphics.beginFill(0x00ff00);
graphics.drawEllipse(300, 100, 80, 40);
graphics.endFill();
Можно создавать сложные композиции с перекрывающимися заливками,
изменяя порядок вызова beginFill и draw для
достижения нужного визуального эффекта.
Хотя PixiJS рендерит фигуры на канвас напрямую, для сохранения
изображения можно использовать метод
renderer.extract.canvas или
renderer.extract.base64:
const canvas = app.renderer.extract.canvas(graphics);
document.body.appendChild(canvas); // вывод на страницу
const base64 = app.renderer.extract.base64(graphics);
console.log(base64); // строка с изображением в формате PNG
Это позволяет интегрировать динамически сгенерированные окружности и эллипсы в веб-приложения, игры или интерактивные визуализации.
При работе с большим количеством окружностей и эллипсов рекомендуется:
Graphics, когда
возможно.clear() только при необходимости.generateTexture() и использование спрайтов для
рендеринга.Эти подходы позволяют создавать сложные визуальные сцены с высокой производительностью даже на устройствах с ограниченными ресурсами.