У одного места бывают два адреса
Назовём общими координатами положение относительно левого верхнего угла рисунка. Горизонтальное значение растёт вправо, вертикальное — вниз. Левый верхний угол кнопки находится в точке с координатами сто двадцать и пятьдесят. Внутри самой кнопки введём другой отсчёт: её левый верхний угол станет началом локальных координат. Теперь точку можно описать относительно рисунка целиком или относительно кнопки. Место от этого не меняется, меняются числа, которыми мы его обозначаем. Поэтому рядом с парой чисел необходимо понимать, к какой системе она относится. Без этого одинаково выглядящие значения легко сравнить ошибочно.
Вычитание переводит точку внутрь кнопки
Ширина нашей кнопки равна сорока, высота — двадцати. Предположим, нажатие произошло в общей точке сто тридцать пять и шестьдесят. Чтобы получить локальные координаты, вычтем положение угла кнопки по каждой оси: сто тридцать пять минус сто двадцать даёт пятнадцать, шестьдесят минус пятьдесят даёт десять. Полученная точка лежит внутри прямоугольника: она на пятнадцать единиц правее его левого края и на десять ниже верхнего. Для примера договоримся включать границу в область кнопки. Тогда допустимы локальные горизонтальные значения от нуля до сорока, а вертикальные — от нуля до двадцати включительно.
После переноса меняется начало отсчёта
Теперь сдвинем кнопку вправо: её угол окажется в общей точке сто шестьдесят и пятьдесят. Размеры сохраняются. Прежнее нажатие в точке сто тридцать пять и шестьдесят теперь получит локальные координаты минус двадцать пять и десять. Отрицательное первое значение показывает, что точка находится левее кнопки, поэтому попадания нет. Если проверка всё ещё вычитает старое положение угла, она ошибочно получит прежние пятнадцать и десять. Изображение уже обновилось, а расчёт использует устаревшие данные. Именно согласованность положения в рисовании и проверке важна для этой модели.
Обратный перевод проверяет вычисление
Чтобы перейти от локальных координат к общим, при простом переносе прибавляют положение начала. После сдвига локальная точка пятнадцать и десять станет общей точкой сто семьдесят пять и шестьдесят. Можно выполнить обратное вычитание и убедиться, что исходные локальные числа восстановились. Эта проверка помогает заметить перепутанный знак или использование координат другой системы. Она справедлива для нашей модели переноса. Поворот, масштабирование, прокрутка и различие единиц требуют соответствующих преобразований. Поэтому бумажный расчёт объясняет принцип, но не является готовой универсальной обработкой событий в любом графическом интерфейсе.
Попробуйте на практике
Проверьте два нажатия до и после переноса прямоугольной кнопки.
- Нарисуйте кнопку шириной сорок и высотой двадцать. Подпишите общие координаты её угла: сто двадцать и пятьдесят. Укажите направления осей.
- Переведите общую точку сто тридцать пять и шестьдесят в локальные координаты. Проверьте обе координаты по границам прямоугольника.
- Перенесите угол кнопки в точку сто шестьдесят и пятьдесят. Снова проверьте то же нажатие, используя новое положение угла.
- Найдите общие координаты точки, которая после переноса имеет локальные значения пятнадцать и десять. Проверьте ответ обратным вычитанием.
Как проверить результат. До переноса нажатие имеет локальные координаты пятнадцать и десять и попадает внутрь. После переноса его координаты равны минус двадцати пяти и десяти, поэтому оно снаружи. Новая общая точка для локальных пятнадцати и десяти — сто семьдесят пять и шестьдесят.
Частые вопросы
Достаточно ли проверить только горизонтальную координату?
Нет. В прямоугольной области обе координаты должны удовлетворять своим условиям. Точка может находиться между боковыми краями, но выше или ниже кнопки.
Нужно ли обязательно включать границу в область?
Это выбранное правило модели. В реальной задаче его задают явно и применяют одинаково при проверках, особенно если соседние области соприкасаются.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.