В библиотеке Paper.js основным элементом для построения графики
является объект Path. Он представляет собой
последовательность сегментов, соединённых линиями или кривыми. Поведение
пути существенно зависит от того, является ли он замкнутым
(closed) или открытым (open).
Путь состоит из:
segments)Ключевое свойство:
path.closed
true — путь замкнутfalse — путь открытОткрытый путь — это последовательность сегментов, где первая и последняя точки не соединены.
var path = new Path();
path.add(new Point(50, 50));
path.add(new Point(150, 50));
path.add(new Point(150, 150));
path.strokeColor = 'black';
В этом примере создаётся ломаная линия из трёх точек.
Paper.js автоматически интерпретирует сегменты как кривые, если заданы управляющие векторы:
var path = new Path();
path.add(new Segment(new Point(50, 100), null, new Point(50, 0)));
path.add(new Segment(new Point(150, 100), new Point(-50, 0), null));
path.strokeColor = 'black';
Замкнутый путь — это путь, у которого последняя точка соединена с первой.
path.closed = true;
var path = new Path({
segments: [[50, 50], [150, 50], [150, 150]],
closed: true
});
fillColor)var path = new Path();
path.add(new Point(50, 50));
path.add(new Point(150, 50));
path.add(new Point(150, 150));
path.closed = true;
path.strokeColor = 'black';
path.fillColor = 'red';
| Характеристика | Открытый путь | Замкнутый путь |
|---|---|---|
| Соединение концов | Нет | Да |
| Заливка | Нет | Да |
| Использование | Линии, дуги | Фигуры |
Некоторые встроенные классы всегда создают замкнутые пути:
var circle = new Path.Circle({
center: [100, 100],
radius: 50,
fillColor: 'blue'
});
var rectangle = new Path.Rectangle({
point: [50, 50],
size: [100, 80],
fillColor: 'green'
});
Такие объекты по умолчанию имеют closed = true.
Путь можно динамически переключать между открытым и замкнутым состоянием:
path.closed = false; // открыть
path.closed = true; // замкнуть
Заливка работает только для замкнутых путей:
path.fillColor = 'yellow';
Если путь открыт — заливка не отображается.
Замкнутые пути имеют направление:
Это важно для:
nonzero, evenodd)Работают только с замкнутыми путями:
uniteintersectsubtractexcludeПример:
var path1 = new Path.Circle([100, 100], 50);
var path2 = new Path.Circle([150, 100], 50);
var result = path1.unite(path2);
result.fillColor = 'orange';
Если один из путей открыт — операция либо не выполнится, либо даст некорректный результат.
Открытые и замкнутые пути по-разному интерпретируются при вычислении длины:
var length = path.length;
Для замкнутых путей:
path.segments[0] === path.firstSegment
path.segments[path.segments.length - 1] === path.lastSegment
Но при этом:
var part = path.splitAt(50);
path1.join(path2);
Метод smooth() ведёт себя по-разному:
path.smooth();
if (path.closed) {
// замкнутый путь
} else {
// открытый путь
}
path.closed = true;
path.fillColor = 'blue';
Важно учитывать:
1. Отсутствие заливки Причина:
path.closed === false
2. Некорректные булевы операции Причина:
3. Непредсказуемое сглаживание Причина:
Замкнутые пути реагируют на клики внутри области:
project.hitTest(point);
Понимание различий между открытыми и замкнутыми путями лежит в основе работы с графикой в Paper.js и напрямую влияет на корректность визуализации, геометрических вычислений и взаимодействия с объектами.