Circle в библиотеке Paper.js представляет собой частный случай пути (Path), описывающий окружность. Несмотря на кажущуюся простоту, этот объект играет ключевую роль в создании графики, анимаций и интерактивных визуализаций благодаря гибкости настроек и тесной интеграции с другими элементами системы.
В Paper.js окружность создаётся через конструктор
Path.Circle. Существует несколько способов задания
параметров:
var circle = new Path.Circle({
center: [100, 100],
radius: 50,
fillColor: 'blue'
});
Ключевые параметры:
center — координаты центра окружностиradius — радиусfillColor — цвет заливкиvar center = new Point(200, 150);
var circle = new Path.Circle(center, 75);
circle.strokeColor = 'black';
var rectangle = new Rectangle(new Point(50, 50), new Size(100, 100));
var circle = new Path.Circle(rectangle);
В этом случае окружность вписывается в заданный прямоугольник.
Объект Circle наследует свойства класса Path, поэтому
обладает широким набором параметров.
console.log(circle.area);
console.log(circle.length);
circle.fillColor = 'red';
circle.strokeColor = 'black';
circle.strokeWidth = 2;
circle.opacity = 0.5;
Несмотря на то, что окружность выглядит как примитив, внутри она представлена как путь из сегментов.
console.log(circle.segments.length);
Обычно окружность состоит из 4 сегментов, соединённых кривыми Безье.
Каждый сегмент содержит:
point)handleIn,
handleOut)circle.position.x += 50;
circle.position.y += 20;
circle.scale(1.5);
circle.rotate(45);
Вращение происходит вокруг центра объекта, если не указано иное.
circle.skew(20, 10);
Paper.js предоставляет удобный механизм анимации через обработчик
onFrame.
function onFrame(event) {
circle.scale(1 + Math.sin(event.time) * 0.01);
}
В данном примере окружность плавно “пульсирует”.
Circle может реагировать на пользовательские действия:
circle.onCl ick = function(event) {
circle.fillColor = 'green';
};
circle.onMouseEn ter = function() {
circle.strokeColor = 'red';
};
circle.onMouseLe ave = function() {
circle.strokeColor = 'black';
};
Окружности можно объединять в группы:
var circle1 = new Path.Circle([100, 100], 40);
var circle2 = new Path.Circle([150, 100], 40);
var group = new Group([circle1, circle2]);
group.fillColor = 'purple';
Группа позволяет управлять несколькими объектами как единым целым.
Circle поддерживает операции над путями:
var result = circle1.unite(circle2);
result.fillColor = 'orange';
var intersection = circle1.intersect(circle2);
intersection.fillColor = 'red';
var difference = circle1.subtract(circle2);
difference.fillColor = 'blue';
var copy = circle.clone();
copy.position.x += 100;
Клон полностью повторяет исходный объект, включая стили.
circle.remove();
Удаляет объект из проекта.
for (var x = 0; x < 500; x += 50) {
for (var y = 0; y < 500; y += 50) {
new Path.Circle({
center: [x, y],
radius: 10,
fillColor: 'black'
});
}
}
function onFrame(event) {
circle.radius = 50 + Math.sin(event.time * 3) * 20;
}
function onMouseMove(event) {
new Path.Circle({
center: event.point,
radius: 5,
fillColor: 'blue'
});
}
removeOnMove() или
removeOnDown() для временных элементовCircle легко комбинируется с:
Path.RectanglePath.LinePath.StarCompoundPathПример:
var circle = new Path.Circle([200, 200], 80);
var rect = new Path.Rectangle([150, 150], [100, 100]);
var shape = circle.intersect(rect);
shape.fillColor = 'green';
Path.Circlecircle.radius += 1;
Важно: при прямом изменении радиуса Paper.js пересчитывает сегменты.
circle.position = otherObject.bounds.center;
circle.position.x = Math.min(Math.max(circle.position.x, 0), view.size.width);
Circle полностью подчиняется этим правилам, включая трансформации и вычисления.
Создание сложных сцен:
var circles = [];
for (var i = 0; i < 20; i++) {
var c = new Path.Circle({
center: Point.random() * view.size,
radius: 20,
fillColor: 'blue'
});
circles.push(c);
}
circles.forEach(function(c) {
c.fillColor.hue += 1;
});
circle.fillColor = {
gradient: {
stops: ['yellow', 'red']
},
origin: circle.bounds.topLeft,
destination: circle.bounds.bottomRight
};
Circle может использоваться как маска:
var mask = new Path.Circle([200, 200], 100);
var image = new Raster('image.jpg');
image.position = mask.position;
image.clipped = true;
Circle — это: