Пред.
След.
Макеты страниц
Распознанный текст, спецсимволы и формулы могут содержать ошибки, поэтому с корректным вариантом рекомендуем ознакомиться на отсканированных изображениях учебника выше Также, советуем воспользоваться поиском по сайту, мы уверены, что вы сможете найти больше информации по нужной Вам тематике ДЛЯ СТУДЕНТОВ И ШКОЛЬНИКОВ ЕСТЬ
ZADANIA.TO
2.6. АВТОМАТИЧЕСКИЙ ПОДБОР РАЗМЕРОВ И ПОЗИЦИИЧтобы картинка была нарисована в пределах границ области вывода, необходимо сначала выполнить отсечение по заданному окну, как было описано в параграфе 2.5, а затем отразить окно и его содержимое на область вывода, как было показано на рис. 2.4, Для большинства применений такая процедура вполне достаточна. Но в этом параграфе будет описан несколько иной подход, который отличается по следующим аспектам: 1) объект будет вычерчиваться целиком, так что отсечение не понадобится; 2) окно будет определено расчетом, а не задано заранее; 3) при отражении окна на область вывода будет использован одинаковый коэффициент масштабирования по обеим осям в горизонтальном и вертикальном направлениях. Из пункта 1 следует, что объект должен быть конечным. Для большинства применений это ограничение не является серьезным, но оно исключает панорамирование. Пункт 2 может быть реализован путем двойного просмотра данных, описывающих объект. Во время первого просмотра определяются границы окна Предположим, что на рис. 2.12 имеем заданный треугольник
Тогда расчетными значениями параметров окна будут
Заметим, что крайние точки объекта располагаются на границах окна, чего не было в случае, рассмотренном в параграфе 2.4.
Рис. 2.12. Объект, подлежащий масштабированию Чтобы предусмотреть некоторое свободное пространство со всех сторон экрана или листа бумаги, необходимо задать размеры области вывода несколько меньше, чем они могли быть на самом деле. Например, можно задать
Как в параграфе 2.4, выполним расчет коэффициентов масштабирования:
В качестве коэффициента масштабирования
Совершенно ясно, что такой одинаковый коэффициент масштабирования приведет к отображению треугольника, который точно равен по ширине размеру области вывода по оси х, но в направлении оси у останется свободное пространство. Его желательно распределить поровну между нижней и верхней частями области вывода. Это можно реализовать, если для расчета константы
Теперь для любой точки объекта
Составим программу, которая будет вычерчивать картинку, окно для которой не может быть задано заранее, и в этом примере будет освещено несколько новых аспектов языка Си. Используем случайные числа для генерации кривой непредсказуемой формы и размеров, где, как обычно, кривая аппроксимируется большим числом отрезков прямых линий. Автоматическое масштабирование и позиционирование позволяют решить задачу, практически не разрешимую иным путем. Для каждого отрезка будут генерироваться значения координат х и у, которые буду! записываться в файл на диске. Точнее говоря, будем записывать так называемые структуры, содержащие тройки
где пара
где координатам В программе генерацию кривой будем начинать с точки начала координат и перемещаться каждый раз на одну единицу расстояния. Всегда существует текущее направление (см. скан) (см. скан) В функции direction показано обращение к функции инициализации датчика случайных чисел srand. Ее аргумент seed определяет начальное значение для генерации случайных чисел. Функция time применяется для присвоения значения аргументу seed, зависящему от текущего времени. Таким образом будут генерироваться различные кривые при каждом новом запуске программы. Функция rand выдает большое неотрицательное целое число. Оно преобразуется в целое число в диапазоне от 0 до 12 путем использования остатка от деления на 13, то есть
Другие новые аспекты применения языка Си относятся к операциям ввода и вывода. Для большинства функций ввода/вывода в программу необходимо вставлять директиву (см. скан) Форматированный ввод/вывод имеет дело с читаемыми символами: имеется структура строк, аналогичная строкам на печатной странице. Неформатированные данные имеют такую же структуру, как они записаны в памяти. Например, целые числа представляются фиксированным количеством битов. В нашем случае с целью повышения эффективности был использован неформатированный ввод/вывод. Файл “открывается” обращением к функции Заметим, что в этой программе файл (см. скан) (см. скан) (см. скан) Аргументами функции init_viewport являются указатели. Обозначение
Рис. 2.13. Результат работы программ
|
1 |
Оглавление
|