Книга: JavaScript. Подробное руководство, 6-е издание
21.4.15. Определение попадания
21.4.15. Определение попадания
Метод isPointInPath()
позволяет узнать, находится ли указанная точка внутри (или на границе) текущего контура, и возвращает true, если это так, и false-в противном случае. Метод принимает координаты точки в не преобразованной системе координат по умолчанию. Это позволяет использовать метод для определения попадания: определения принадлежности точки, где был выполнен щелчок мышью, некоторой определенной фигуре.
Однако значения свойств clientX
и clientY
объекта MouseEvent
нельзя передать непосредственно методу isPointlnPath().
Во-первых, координаты события мыши следует преобразовать из координат объекта Window
в относительные координаты элемента <canvas>.
Во-вторых, если экранные размеры холста отличаются от его фактических размеров, координаты мыши необходимо перевести в соответствующий масштаб. В примере 21.11 показана вспомогательная функция, используемая для определения попадания точки события MouseEvent в текущий контур.
Пример 21.11. Проверка попадания точки события мыши в текущий контур
// Возвращает true, если указанное событие мыши возникло в текущем контуре
// в указанном объекте CanvasRenderingContext2D.
function hitpath(context, event) {
// Получить элемент <canvas> из объекта контекста
var canvas = context.canvas;
// Получить координаты и размеры холста
var bb = canvas.getBoundingClientRect();
// Преобразовать и масштабировать координаты события мыши в координаты холста
var х = (event.clientX-bb.left)*(canvas.width/bb.width);
var у = (event.clientY-bb.top)*(canvas.height/bb.height);
// Вызвать isPointlnPath с преобразованными координатами
return context.isPointInPath(x,y);
}
Эту функцию hitpath()
можно использовать в обработчиках событий, как показано ниже:
canvas.onclick = function(event) {
if (hitpath(this.getContext("2d"), event) {
alert("Ecть попадание!"); // Щелчок в пределах текущего контура
}
};
Вместо проверки попадания в текущий контур с помощью метода getlmageData()
можно определить, окрашен ли пиксел в точке события мыши. Если пиксел (или пикселы) под указателем мыши оказался полностью прозрачным, следовательно, под указателем мыши ничего не было нарисовано и щелчок был выполнен за пределами какой-либо фигуры. Пример 21.12 демонстрирует, как реализовать подобную проверку попадания.
Пример 21.12. Проверка наличия окрашенного пиксела в точке события мыши
// Возвращает true, если указанное событие мыши возникло в точке,
// где находится непрозрачный пиксел,
function hitpaint(context, event) {
// Преобразовать и масштабировать координаты события мыши в координаты холста
var canvas = context.canvas;
var bb = canvas.getBoundingClientRect();
var x = (event.clientX-bb.left)*(canvas.width/bb.width);
var у = (event.clientY-bb.top)*(canvas.height/bb.height);
// Получить пиксел (или пикселы, если одному CSS-пикселу соответствует
// несколько аппаратных пикселов)
var pixels = с.getImageData(x,у,1,1);
// Если хотя бы один пиксел имеет ненулевое значение альфа-канала,
// вернуть true (попадание)
for(var і = 3; і < pixels.data.length; i+=4) {
if (pixels.data[i] !== 0) return true;
}
// Иначе это был промах, return false;
}
- 21.4.1. Рисование линий и заливка многоугольников
- 21.4.2. Графические атрибуты
- 21.4.3. Размеры и система координат холста
- 21.4.4. Преобразование системы координат
- 21.4.5. Рисование и заливка кривых
- 21.4.6. Прямоугольники
- 21.4.7. Цвет, прозрачность, градиенты и шаблоны
- 21.4.8. Атрибуты рисования линий
- 21.4.9. Текст
- 21.4.10. Отсечение
- 21.4.11. Тени
- 21.4.12. Изображения
- 21.4.13. Композиция
- 21.4.14. Манипулирование пикселами
- 21.4.15. Определение попадания
- 21.4.16. Пример использования элемента : внутристрочные диаграммы
- 1.2. Определение количества информации. Единицы измерения количества информации
- Определение версии клиента
- Определение пользовательского формата числовых данных
- Определение целей. Построение цепочек
- Определение необходимого системного вызова
- Раздел 1 Лояльность: определение и ключевые факторы
- Определение позиционного уровня
- 3.3. Определение объектов защиты
- Определение собственной миссии
- Определение факторов риска
- Определение контекстно-связанных объектов
- Определение ОС