Intersect — это ключевая операция в Paper.js, позволяющая находить точки пересечения между различными графическими объектами. Она широко используется при построении сложных форм, создании интерактивных эффектов и при анализе геометрических объектов.
В Paper.js для нахождения пересечения используются методы
getIntersections и
intersect объектов Path.
Пример нахождения пересечения двух линий:
var line1 = new Path.Line({
from: [50, 50],
to: [200, 200],
strokeColor: 'red'
});
var line2 = new Path.Line({
from: [50, 200],
to: [200, 50],
strokeColor: 'blue'
});
var intersections = line1.getIntersections(line2);
intersections.forEach(function(intersect) {
var point = intersect.point;
new Path.Circle({
center: point,
radius: 5,
fillColor: 'green'
});
});
getIntersections возвращает массив
объектов Intersection, каждый из которых содержит:
point — координаты точки пересечения;parameter — положение точки на пути (от 0 до 1);segment — сегмент, на котором произошло
пересечение.Особенности:
Для сложных форм, таких как многоугольники или кривые, пересечение
можно выполнить через метод
PathItem.intersect(path):
var circle = new Path.Circle({
center: [150, 150],
radius: 100,
strokeColor: 'orange'
});
var rectangle = new Path.Rectangle({
point: [100, 100],
size: [150, 150],
strokeColor: 'purple'
});
var result = circle.intersect(rectangle);
result.strokeColor = 'green';
Особенности работы:
intersect возвращает новый
объект PathItem, представляющий геометрию пересечения.Path.unite,
subtract и
exclude для сложных булевых операций над
формами.Иногда необходимо проверить, пересекаются ли объекты без построения
нового пути. Для этого используется метод
hitTest:
var path1 = new Path.Circle([150, 150], 50);
var path2 = new Path.Circle([180, 150], 50);
var hit = path1.hitTest(path2.bounds.center);
if(hit){
console.log('Пересечение есть');
}
Особенности:
hitTest возвращает объект HitResult или
null.tolerance.Paper.js позволяет сразу получить все точки пересечения между сложными объектами:
var star = new Path.Star({
center: [200, 200],
points: 5,
radius1: 50,
radius2: 100,
strokeColor: 'blue'
});
var circle = new Path.Circle({
center: [200, 200],
radius: 70,
strokeColor: 'red'
});
var intersections = star.getIntersections(circle);
intersections.forEach(function(i) {
new Path.Circle({
center: i.point,
radius: 4,
fillColor: 'black'
});
});
getIntersections работает для
любого типа PathItem, включая
CompoundPath.CurveКаждая кривая в Paper.js представлена объектом
Curve, у которого есть метод
getIntersections(curve), позволяющий
получить более точное пересечение:
var curve1 = new Path().add(new Point(50, 50)).cubicCurveTo(new Point(100, 150), new Point(150, 50), new Point(200, 150));
var curve2 = new Path().add(new Point(50, 150)).cubicCurveTo(new Point(100, 50), new Point(150, 150), new Point(200, 50));
var intersections = [];
curve1.curves.forEach(c1 => {
curve2.curves.forEach(c2 => {
intersections.push(...c1.getIntersections(c2));
});
});
Curve позволяет точнее контролировать
позиции пересечений на кривых Безье.Curve), чтобы избежать ошибок
округления.hitTest или предварительное
ограничение области через bounds.intersects().PathItem.flatten() перед пересечением.Использование Intersect и пересечений в Paper.js
открывает возможности для создания сложных графических алгоритмов, от
генеративного дизайна до интерактивных визуализаций и игр. Глубокое
понимание методов getIntersections, intersect
и работы с Curve обеспечивает точный контроль над
геометрией и визуализацией.