В КУРСЕ?

Разбираемся в теме

Кнопка сдвинулась, проверка клика нет: зачем нужны локальные координаты?

На рисунке кнопка переместилась вправо, а программа продолжает реагировать на прежнее место. Такая ошибка может возникнуть, если изображение и проверка попадания используют разные отсчёты. Разобраться помогает простая модель: один прямоугольник, одна точка и только перенос без поворота или изменения размера. Все расстояния ниже измеряются в одинаковых условных единицах.

У одного места бывают два адреса

Назовём общими координатами положение относительно левого верхнего угла рисунка. Горизонтальное значение растёт вправо, вертикальное — вниз. Левый верхний угол кнопки находится в точке с координатами сто двадцать и пятьдесят. Внутри самой кнопки введём другой отсчёт: её левый верхний угол станет началом локальных координат. Теперь точку можно описать относительно рисунка целиком или относительно кнопки. Место от этого не меняется, меняются числа, которыми мы его обозначаем. Поэтому рядом с парой чисел необходимо понимать, к какой системе она относится. Без этого одинаково выглядящие значения легко сравнить ошибочно.

Вычитание переводит точку внутрь кнопки

Ширина нашей кнопки равна сорока, высота — двадцати. Предположим, нажатие произошло в общей точке сто тридцать пять и шестьдесят. Чтобы получить локальные координаты, вычтем положение угла кнопки по каждой оси: сто тридцать пять минус сто двадцать даёт пятнадцать, шестьдесят минус пятьдесят даёт десять. Полученная точка лежит внутри прямоугольника: она на пятнадцать единиц правее его левого края и на десять ниже верхнего. Для примера договоримся включать границу в область кнопки. Тогда допустимы локальные горизонтальные значения от нуля до сорока, а вертикальные — от нуля до двадцати включительно.

После переноса меняется начало отсчёта

Теперь сдвинем кнопку вправо: её угол окажется в общей точке сто шестьдесят и пятьдесят. Размеры сохраняются. Прежнее нажатие в точке сто тридцать пять и шестьдесят теперь получит локальные координаты минус двадцать пять и десять. Отрицательное первое значение показывает, что точка находится левее кнопки, поэтому попадания нет. Если проверка всё ещё вычитает старое положение угла, она ошибочно получит прежние пятнадцать и десять. Изображение уже обновилось, а расчёт использует устаревшие данные. Именно согласованность положения в рисовании и проверке важна для этой модели.

Обратный перевод проверяет вычисление

Чтобы перейти от локальных координат к общим, при простом переносе прибавляют положение начала. После сдвига локальная точка пятнадцать и десять станет общей точкой сто семьдесят пять и шестьдесят. Можно выполнить обратное вычитание и убедиться, что исходные локальные числа восстановились. Эта проверка помогает заметить перепутанный знак или использование координат другой системы. Она справедлива для нашей модели переноса. Поворот, масштабирование, прокрутка и различие единиц требуют соответствующих преобразований. Поэтому бумажный расчёт объясняет принцип, но не является готовой универсальной обработкой событий в любом графическом интерфейсе.

Попробуйте на практике

Проверьте два нажатия до и после переноса прямоугольной кнопки.

  1. Нарисуйте кнопку шириной сорок и высотой двадцать. Подпишите общие координаты её угла: сто двадцать и пятьдесят. Укажите направления осей.
  2. Переведите общую точку сто тридцать пять и шестьдесят в локальные координаты. Проверьте обе координаты по границам прямоугольника.
  3. Перенесите угол кнопки в точку сто шестьдесят и пятьдесят. Снова проверьте то же нажатие, используя новое положение угла.
  4. Найдите общие координаты точки, которая после переноса имеет локальные значения пятнадцать и десять. Проверьте ответ обратным вычитанием.

Как проверить результат. До переноса нажатие имеет локальные координаты пятнадцать и десять и попадает внутрь. После переноса его координаты равны минус двадцати пяти и десяти, поэтому оно снаружи. Новая общая точка для локальных пятнадцати и десяти — сто семьдесят пять и шестьдесят.

Частые вопросы

Достаточно ли проверить только горизонтальную координату?

Нет. В прямоугольной области обе координаты должны удовлетворять своим условиям. Точка может находиться между боковыми краями, но выше или ниже кнопки.

Нужно ли обязательно включать границу в область?

Это выбранное правило модели. В реальной задаче его задают явно и применяют одинаково при проверках, особенно если соседние области соприкасаются.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов