В библиотеке Paper.js важную роль играют операции, связанные с
определением геометрической принадлежности: находится ли точка внутри
фигуры, пересекаются ли объекты, вложен ли один путь в другой. Эти
задачи решаются с помощью методов семейства contains, а
также вспомогательных механизмов анализа кривых и областей.
contains:
базовый принципМетод contains(point) используется для проверки, лежит
ли заданная точка внутри геометрического объекта.
Поддерживается для:
PathCompoundPathShapeПример:
var circle = new Path.Circle({
center: [100, 100],
radius: 50
});
var point = new Point(120, 120);
console.log(circle.contains(point)); // true или false
Paper.js использует алгоритм заливки (winding rule), чтобы определить принадлежность точки:
Тип правила влияет на результат при сложных самопересекающихся фигурах.
Для кривых (Path) результат зависит от того:
closed = true)fillColor)Если путь:
contains() всегда
возвращает falseCompoundPathCompoundPath — это составной путь, включающий несколько
вложенных путей.
Пример:
var outer = new Path.Circle([100, 100], 80);
var inner = new Path.Circle([100, 100], 40);
var compound = new CompoundPath({
children: [outer, inner]
});
В таком случае:
contains() зависит от направления
сегментовЕсли внутренний путь направлен противоположно внешнему:
Для определения, находится ли один объект внутри другого, применяется комбинация методов.
Наиболее распространённый способ — проверить ключевые точки объекта:
function isInside(pathA, pathB) {
return pathA.segments.every(function(segment) {
return pathB.contains(segment.point);
});
}
Недостатки:
bounds для предварительной проверкиПеред точной проверкой полезно использовать ограничивающие прямоугольники:
if (!pathB.bounds.contains(pathA.bounds)) {
return false;
}
Это:
Метод getIntersections() позволяет определить,
пересекаются ли два пути:
var intersections = pathA.getIntersections(pathB);
if (intersections.length === 0) {
// возможна вложенность
}
Полная проверка вложенности:
function isFullyInside(inner, outer) {
if (!outer.bounds.contains(inner.bounds)) return false;
if (inner.getIntersections(outer).length > 0) return false;
return outer.contains(inner.position);
}
Упрощённый вариант:
outer.contains(inner.position);
Подходит:
Не подходит:
Paper.js учитывает:
rotation)scale)position)Метод contains() автоматически работает в мировой
системе координат, поэтому дополнительные преобразования не
требуются.
Пути в Paper.js состоят из сегментов с кривыми Безье. Метод
contains():
Однако при очень сложных формах:
Если точка лежит точно на границе:
path.contains(point);
Результат может быть:
true или false в зависимости от численной
точностиДля явной проверки границы используется:
path.getNearestPoint(point).getDistance(point) < epsilon
где epsilon — малая величина (например, 0.1)
Направление пути (clockwise или
counterclockwise) влияет на:
CompoundPathПроверка направления:
path.clockwise
Изменение:
path.reverse();
Операции contains():
Оптимизация:
bounds перед точной проверкойfunction onMouseDown(event) {
if (path.contains(event.point)) {
console.log('Клик внутри');
}
}
if (zone.contains(object.position)) {
object.fillColor = 'green';
}
items.forEach(function(item) {
if (container.contains(item.position)) {
item.selected = true;
}
});
var shape = new CompoundPath({
children: [outerPath, innerPath]
});
shape.fillRule = 'evenodd';
Позволяет явно управлять логикой вложенности.
containsstrokeWidth)Для более сложных задач используются:
intersects() — проверка пересеченияsubtract() — геометрическая разностьunite() — объединение областейПример:
var result = pathA.subtract(pathB);
Если результат совпадает с pathA, значит
pathB не пересекает его.
contains() — основной инструмент проверки
принадлежности точки
вложенность объектов определяется комбинацией:
сложные формы требуют комбинированного анализа
направление сегментов критично для составных путей
оптимизация достигается через предварительные проверки и минимизацию вычислений