JavaScript. Подробное руководство, 6-е издание, стр. 371

<b>function hitpath(context, event) {</b>

<b>  // Получить элемент &lt;canvas&gt; из объекта контекста</b>

<b>  var canvas = context.canvas;</b>

<b>  // Получить координаты и размеры холста</b>

<b>  var bb = canvas.getBoundingClientRect();</b>

<b>  // Преобразовать и масштабировать координаты события мыши в координаты холста</b>

<b>  var х = (event.clientX-bb.left)*(canvas.width/bb.width);</b>

<b>  var у = (event.clientY-bb.top)*(canvas.height/bb.height);</b>

<b>  // Вызвать isPointlnPath с преобразованными координатами</b>

<b>  return context.isPointInPath(x,y);</b>

<b>}</b>

Эту функцию

<b>hitpath()</b>
можно использовать в обработчиках событий, как показано ниже:

<b>canvas.onclick = function(event) {</b>

<b>  if (hitpath(this.getContext(&quot;2d&quot;), event) {</b>

<b>    alert(&quot;Ecть попадание!&quot;); // Щелчок в пределах текущего контура</b>

<b>  }</b>

<b>};</b>

Вместо проверки попадания в текущий контур с помощью метода

<b>getlmageData()</b>
можно определить, окрашен ли пиксел в точке события мыши. Если пиксел (или пикселы) под указателем мыши оказался полностью прозрачным, следовательно, под указателем мыши ничего не было нарисовано и щелчок был выполнен за пределами какой-либо фигуры. Пример 21.12 демонстрирует, как реализовать подобную проверку попадания.

Пример 21.12. Проверка наличия окрашенного пиксела в точке события мыши

<b>// Возвращает true, если указанное событие мыши возникло в точке,</b>

<b>// где находится непрозрачный пиксел,</b>

<b>function hitpaint(context, event) {</b>

<b>  // Преобразовать и масштабировать координаты события мыши в координаты холста</b>

<b>  var canvas = context.canvas;</b>

<b>  var bb = canvas.getBoundingClientRect();</b>

<b>  var x = (event.clientX-bb.left)*(canvas.width/bb.width);</b>

<b>  var у = (event.clientY-bb.top)*(canvas.height/bb.height);</b>

<b>  // Получить пиксел (или пикселы, если одному CSS-пикселу соответствует</b>

<b>  // несколько аппаратных пикселов)</b>

<b>  var pixels = с.getImageData(x,у,1,1);</b>

<b>  // Если хотя бы один пиксел имеет ненулевое значение альфа-канала,</b>

<b>  // вернуть true (попадание)</b>

<b>  for(var і = 3; і &lt; pixels.data.length; i+=4) {</b>

<b>    if (pixels.data[i] !== 0) return true;</b>

<b>  }</b>

<b>  // Иначе это был промах, return false;</b>

<b>}</b>

21.4.16. Пример использования элемента <canvas>: внутристрочные диаграммы

Закончим главу практическим примером рисования внутристрочных диаграмм. Внутристрочная диаграмма (sparkline) - это маленькое изображение (обычно некий график) предназначенное для отображения в потоке текста, например: Server load: 8. Термин «sparkline» был введен их автором Эдвардом Тафти (Edward Tufte), который описывает внутристрочные диаграммы так: «Маленькие графические изображения с высоким разрешением, встроенные в контекст окружающих их слов, чисел, изображений. Внутристрочная диаграмма -это простой в создании, тесно связанный с данными график, размер которого сопоставим с размером слова». (Подробнее о создании внутристрочных диаграмм см. в книге Эдварда Тафти «Beautiful Evidence» [Graphics Press].)

В примере 21.13 приводится относительно простой модуль на языке JavaScript, позволяющий вставлять в веб-страницы внутристрочные диаграммы. Порядок работы модуля описывается в комментариях. Обратите внимание, что в нем используется функция

<b>onLoad()</b>
из примера 13.5.

Пример 21.13. Реализация внутристрочных диаграмм с помощью элемента

<b>&lt;canvas&gt;</b>

<b>/*</b>

<b>* Отыскивает все элементы с CSS-классом &quot;sparkline&quot;, анализирует их содержимое</b>

<b>* как последовательность чисел и замещает их графическим представлением.</b>

<b>*</b>

<b>* Определить внутристрочную диаграмму в разметке можно так:</b>

<b>* &lt;span class=&quot;sparkline&quot;&gt;3 5 7 6 6 9 11 15&lt;/span&gt;</b>

<b>*</b>

<b>* Определить визуальное оформление диаграмм средствами CSS можно так:</b>

<b>* .sparkline { background-color: #ddd; color: red; }</b>

<b>*</b>

<b>* - Цвет кривой графика определяется CSS-свойством color вычисленного стиля.</b>

<b>* - Сами диаграммы являются прозрачными, поэтому сквозь них просвечивает фон страницы.</b>

<b>* - Высота диаграммы определяется атрибутом data-height, если он указан,</b>

<b>* или свойством font-size вычисленного стиля в противном случае.</b>

<b>* - Ширина диаграммы определяется атрибутом data-width, если он указан,</b>