В библиотеке Paper.js метод getIntersections
используется для вычисления точек пересечения между геометрическими
объектами. Он является частью API класса Item и чаще всего
применяется к объектам типа Path, CompoundPath
и другим производным.
Метод возвращает массив объектов пересечений
(CurveLocation), каждый из которых содержит подробную
информацию о точке пересечения: координаты, параметры кривых и ссылки на
участвующие сегменты.
var intersections = path1.getIntersections(path2);
path1 — первый объект (Path)path2 — второй объект (Path)intersections — массив найденных пересеченийЕсли второй аргумент не передан, метод ищет самопересечения:
var intersections = path.getIntersections();
Каждый элемент массива — это объект CurveLocation,
содержащий:
point — координаты точки пересечения
(Point)index — индекс сегмента в кривойparameter — положение на кривой (от 0 до 1)curve — ссылка на кривую (Curve)path — путь, к которому принадлежит точкаintersection — связанный объект пересечения на другом
путиПример доступа:
intersections.forEach(function(loc) {
console.log(loc.point); // координаты точки
});
var path1 = new Path.Line({
from: [50, 50],
to: [150, 150],
strokeColor: 'black'
});
var path2 = new Path.Line({
from: [50, 150],
to: [150, 50],
strokeColor: 'black'
});
var intersections = path1.getIntersections(path2);
intersections.forEach(function(loc) {
new Path.Circle({
center: loc.point,
radius: 5,
fillColor: 'red'
});
});
Результат: одна точка пересечения, визуально отмеченная кругом.
Метод работает не только с прямыми линиями, но и с кривыми Безье:
var path1 = new Path.Circle({
center: [100, 100],
radius: 50,
strokeColor: 'blue'
});
var path2 = new Path.Rectangle({
point: [80, 80],
size: [100, 60],
strokeColor: 'green'
});
var intersections = path1.getIntersections(path2);
В этом случае может быть найдено несколько точек пересечения.
Если вызвать getIntersections без аргументов, будут
найдены точки, где путь пересекает сам себя:
var path = new Path({
segments: [
[50, 50],
[150, 150],
[50, 150],
[150, 50]
],
closed: true,
strokeColor: 'black'
});
var intersections = path.getIntersections();
Такой подход полезен при анализе сложных форм или выявлении ошибок в геометрии.
Каждая точка пересечения содержит параметр parameter,
определяющий положение на кривой:
0 — начало сегмента1 — конец сегментаЭто позволяет выполнять точную интерполяцию:
var loc = intersections[0];
var curve = loc.curve;
var pointAt = curve.getPointAtTime(loc.parameter);
Метод getIntersections может быть ресурсоёмким, особенно
при работе с:
Рекомендации:
simplify())bounds) для предварительной
фильтрацииПример проверки перед вычислением:
if (path1.bounds.intersects(path2.bounds)) {
var intersections = path1.getIntersections(path2);
}
Иногда требуется выбрать только определённые точки пересечения:
По координате:
var filtered = intersections.filter(function(loc) {
return loc.point.x > 100;
});
По сегменту:
var filtered = intersections.filter(function(loc) {
return loc.index === 0;
});
Каждый объект CurveLocation содержит ссылку
intersection, указывающую на соответствующую точку на
другом пути:
var loc1 = intersections[0];
var loc2 = loc1.intersection;
console.log(loc1.point.equals(loc2.point)); // true
Это важно при симметричных вычислениях и анализе взаимодействия объектов.
1. Детекция столкновений
if (path1.getIntersections(path2).length > 0) {
console.log('Столкновение обнаружено');
}
2. Разделение путей Использование пересечений для разрезания кривых:
var loc = intersections[0];
var newPath = path1.splitAt(loc);
3. Построение сложных фигур Пересечения используются
при булевых операциях (unite, intersect,
subtract).
Для анализа удобно визуализировать точки пересечения:
intersections.forEach(function(loc) {
var marker = new Path.Circle({
center: loc.point,
radius: 3,
fillColor: 'red'
});
var text = new PointText({
point: loc.point.add([5, -5]),
content: loc.index,
fillColor: 'black',
fontSize: 10
});
});
getIntersections часто используется вместе с:
splitAt() — разделение путиgetLocationAt() — получение позиции на кривойgetNearestLocation() — поиск ближайшей точкиintersect() — булево пересечениеintersect()| Метод | Назначение |
|---|---|
getIntersections |
Получение точек пересечения |
intersect |
Создание нового пути пересечения |
Пример:
var shape = path1.intersect(path2);
Здесь возвращается новый Path, а не массив точек.
Метод корректно обрабатывает сложные пути:
var compound = new CompoundPath({
children: [path1, path2]
});
var intersections = compound.getIntersections(otherPath);
Пересечения вычисляются для всех вложенных путей.
При работе с кривыми Безье важно учитывать:
Для повышения стабильности:
paper.settings.insertItems = false;
Или использовать округление координат:
var rounded = loc.point.round();
При динамических сценах пересечения пересчитываются на каждом кадре:
function onFrame() {
var intersections = path1.getIntersections(path2);
}
Важно контролировать нагрузку и оптимизировать количество объектов.
Метод всегда возвращает массив:
if (intersections.length === 0) {
console.log('Нет пересечений');
}
Это позволяет избежать ошибок при доступе к элементам.
В сложных сценах возможны множественные пересечения:
Для устранения дубликатов:
var unique = [];
intersections.forEach(function(loc) {
if (!unique.some(p => p.equals(loc.point))) {
unique.push(loc.point);
}
});
Метод реализует поиск решений системы уравнений кривых:
Это делает getIntersections универсальным инструментом
для геометрических вычислений.
getIntersections — ключевой механизм анализа
взаимодействия объектов, лежащий в основе:
Его грамотное использование позволяет строить точные, управляемые и математически корректные графические приложения.