В библиотеке Paper.js проверка того, находится ли точка внутри
графического объекта, реализуется через метод
isInside(point). Этот механизм лежит в основе интерактивных
сценариев: обработка кликов, выделение фигур, определение пересечений
пользовательского ввода с геометрией сцены.
Метод применяется к объектам типа Item (в частности,
Path, Shape, CompoundPath) и
возвращает логическое значение:
true — точка находится внутри фигурыfalse — точка находится снаружиvar path = new Path.Circle({
center: [100, 100],
radius: 50,
fillColor: 'blue'
});
var point = new Point(120, 120);
console.log(path.isInside(point)); // true или false
Метод принимает объект Point или массив координат
[x, y].
Определение “внутри” зависит от формы объекта:
closed = true) используется
алгоритм определения точки внутри полигонаfalse,
так как у линии нет площадиfill-rule)Paper.js использует стандартные подходы вычислительной геометрии:
Суть:
Учитывает направление обхода сегментов:
В Paper.js правило выбирается автоматически в зависимости от структуры пути.
closedvar path = new Path({
segments: [[0, 0], [100, 0], [100, 100]],
closed: false
});
console.log(path.isInside([50, 50])); // false
Даже если точки визуально образуют область, без
closed = true метод не будет считать её замкнутой.
CompoundPath)var compound = new CompoundPath({
children: [
new Path.Circle([100, 100], 50),
new Path.Circle([100, 100], 20)
],
fillColor: 'black'
});
console.log(compound.isInside([100, 100]));
Особенности:
Если точка лежит точно на границе:
path.isInside(point);
Результат может зависеть от:
Чаще всего такие точки считаются внутренними, но это не гарантировано.
Метод isInside учитывает все трансформации:
path.scale(2);
path.rotate(45);
path.isInside(point); // корректно учитывает изменения
Все вычисления происходят в глобальной системе координат проекта.
Типичный сценарий — обработка кликов:
function onMouseDown(event) {
if (path.isInside(event.point)) {
path.fillColor = 'red';
}
}
Метод используется для:
isInside — относительно дорогая операция:
Рекомендации:
boundsif (path.bounds.contains(point) && path.isInside(point)) {
// более эффективная проверка
}
bounds как предварительной проверкиbounds.contains(point) работает значительно быстрее:
if (path.bounds.contains(point)) {
if (path.isInside(point)) {
// точное попадание
}
}
Это уменьшает количество дорогостоящих проверок.
hitTestМетод hitTest:
project.hitTest(point);
Отличается:
isInside:
var items = project.activeLayer.children;
items.forEach(function(item) {
if (item.isInside(point)) {
item.fillColor = 'green';
}
});
Важно учитывать:
Для путей с кривыми:
var path = new Path({
segments: [[0, 0], [100, 50], [50, 100]],
closed: true
});
path.smooth();
Метод корректно учитывает:
opacity)1. Игровая логика
if (enemyZone.isInside(player.position)) {
triggerAlarm();
}
2. Графические редакторы
3. Визуализация данных
Для сложных путей:
var isPointInside = path.isInside.bind(path);
Позволяет избежать повторного поиска метода.
При большом количестве объектов:
var result = path1.unite(path2);
result.isInside(point);
После объединения:
Для визуализации проверяемой точки:
new Path.Circle({
center: point,
radius: 3,
fillColor: 'red'
});
Помогает:
Метод isInside:
Правильное применение обеспечивает точное и эффективное определение принадлежности точки области в сложных графических сценах.