Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Дополнительное задание

Создайте приложение, включающее в себя 4 окна (поля вывода). В первом окне реализуйте возможность свободного рисования с помощью мыши. При нажатой кнопке за курсором должен оставаться точечный след. Во втором окне должны вычерчиваться отрезки с использованием курсора “резиновая нить”, показывающим положение создаваемого отрезка. В третьем окне - прямоугольники, в качестве курсора необходимо использовать “резиновый прямоугольник”. По нажатию правой кнопки мыши реализуйте режим перетаскивания нарисованных ранее прямоугольников. В последнем окне аналогичным образом должны вычерчиваться окружности.

 

Заключение.

 

В рамках данного занятия мы, с помощью графических средств среды Delphi, создали прототип простейшей интерактивной программы. В ходе ее мы коснулись многих основных компонент, которые включает в себя интерактивная графическая система. Еще раз перечислим их.

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

Модуль визуализации. Компонента системы, обеспечивающая создание визуального представления модели. Во многих системах реализуется на основе геометрического конвейера. Прямое преобразование координат, производимое нами при выводе примитивов, имеет непосредственное отношение к данному модулю.

Логические устройства ввода информации. Обеспечивают ввод графической информации в координатной системе модели, поддерживают необходимые типы курсоров и обеспечивают независимость от физических устройств.

Интерфейс пользователя – набор компонент, обеспечивающих взаимодействие пользователя с системой. К интерфейсу можно отнести меню, кнопки и другие визуальные объекты, созданные нами на экране. Обработчики событий и состояние системы, представленное в нашей программе совокупностью значений переменных, обеспечивают логику диалога с пользователем.

Реализовывать самостоятельно все компоненты графической системы сложно и трудоемко. Удобнее воспользоваться готовыми средствами. Реализации таких стандартов графического ядра как GKS или PHIGS предоставляют прикладному программисту наиболее полный набор необходимых компонент. Они предлагают средства логического ввода/вывода, структуры хранения данных для создания модели, видовой конвейер и другие компоненты.

Библиотеки класса OpenGL, DirectX предоставляют пользователю только средства связанные с выводом изображения, возлагая на прикладного программиста реализацию других компонент. Однако, на сегодняшний день они пользуются большой популярностью и последующие занятия мы посвятим работе с OpenGL.

7 Контрольные вопросы

1. Почему предпочтительнее использовать режим NotXor при имитации движения линии?

2. В обработчике, какого события целесообразно размещать код, восстанавливающий изображение?

3. Какие визуальные компоненты Delphi, предназначенные для вывода графического изображения, не требуют его восстановления при перечерчивании формы?

4. Перечислите основные свойства объекта Canvas.

5. К чему приведет изменение положения поля вывода (без изменения размеров) при неизменном окне преобразования?

6. Что произойдет с изображением, если увеличить окно преобразования?

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...