Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Графика методичка.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
106.5 Кб
Скачать

7. Добавление функции масштабирования изображения

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

При другом подходе пользователь непосредственно указывает прямоугольную область изображения, которую он хочет увидеть на экране увеличенной. Фрагменты, попавшие в указанную область, появятся на экране, а не попавшие подвергнутся отсечению. Такими свойствами обладает не что иное, как окно преобразования. Заданный пользователем прямоугольник - это образ будущего окна преобразования. Определяя прямоугольник, пользователь с помощью мыши задает пару точек в экранных координатах. Для того чтобы получить из них координаты окна необходимо применить к данным точкам обратное преобразование. Остается только перечертить изображение на экране с учетом изменившихся характеристик преобразования устройства.

Реализуете такой подход в нашей программе. Для этого вам потребуется новый тип курсора – «резиновый прямоугольник». Принципы его построения аналогичны принципам создания «резиновой нити». Не забудьте учесть ограничение, наложенное на окно - оно должно быть подобно полю вывода. Мы приняли отношение сторон равное единице, что присуще квадрату. В принципе, отношение сторон прямоугольников, определяющих окно и поле вывода, может быть любым – главное чтобы оно было одинаковым. Задается такое ограничение достаточно просто. Первая точка, определяющая прямоугольник, безусловно, принимается, а от второй точки берется одна из координат. Значение второй координаты рассчитывается исходя из требований ограничения.

Кроме того, необходим механизм, отменяющий увеличение. Самый простой способ – запомнить начальное преобразование и при необходимости восстановить его. Для пользователя удобнее использовать пошаговый откат, позволяющий последовательно отменять увеличения в порядке обратном их заданию. Для реализации пошагового отката требуется стек, в котором будут храниться описания преобразований (история). Как мы уже говорили, преобразование устройства полностью описывается характеристиками окна (в силу того, что поле вывода, у нас зафиксировано). Следовательно, каждая ячейка стека должна хранить координаты двух точек, определяющих окно. При каждом увеличении необходимо занести в стек координаты текущего окна. При выходе из увеличения мы просто восстанавливаем из стека предыдущие координаты окна.

В нашей программе появляется несколько функций, и необходимо разобраться, какую из них в данный момент хочет выполнить пользователь. То есть необходимо организовать поддержку диалога с пользователем. Задача сложная и выходящая за рамки нашего курса. Мы просто определим некоторую переменную, которая будет определять состояние системы на текущий момент времени. Разрешим ей принимать два значения – Lines (отрезки) и Zoom (лупа). По умолчанию установим значение Lines.

Теперь модифицируйте код нашей программы.

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

В обработчике события onMouseMove требуется учитывать состояние системы. Если система находится в состоянии Lines, то используем курсор – «резиновая нить», в противном случае (состояние Zoom) - «резиновый прямоугольник».

Действия по отпусканию кнопки мыши также зависят от состояния системы. В состоянии Lines необходимо вычертить отрезок. В другом случае набор действий более широк:

  • занести в стек характеристики текущего окна преобразования;

  • применить к веденным пользователем точкам прямоугольника обратное преобразование устройства, получив координаты нового окна;

  • заменить координаты текущего окна новыми значениями;

  • перевести систему в состояние Lines;

  • инициировать перерисовывание модели.

Нам потребуется создать две кнопки. Первая – “Увеличить”. При ее нажатии мы переводим систему в состояние “Zoom” (устанавливаем соответствующее значение переменной за него отвечающей за состояние). Вторая кнопка - «Отменить». Ее нажатие приводит к выполнению следующих действий:

  • извлечению из стека (если он не пуст) сохраненных при последнем увеличении координат окна преобразования;

  • замены текущих значений окна извлеченными значениями;

  • перечерчиванию модели.

Состояние системы при этом не изменяется (Lines).