- •1 Основные компоненты для работы с графикой
- •2 Свойства класса тCanvas
- •3 Методы и события класса тCanvas
- •4. Разработка простой программы
- •5. Создание «резиновой нити»
- •6. Реализация преобразования координатных систем
- •7. Добавление функции масштабирования изображения
- •8. Дополнительное задание
- •9. Заключение.
- •7 Контрольные вопросы
6. Реализация преобразования координатных систем
Теперь попробуем преобразовать нашу систему из «рисовальной» в «чертежную». Ключевое различие будет в используемых координатных системах. До этого момента мы работали в координатной системе экрана. Ни один инженер не захочет, да и не сможет работать в экранных координатах. Следовательно, мы должны определить координатную систему, удобную пользователю и выполнять преобразования из данной системы в экранные координаты и наоборот. Такая координатная система называется модельной. Подобные преобразования выполняются с помощью двумерного видового конвейера, рассмотренного нами на лекции 3. Полная реализация конвейера достаточно сложна, поэтому мы существенно упростим задачу, оставив только одно преобразование. Вывод, по-прежнему, будем осуществлять в экранных координатах, а для описания элементов модели используем нормализованные координаты. В процессе нормализации приведем все координаты к диапазону от 0 до 1.
Для формирования преобразования нам необходимо определить две компоненты: окно, определяющее область видимости, и поле вывода, задающее место вывода изображения на экране.
В нашем случае вывод осуществляется с помощью визуального объекта PaintBox. Выбрав поле вывода, совпадающее по размерам с рабочей областью данного объекта и зафиксировав его, мы существенно упростим решение задачи. Во-первых, для описания преобразования достаточно будет знать только текущие координаты окна. Во-вторых, мы уйдем от проблемы отсечения части изображения, оказавшейся вне области видимости. Фрагменты модели, координаты которых попадают за пределы рабочей области объекта TPaintBox, просто не будут выводиться на экран. Эту задачу будет решать за нас операционная система. Такой подход, безусловно, не применим в реальной системе, так как существенно снижает ее эффективность. Отсечение обычно выполняется относительно окна до выполнения преобразований. Бессмысленно выполнять расчеты для объектов, которые в конечном итоге не будут видны.
Теперь рассмотрим, как определить окно преобразования. Его размеры и позиция определят видимую часть модели. Мы приводим модель к нормализованным координатам, следовательно, координаты окна тоже не должны выходить за пределы диапазона от 0 до 1. Положение и размер окна, как мы увидим позднее, будут меняться в ходе взаимодействия пользователя с программой. В качестве начальных значений удобно взять вершины с координатами (0,0) и (1,1). Это гарантирует нам то, что в момент запуска программы, модель будет видна полностью, конечно, если она существует. Модель можно заполнить значениями, сохраненными в файле после предыдущей сессии работы программы.
Не забудьте сделать поле вывода подобным окну (в нашем случае квадратным), иначе коэффициенты масштабирования по осям будут различны, и возникнет искажение формы.
Используя формулы, рассмотренные в лекционном материале, напишите процедуру, преобразующую координаты точки из нормализованных координат в экранные на основании характеристик окна и поля вывода. Это будет процедура, выполняющая прямое преобразование. Она будет использована нами при отображении модели на экране (можно написать отдельные функции для X и Y координат, так будет удобнее).
Напишите процедуру, выполняющую обратное преобразование – из экранных координат в нормализованные. Данная процедура необходима при вводе координат конечных точек создаваемых отрезков (так же можно выполнить в виде отдельных функций).
Модифицируйте написанный ранее код так, чтобы координаты точек линий, вводимые пользователем перед занесением в модель (в массив) подвергались обратному преобразованию. Обратите внимание на то, что координаты модели становятся вещественными (необходимо сделать соответствующие изменения в определении массива). Внесите также изменения в процедуру, создающую образ модели на экране. Перед построением каждого отрезка необходимо выполнить прямое преобразование его конечных точек.
Если вы правильно выполнили задание, то внешне, работа нашей программы должна остаться без изменений. Что дали нам внесенные изменения? Теперь наша модель описана в координатах не зависящих от устройства. Преобразование из нормализованных координат в экранные, и обратно, производится на основе масштабирования и переноса. Коэффициент масштабирования определиться коэффициентом подобия окна и поля вывода. Так как в исходном положении мы задали окно и поле вывода, начинающимися из инвариантной точки (0,0), то сдвиг можно исключить из рассмотрения. Следовательно, можно рассчитать масштабирующий коэффициент, связывающий размеры образов на экране с реальными размерами объектов.
