Эллипс — один из базовых примитивов векторной графики, представляющий
собой замкнутую кривую, задаваемую двумя осями: горизонтальной и
вертикальной. В библиотеке Paper.js эллипсы реализуются как частный
случай пути (Path), что позволяет применять к ним весь
спектр операций: трансформации, стилизацию, анимацию и логические
операции.
В Paper.js эллипс создаётся с помощью конструктора
Path.Ellipse. Существует несколько способов задания
параметров.
1. Через прямоугольную область:
var ellipse = new Path.Ellipse({
rectangle: new Rectangle(new Point(50, 50), new Size(200, 100)),
fillColor: 'blue'
});
rectangle определяет область, в которую вписывается
эллипс2. Через центр и радиусы:
var ellipse = new Path.Ellipse({
center: [200, 200],
radius: [100, 50],
strokeColor: 'black'
});
center — координаты центраradius — массив из двух значений: радиусы по X и YЭллипс в Paper.js обладает всеми свойствами пути (Path),
но при этом имеет специфические особенности:
Пример доступа к границам:
console.log(ellipse.bounds);
Эллипсы поддерживают все стандартные стили:
ellipse.fillColor = 'red';
ellipse.strokeColor = 'black';
ellipse.strokeWidth = 5;
ellipse.opacity = 0.5;
Градиенты:
ellipse.fillColor = {
gradient: {
stops: ['yellow', 'orange']
},
origin: ellipse.bounds.leftCenter,
destination: ellipse.bounds.rightCenter
};
Эллипс можно масштабировать, вращать и перемещать:
ellipse.scale(1.5);
ellipse.rotate(45);
ellipse.translate(new Point(100, 0));
Особенности:
radius, но визуально
изменяет ориентациюХотя эллипс создаётся как примитив, внутри он представлен кривыми Безье.
console.log(ellipse.segments.length);
Каждый сегмент содержит:
point)handleIn,
handleOut)Это позволяет:
Пример деформации:
ellipse.segments[0].point.x += 20;
Эллипсы часто используются в анимации:
function onFrame(event) {
ellipse.scale(1 + Math.sin(event.time) * 0.01);
}
Другой пример — движение:
function onFrame(event) {
ellipse.position.x += 1;
}
Эллипсы можно комбинировать с другими фигурами:
var circle = new Path.Circle({
center: [250, 200],
radius: 80
});
var result = ellipse.unite(circle);
result.fillColor = 'green';
Доступные операции:
unite — объединениеintersect — пересечениеsubtract — вычитаниеvar copy = ellipse.clone();
copy.position.x += 150;
Клон наследует:
Центр эллипса доступен через position:
ellipse.position = new Point(300, 300);
Также можно использовать:
bounds.centerbounds.topLeftЭллипс уже является Path, но может быть
модифицирован:
ellipse.flatten(10);
flatten разбивает кривую на линейные сегментыЭллипсы реагируют на события мыши:
ellipse.onCl ick = function(event) {
this.fillColor = 'random';
};
Другие события:
onMouseEnteronMouseLeaveonMouseDragОсобенности работы с большим количеством эллипсов:
Symbol для повторяющихся объектовПример с символом:
var symbol = new Symbol(ellipse);
for (var i = 0; i < 50; i++) {
var instance = symbol.place([Math.random() * 500, Math.random() * 500]);
}
Эллипсы широко используются:
Эллипс можно использовать как маску:
var image = new Raster('image.jpg');
image.clipMask = true;
ellipse.addChild(image);
Или как путь движения:
var point = ellipse.getPointAt(ellipse.length / 2);
Эллипсы в Paper.js не являются математически идеальными — они представлены кривыми Безье. Это даёт:
Но важно учитывать:
bounds и
radiusellipse.bringToFront();
ellipse.sendToBack();
Это важно при наложении нескольких фигур.
ellipse.remove();
Или очистка слоя:
project.activeLayer.removeChildren();
var group = new Group([ellipse]);
group.rotate(30);
Группы позволяют управлять несколькими объектами как единым целым.
Создание сетки эллипсов:
for (var x = 0; x < 500; x += 60) {
for (var y = 0; y < 500; y += 60) {
new Path.Ellipse({
center: [x, y],
radius: [20, 10],
fillColor: 'blue'
});
}
}
var length = ellipse.length;
var point = ellipse.getPointAt(length / 4);
Позволяет:
function onFrame(event) {
ellipse.scale(1, 1 + Math.sin(event.time) * 0.02);
}
Создаёт эффект “дыхания”.
Эллипс в Paper.js:
PathЭто делает его универсальным инструментом для построения как простых, так и сложных графических сцен.