Графика Турбо-Паскаля. Динамические изображения

Министерство образования и науки Российской федерации

Бузулукский гуманитарно-технологический институт

(филиал) государственного образовательного учреждения

Высшего профессионального образование –

«Оренбургский государственный университет»





Факультет промышленности и транспорта



Кафедра физики, информатики, математики









Оценка: ____________

«____»_________2009г.







КУРСОВАЯ РАБОТА

по дисциплине «Языки и системы программирования»



ТЕМА

Графика Турбо-Паскаля. Динамические изображения



БГТИ (филиал) ГОУ ВПО ОГУ 050501.65.5.2.09.9 ПЗ





Пояснительная записка

на 25 листах









Студентка группы: 07ПО

_______ Городецкая А.А.

                

Руководитель:

________Литвинова С.А.

                  







Бузулук 2009 

                                                                       Кафедра физики, информатики, 

                                                                   математики 

Утверждаю 

Зав. кафедрой 

____________ Степунина О.А. 

«__» ________________2009г. 

















Задание на курсовую работу





Студентке Городецкой Анне Александровне

Тема работы: Графика Турбо-Паскаля. Динамические изображения.

Срок сдачи студенткой законченной работы 10.12.2009г. 

Перечень подлежащих разработке в работе вопросов: 

Изучить теоретические основы рассматриваемого вопроса. 

Разработать программу, реализующую движение по траектории графического объекта. 

Разработка программы, реализующей  перемещение по экрану окружности

Перечень графического материала: рисунок, таблицы















Дата выдачи задания: 31.10.2009г.

Руководитель: __________ Литвинова С.А.

Задание приняла к исполнению: «__» ___________ 2009г.

___________________  Городецкая А.А.

Содержание







	Введение	4

	Раздел 1. Теоретическая часть	5

	1.1 Текстовый и графический режимы	5

	1.2 Графические координаты	6

	1.2.1 Переключение между текстовым и графическим режимами	7

	1.3 Процедуры и функции	10

	1.3.1 Установка цвета линии, типа линии и закраски	10

	1.3.2 Точки на экране	12

	1.3.3 Линии и прямоугольники	12

	1.3.4 Окружности, эллипсы, дуги.	13

	1.3.5 Сектор	14

	1.3.6 Многоугольники	14

	1.3.7 Вывод изображений в относительных координатах.	15

	1.3.8 Работа с текстами в графическом режиме.	16

	1.4 Графические окна	18

	1.5 Программирование движущихся объектов	19

	Раздел 2. Практическая часть	20

	2.1 Разработка программы, реализующей движение по траектории графического объекта.	20

	2.2 Разработка программы, реализующей  перемещение по экрану окружности	21

	Заключение	24

	Список использованных источников	25

	







Введение



Язык Turbo Pascal предоставляет целый ряд процедур и других средств, позволяющих рисовать на экране разноцветные точки, отрезки прямых, дуги, закрашенные и не закрашенные окружности, прямоугольники, а также выполнять ряд других действий.

Все средства для работы с графикой находятся в модуле GRAPH, поэтому он должен быть подключен в программе перед тем, как начать работу: 

USES Graph;

Инициализация графики производится с помощью процедуры InitGraph:

InitGraph(var d, t, ‘’)

Переменная d определяет тип видеоадаптера, t – тип графического режима. Если переменной d присвоить значение Detect, то Паскаль сам определит установленный видеоадаптер и установит самый мощный из имеющихся графический режим. Для проверки успешности инициализации графики можно использовать процедуру GraphResult. Если графика была успешно инициализирована, то процедура GraphResult вернет значение grOk. 

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



Раздел 1. Теоретическая часть

1.1 Текстовый и графический режимы

	

Известно, что основным устройством для вывода информации, в том числе и результатов работы программы, является монитор компьютера. Монитор внешне очень похож на телевизор, но у него имеется важная особенность. Эта особенность заключается в том, что у телевизора один-единственный (с точки зрения вывода изображения) режим работы, а у компьютерного монитора их два. Это текстовый и графический режимы.



Рисунок 1 – Графический режим



Различие между текстовым и графическим режимами работы монитора заключается в возможностях управления выводом визуальной информации. В текстовом режиме минимальным объектом, отображаемым на экране, является символ, алфавитно-цифровой или какой-либо иной. В обычных условиях экран монитора, работающего в текстовом режиме (алфавитно-цифрового дисплея), может содержать не более 80 символов по горизонтали и 25 символов по вертикали, то есть всего 2000 визуальных объектов. При этом имеются ограниченные возможности по управлению цветом символов. Конечно, в таком режиме можно выводить на экран не только обычный текст, но и некие графические изображения (например, таблицы), однако понятно, что качество таких изображений будет вне всякой критики. Но для серьезной работы с изображениями текстовый режим дисплея абсолютно не подходит.

В графическом режиме минимальным объектом, выводом которого может управлять программист, является так называемый пиксель (от английского pixel, возникающего в результате объединения слов "рисунок" (picture) и "элемент" (element). Пиксель представляет собой не что иное, как точку с тремя цветами. Его геометрические размеры определяются разрешением монитора. Разрешение монитора обычно задается в виде rx * ry, где rx – количество пикселей на экране по горизонтали, а  ry – количество пикселей по вертикали. На практике используются не произвольные, а некоторые определенные значения разрешения. Такими разрешениями являются, например, 320х200, 640х480, 800х600, 1024х768, 1280х1024 и т.д. Даже в случае самого грубого разрешения изображение в графическом режиме формируется с помощью 64000 графических элементов.

Можно рассуждать и геометрически. Размер экрана – величина фиксированная. Если величина диагонали экрана 14 дюймов, его геометрические размеры составляют примерно 28х20 см. Размер пикселя можно приблизительно получить, разделив размер экрана на разрешение. Геометрические размеры пикселя определяют степень детализации изображения, его качество. Имеется, правда, минимально допустимое значение размера пикселя, определяемое техническими параметрами монитора.



1.2 Графические координаты



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

Графические координаты задают положение точки на экране дисплея. Поскольку минимальным элементом, к которому имеет доступ программист, является пиксель, естественно в качестве графических координат использовать порядковые номера пикселей. Допустимый диапазон изменения графических координат составляет [0,rx-1] для х-координаты и [0,ry-1] для y-координаты.

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

Проблема заключается в том, что при разработке программы график или другое изображение обычно проектируется в привычной декартовой системе координат. Но для правильного отображения такого графика на экране необходимо учесть различие между декартовой и графической системами координат. Таких различий три:

		Графические координаты принимают только целочисленные значения.

		Графические координаты принимают значения, ограниченные как снизу (нулевым значением), так и сверху (значением разрешения).

		Графическая координата y отсчитывается сверху вниз.

Таким образом, декартовы координаты точки (x,y) для отображения ее на экране следует пересчитать в графические (xg,yg) по формулам

xg=|sx * x|+dx;

yg=ry-|sy * y|-dy,

где |x| - целая часть х; sx и sy – масштабные множители, выбираемые из условия

rx=|sx * xmax|+1,

ry=|sy * ymax|+1.

Здесь xmax и ymax – максимальные значения геометрических координат. Пересчет координаты y по такой же формуле, что и для х, привел бы к зеркально отраженному относительно горизонтальной линии изображению. Слагаемые dx и dy обеспечивают смещение изображения относительно левого верхнего угла экрана. Изображение будет смещено в центр экрана при

dx=|rx/2|,

dy=|ry/2|.

Чтобы изображение не зависело от разрешения, в Турбо Паскале используются функции GetMaxX и GetMaxY, возвращающие наибольший и номер пикселя по горизонтали и по вертикали соответственно. Графические координаты правого нижнего угла экрана равны (GetMaxX, GetMaxY).



1.2.1 Переключение между текстовым и графическим режимами



Работа дисплея невозможна без специальных микросхем, управляющих его работой. Видеоадаптер должен поддерживать работу дисплея в графическом режиме. Турбо Паскаль обеспечивает работу со следующими видеоадаптерами: CGA, MCGA,EGA, VGA, Hercules, AT&T 400, 3270 PC, IBM-8514.

Работой видеоадаптера управляет специальная программа, которая называется драйвером. Драйвер хранится в отдельном файле на диске и содержит как исполняемый код, так и необходимые ему для работы данные. Признак файла с драйвером – расширение .bgi имени файла. Имя файла с драйвером соответствует типу видеоадаптера вашего компьютера.

Переключение в графический режим и работа в нем реализованы в Турбо Паскале в виде набора процедур, находящихся в специальном модуле graph.tpu. Работа этого модуля основана на использовании так называемого графического интерфейса Борланд (BGI – Borland Graphics Interface), специализированной графической библиотеки. Основное достоинство этого интерфейса заключается в том, что он прост в изучении и вполне подходит для программирования несложных графических программ.

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

Модуль Graph должен явно подключаться к программе с помощью оператора использования Uses, записываемого после заголовка программы:

Program Grafics;

Uses Graph;

Программа при переключении в графический режим должна определить тип видеоадаптера. Это можно сделать, явно указав в программе тип видеоадаптера или дав программе возможность самостоятельно определить значение соответствующих параметров. Для этого необходимо ввести переменную целого типа, ее идентификатор можно обозначить d. При явном определении видеоадаптера в программе должен присутствовать оператор присваивания: d:=value;

где value – это любое некоторое число (таблица 1), либо встроенная константа (встроенные константы не надо описывать специально, так как их описания содержатся в модулях). 

Некоторые возможные значения value приведены в таблице1.



	Таблица1 – Тип видеоадаптера

Константа

Значение

CGA

MCGA

EGA

EGA64

EGAMono

HercMono

AT&T400

VGA

PC3270

1

2

3

4

5

7

8

9

10

         




При автоматическом распознавании видеоадаптера в правой части оператора присваивания используется константа Detect (или нулевое значение).

	d:=Detect;		d:=0.

Второе, что должна сделать программа – задать определенный графический режим. Большинство видеоадаптеров могут работать в нескольких графических режимах. Эти режимы различаются прежде всего разрешением и набором доступных цветов. Для этого следует ввести еще одну переменную целого типа, назовем ее t или GraphMode. Некоторые допустимые значения приведены в таблице:



Таблица 2 – Графические режимы

Константа

Значение

Описание графического режима

EGALo

0

640x200, 16 цветов, 4страницы

EGAHi

1

640x350,16 цветов, 2 страницы

EGA64Lo

0

640x200, 16 цветов, 1 страница

EGA64Hi

1

640x350, 4 цвета, 1 страница

VGALo

0

640x200, 16 цветов, 4 страницы

VGAMed

1

640x350, 16 цветов, 2 страницы

VGAHi

2

640х480, 16 цветов, 1 страница

VGAHi2

3

640х480, 2 цвета, 1 страница



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

Переключение в графический режим работы дисплея выполняется вызовом процедуры InitGraph из модуля Graph.

Описание:

InitGraph(var d, t, ‘’);

Первый параметр в этой процедуре задает тип видеоадаптера, второй определяет режим. И параметр d, и параметр t являются параметрами-переменными (var). Параметр ‘’ определяет путь доступа к каталогу (маршрут), в котором находятся графические драйверы. Если этот параметр пуст, то подразумевается, что файлы драйверов содержатся в текущем каталоге.

Процедура InitGraph инициализирует графическую систему и переводит аппаратуру в графический режим.

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

Описание: 

GraphResult    Тип результата: Целый (Integer).

Определены следующие коды ошибок:

- 1 графика не установлена (используйте процедуру InitGraph);

- 2 графическая аппаратура не найдена;

- 3 драйвер графического устройства не найден;

- 4 неверный файл драйвера графического устройства;

- 5 не хватает памяти для загрузки драйвера;

- 6 выход за границы при просмотре области закраски;

- 7 выход за границы памяти при закрашивании;

- 8 файл шрифта не найден;

- 9 не хватает памяти для загрузки шрифта;

- 10 недопустимый графический режим для выбранного драйвера.

	Завершение работы в графическом режиме производится с помощью процедуры CloseGraph, которая выгружает драйвер из памяти и восстанавливает предыдущий видеорежим. 

 	

1.3 Процедуры и функции

1.3.1 Установка цвета линии, типа линии и закраски



При работе с цветными изображениями большое значение имеет набор цветов, доступных программисту. Количество доступных для воспроизведения цветов определяется возможностями аппаратуры, то есть дисплея и видеоадаптера, а также видеорежимом. В программировании обычно используется схема цветового представления, в которой считается, что каждый цвет является смесью трех основных цветов: красного Red), зеленого (Green) и синего (Blue), а оттенок определяется интенсивностью компонентов. Эта схема называется RGB-представлением. Использование RGB-представления связано с конструктивными особенностями электронно-лучевой трубки, в которой каждая графическая точка состоит из трех компонентов: красного, зеленого, синего. При инициализации видеорежима компьютер создает цветовую палитру, которую можно считать таблицей, где каждому цвету сопоставлен свой номер. 

При работе с цветом в режиме VGA интенсивность основного цвета задается значением типа Word. Шестнадцатицветная палитра VGA приведена в таблице (в процедурах можно использовать как константы цветов, так и их коды):

Таблица 3 – Коды цветов

Цвет

Константа

Код

Черный

Синий

Зеленый

Бирюзовый

Красный

Малиновый

Коричневый

Светло-серый

Темно-серый

Светло-синий

Светло-зеленый

Светло-бирюзовый

Светло-красный

Светло-малиновый

Желтый

Белый

Black

Blue

Green

Cyan

Red

Magenta

Brown

LightGray

DarkGray

LightBlue

LightGreen

LightCyan

LightRed

LightMagenta

Yellow

White

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15



Процедура SetColor.

	Используя палитру устанавливает текущий цвет линий.

Описание: SetColor (цвет: Word)

	Цвета линий могут принимать значения в диапазоне от 0 до 15 в зависимости от используемого графического драйвера и графического режима.

Процедура SetBkColor.

	Используя палитру устанавливает текущий фоновый цвет.

Описание: SetBkColor (цвет: Word)

	Цвет фона может принимать значение в диапазоне от 0 до 15 (смотрите таблицу цветов).



Процедура SetFillStyle.

	Данная процедура устанавливает тип (стиль) закраски и ее цвет. 

Описание:SetFillStyle(стиль: Word; цвет: Word;)

В Турбо Паскале имеется 12 стилей заполнения:

- EmptyFill (0) – сплошное заполнение цветом фона;

- SolidFill (1) – сплошное заполнение заданным цветом;

 - LineFill (2) – заполнение горизонтальными линиями;

- LtSlashFill (3) – диагональное заполнение;

- SlashFill (4) – диагональное заполнение толстыми линиями;

- BkSlashFill (5) – обратное диагональное заполнение толстыми линиями;

- LtBkSlashFill (6) – обратное диагональное заполнение;

- HatchFill (7) – клетчатое заполнение;

- XHatchFill (8) – косое клетчатое заполнение;

- InterLeaveFill (9) – чередующееся линейное заполнение;

- WideDotFill (10) – редко расположенные точки;

- CloseDotFill (11) – часто расположенные точки;

- UserFill (12) – стиль определен пользователем.

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



Процедура SetLineStyle.

Функция: Устанавливает текущую толщину и тип линии.

Описание: SetLineStyle (тип_строки, образец, толщина).

Примечания: Данная процедура влияет на все типы линий, вычерчиваемых процедурами Line, LineTo, Rectangle, DrawPoly, Arc, Circle и др.

Могут вычерчиваться непрерывные, пунктирные линии, линии, состоящие из точек или точек и тире.

Описаны следующие константы типа линии:

SolidLn=0 – непрерывная линия;

DottedLn=1 – линия из точек;

CenterLn=2 – линия из точек и тире;

DashedLn=3 – пунктирная линия;

UserDilLn=4 – тип, определяемый пользователем.

Описаны следующие константы для толщины линий:

NormWidth=1 – нормальная толщина;

ThickWidth=3 – жирная линия.





Процедура FloodFill

Функция: Заполняет ограниченную область, используя текущий заполнитель.

Описание: FloodFill (x, y, граница).

Примечания: Эта процедура используется для заполнения замкнутой области (для растровых устройств). Точка (x, y) является внутренней точкой заполняемой области. Для заполнения области, ограниченной цветом, который определяет параметр "граница", используется текущий образец закраски. Если точка (x, y) находится внутри замкнутой области, то заполняется внутренняя область. Если эта точка находится вне замкнутой области, то заполняется ее внешняя часть (поле экрана, не входящее в область).



1.3.2 Точки на экране



Процедура PutPixel

Рисует точку на экране в заданном месте заданным цветом.

Описание: PutPixel (x, y, цвет).

Примечания: Выводит точку на экране с координатами (x, y) заданным цветом (параметр "цвет").



1.3.3 Линии и прямоугольники



Для вывода линий и прямоугольников в модуле Graph имеются несколько процедур.

Процедура Line

Функция: рисует прямую линию из точки (x1, y1) в точку (x2, y2).

Описание: Line (x1, y1, x2, y2).

Примечания: Толщина и тип линии задаются процедурой SetLineStyle, а цвет линии устанавливается процедурой SetColor.



Процедура Rectangle

Функция: рисует прямоугольник, используя текущий цвет и тип строки.

Описание: Rectangle (x1, y1, x2, y2).

Примечания: Точка с координатами (x1, y1)  определяет верхний левый угол прямоугольника, а точка с координатами (x2, y2) определяет нижний правый угол. При вычерчивании прямоугольника используются текущий тип строки и цвет, которые устанавливаются процедурой SetLineStyle.



Процедура Bar

Функция: рисует закрашенный прямоугольник.

Описание: Bar (x1, y1, x2, y2).

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



Процедура Bar3D

Описание: Bar3D(x1, y1, x2, y2: Integer, глубина: Word;, вершина: Boolean).

Примечания: Рисуется заполненный трехмерный параллелепипед. При этом используется тип и цвет закраски, заданные с помощью процедур SetFillStyle и SetFillPattern. Трехмерный контур параллелепипеда вычерчивается тем цветом и типом линии, которые установлены процедурами SetLineStyle и SetColor, Параметр "глубина" представляет собой число элементов изображения, задающих глубину трехмерного контура. Если переменная, указанная в качестве параметра "вершина" принимает истинное значение (True), то для параллелепипеда рисуется трехмерная вершина, в противном случае вершина не рисуется (что позволяет рисовать несколько параллелепипедов, расположенных один на другом). Типичный параметр глубины можно вычислить, взяв за основу 25% ширины параллелепипеда:

Bar3D (x1, y1, x2, y2, (x2-x1) div 4, TopOn).



1.3.4 Окружности, эллипсы, дуги.



Процедура Circle

Функция: выводит окружность с центром в точке (x, y) и радиусом r.

Описание: Circle(x, y, r).



Процедура Arc

Функция: Рисует дугу окружности от начального угла до конечного угла.

Описание: Arc(x, y, нач_угол, кон_угол, радиус).

Примечания: Рисует дугу окружности с центром (x, y) и радиусом "радиус". Дуга рисуется от начального угла ("нач_угол") до конечного угла ("кон_угол"). При этом используется текущий цвет. Начальный угол, равный 00 и конечный угол, равный 3600, задают вычерчивание полной окружности.



Процудура Ellipse

Рисует эллиптическую дугу от начального угла до конечного угла, используя (x, y) в качестве точки центра.

Описание:  Ellipse (x, y, нач_угол, кон_угол, радХ, радY).

Примечания: Процедура рисует эллиптическую дугу, используя (x, y), как точку центра, а "радХ", "радY" – как горизоньальную и вертикальную оси. Дуга эллипса вычерчивается от начального угла (параметр "нач_угол") до конечного угла (параметр "кон_угол") текущим цветом. Углы для процедур Arc, Ellipse и PieSlice задаются по направлению против часовой стрелки. При этом значение (в градусах) 0 соответствует 3 часам, 90 градусов – 12 часам и т.д.



Процедура FillEllipse

Функция: рисует закрашенный эллипс.

Описание: FillEllipse (x, y, Xрадиус, Yрадиус).

Примечания: Используя точку с координатами (x, y) в качестве центра, а Храдиус и Yрадиус – в качестве горизонтальной и вертикальной осей, рисует закрашенный эллипс.



1.3.5 Сектор

Процедура PieSlice

Функция: рисует и заполняет цветом сектор круга.

Описание: PieSlice(x, y, нач_угол, кон_угол, радиус).

Примечания: (x, y) используются в качестве центра окружности, а сектор рисуется от начального угла (параметр "нач_угол") до конечного угла ("параметр "кон_угол"). Контур сектора вычерчивается текущим цветом, а при закрашивании используются тип и цвет закраски, заданные процедурами SetFillStyle и SetFillPattern. Начальный угол, равный 0 градусов и конечный угол, равный 360 градусов, задают вычерчивание полной окружности.



Процедура Sector

Функция: вычерчивает и заполняет эллиптический сектор.

Описание: Sector(x, y, нач_угол, кон_угол, Храдиус, Yрадиус).

Примечания: Процедура использует (x, y) как точку центра, параметры "Xрадиус" и Yрадиус" определяют горизонтальный и вертикальный радиусы. Сектор вычерчивается от начального угла (параметр "нач_угол") до конечного угла ("параметр "кон_угол"). Сектор рисуется текущим цветом и закрашивается с использованием образца закраски и цвета, заданных с помощью процедур SetFillStyle и SetFillPattern. Если задан начальный угол 00 и конечный угол 3600, то будет нарисован и закрашен полный эллипс.

 

1.3.6 Многоугольники



Процедура DrawPoly

Функция: Используя текущий тип прямой и текущий цвет рисует контур многоугольника.

Описание: DrawPoly(числ_коозд, коорд_верш).

Примечания: Параметр "коорд_верш" является нетипизированным параметром, который содержит координаты каждого пересечения в многоугольнике. Параметр "числ_коорд" задает число координат в "коорд_верш". Координата состоит из двух слов: значения х и значения y.

Данная процедура использует текущий тип линии и текущий цвет. Заметим, что для вычерчивания замкнутой фигуры с n вершинами вы должны передать при обращении к процедуре DrawPoly n+1 координату, где координата вершины с номером n будет равна координате вершины с номером 1.



Процедура FillPoly

Функция: Заполняет многоугольник.

Описание: FillPolty(числ_коозд, коорд_верш).

Примечания: Параметр "коорд_верш" является нетипизированным параметром, который содержит координаты каждого пересечения сторон в многоугольнике. Параметр "числ_коорд" задает число координат в "коорд_верш". Координата состоит из двух слов: значения х и значения y.

Данная процедура вычисляет все горизонтальные пересечения и заполняет многоугольник, используя текущий тип и цвет линии и текущий тип и цвет закраски.  При вычерчивании контура многоугольника используется текущий тип линии и цвет, которые устанавливаются процедурой SetLineStyle.



1.3.7 Вывод изображений в относительных координатах.



В модуле Graph языка Паскаль имеется возможность рисовать фигуры, используя относительные координаты. Для этого используется понятие "текущий указатель" Текущий указатель (CP – Current Pointer) используется во многих графических системах. Понятие СР аналогично понятию курсора для текстового режима, за исключением того, что текущий указатель невидим. Для вывода произвольных графических изображений используется ряд процедур.



Процедура MoveTo



Функция: Перемещает текущий графический указатель  в точку (x, y).

Описание: MoveTo(x, y).



Процедура MoveRel

Функция: Перемещает текущий указатель на расстояние, заданное относительными координатами от его текущей позиции.

Описание: MoveRel (Dx, Dy).

Примечания: Процедура MoveRel перемещает текущий указатель в точку, заданную относительным расстоянием (Dx, Dy) от точки, в которой находится текущий указатель. Относительные команды перемещения и рисования полезны при вычерчивании различных объектов на экране, у которых начальная точка может быть изменена (чтобы, например, вычертить ту же самую фигуру в другом месте экрана).



Процедура LineRel

Описание: LineRel(Dx, Dy).

Примечания: Данная процедура вычерчивает прямую линию из текущей точки в точку, заданную относительным расстоянием (Dx, Dy) от текущего указателя. Процедура рисует прямую линию, толщина и тип которой задаются процедурой SetLineStyle, а цвет устанавливается процедурой SetColor. Относительные команды перемещения и рисования полезны при вычерчивании различных объектов на экране, у которых начальная точка может быть изменена (чтобы, например, вычертить ту же самую фигуру в другом месте экрана).



Процедура LineTo

Описание: LineTo (x, y).

Примечания: Рисует прямую линию, толщина и тип которой задаются процедурой SetLineStyle, а цвет задается процедурой SetColor. Заметим, что MoveTo (1000,100); LineTo (200, 200) эквивалентно Line (100, 100, 200, 200).

Первый метод требует большего времени для выполнения и большего объема памяти для выполняемого кода. Используйте LineTo только тогда, когда текущий указатель находится в одном из концов прямой. Отметим, что второй метод не изменяет значения текущего указателя.



Процедура ClearDevice

Функция: процедура ClearDevice устанавливает текущий указатель в исходное положение (точка с координатами (0, 0)) и очищает экран, заполняя его цветом фона.



1.3.8 Работа с текстами в графическом режиме.



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

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

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

Векторные шрифты существуют в виде отдельных файлов, имеющих расширение .chr и расположенных в том же каталоге BGI Турбо Паскаля, что и графические драйверы. Чтобы программы выполнялись правильно, им должны быть доступны файлы со всеми необходимыми шрифтами. Если графическая программа не сможет найти необходимый шрифт, то это приведет к сбою в работе в ее работе, будет просто использоваться шрифт, заданный по умолчанию. "Стандартные" (т.е. входящие в исходную поставку Турбо Паскаля) векторные шрифты не содержат русских букв. Впрочем, существуют векторные шрифты, созданные программистами и поддерживающие работу с русским алфавитом. Их можно приобрести и установить в Турбо Паскаль. 

Для работы с текстами в Турбо Паскале имеются несколько процедур.



Процедура SetTextStyle

Функция: Устанавливает текущий тип текстового шрифта, его направление, размер.

Описание: SetTextStyle(шрифт, направление,

 размер символа).

Шрифт принимает одно из следующих значений:

DefaultFont=0 – растровый шрифт;

TriplexFont=1 – векторный шрифт;

SmallFont=2 – векторный шрифт;

SanSerifFont=3 – векторный шрифт;

GothicFont=4 – векторный шрифт. 



Направление текста принимает одно из двух значений:

HorizDir=0 – слева направо;

Vertyr=1 – снизу вверх.  



Размер символа принимает значение от 0 до 10. Значение 1 соответствует шрифту 8х8, а 10 соответствует 80х80.



Процедура SetTextJustify

Описание: SetTextJustify(horj, verj).

Примечания: устанавливает выравнивание в горизонтальном (horj) и вертикальном (verj) направлениях.

Типы выравнивания:

Горизонтальное:

LefText=0 – влево;

CenterText=1 – по центру;

RightText=2 – вправо.



Вертикальное:

BottomText=0 – вниз;

CenterText=1 – по центру;

TopText=2 – вверх.



Процедура GetTextSettings

Функция: Возвращает текущий тип текстового шрифта, его направление, размер и выравнивание, установленные с помощью процедур SetTextStyle и SetTextJustify.

Описание: 

SetTextSettings( var TextInfo: TextSettingsType).



Процедура OutText

Функция: Пересылает строку на устройство вывода в то место, в котором находится текущий указатель.

Описание: OutText(строка:string).

Примечания: Параметр "строка" выводится в месте расположения текущего указателя. При этом используются текущие параметры выравнивания. Если строка слишком длинная и не умещается на экране или в текущей области просмотра, то она усекается. Если активен шрифт, используемый по умолчанию (растровый шрифт), а строка слишком велика и не умещается на экране, то она не выводится.

В данной процедуре используется шрифт, установленный процедурой SetTextStyle. Процедура OutText использует параметры вывода, установленные процедурой SetTextJustify (выравнивание, центрирование и др.). Текущий указатель изменяется процедурой OutText только в том случае, если направление вывода текста горизонтальное и задано выравнивание по левой границе. Направление вывода текста (горизонтальное или вертикальное) задается с помощью процедуры  SetTextStyle, а выравнивание – с помощью процедуры SetTextJustify.



Процедура OutTextXY

Функция: Пересылает строку на устройство вывода.

Описание: OutTextXY(X, Y, текст_строка).

Примечания: Строка, заданная параметром "текст_строка", выводится в точке (x, y). Если строка слишком длинная и выходит за пределы экрана или текущей области просмотра, то она усекается.

	Процедура OutText используется для вывода текста в месте расположения текущего указателя, а процедура OutTextXY используется для вывода текста в любом заданном месте экрана.



1.4 Графические окна



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

Описание: SetViewPort(x1, y1, x2, y2, Clip).

Примечания: Точка (x1, y1) задает верхний левый угол области просмотра, а точка с координатами (x2, y2) определяет правый нижний угол области просмотра. Булевская переменная Clip определяет, будет ли изображение отсекаться текущими границами области просмотра. Определены следующие константы: ClipOn:=True; ClipOff:=False. 

Процедура SetViewPort(0, 0, GetMaxX, GetMaxY, ClipOn) всегда задает в качестве области просмотра все поле графического экрана. 

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



1.5 Программирование движущихся объектов



Очень часто хочется "оживить" картинку, "заставить" что-нибудь двигаться. Как сделать это, не используя анимационные программы средствами модуля Graph? Движение простых объектов может быть имитировано с помощью некоторых не очень сложных приемов. 

I способ. Имитация движения объекта на экране за счет многократного выполнения программой набора действий: нарисовать – пауза – стереть (нарисовать в том же месте цветом фона) – изменить координаты положения рисунка. 

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

II способ. Иллюзия движения создается при помощи специальных процедур и функций. 

Функция ImageSize(x1, y1, x2, y2: integer) возвращает размер памяти в байтах, необходимый для размещения прямоугольного фрагмента изображения, где x1,y1 – координаты левого верхнего и x2, y2 – правого нижнего углов фрагмента изображения. 

Процедура GetImage(x1, y1, x2, y2:integer, var Buf) помещает в память копию прямоугольного фрагмента изображения, где x1, ..,y2 – координаты углов фрагмента изображения, Buf – специальная переменная, куда будет помещена копия видеопамяти с фрагментом изображения. Buf должна быть не меньше значения, возвращаемого функцией ImageSize с теми же координатами. 

Процедура PutImage(x1, y1, x2, y2:integer, var Buf, Mode:word) выводит в заданное место экрана копию фрагмента изображения, ранее помещенную в память процедурой GetImage. X, Y – координаты левого верхнего угла того места на экране, куда будет скопирован фрагмент изображения; Buf –специальная переменная, откуда берется изображение, Mode – способ копирования. Координаты правого нижнего угла не указываются, так как они полностью определяются размерами выводимой на экран копии изображения. Координаты левого верхнего угла могут быть любыми, лишь бы только копия уместилась в пределах экрана (если копия не размещается на экране, то она не выводится, и экран остается без изменений). Параметр Mode определяет способ взаимодействия размещаемой с уже имеющимся на экране изображением 



	Раздел 2. Практическая часть

2.1 Разработка программы, реализующей движение по траектории графического объекта.



Исходные данные: 

x,y – координаты стартовой точки, тип целый.

d,t – переменные для инициализации графического режима



Промежуточные данные:

 a,b – переменные для построения линии моря, тип целый

y0 – координата для высоты положения линии моря, тип целый



Использование модулей:

	crt включает в себя процедуры очистки (clrscr) и задержки экрана(readkey);

	graph позволяет провести инициализация графического режима с помощью процедуры InitGraph;  включает в себя процедуры и функции, позволяющие вырисовывать графические объекты и применять к ним различные типы, стили и цвета оформления.



Алгоритмическая структура:

цикл прямого пересчета for…to…do; 

цикл с предусловием while … do



Алгоритм программы:

		Задание имени программы

		Открытие модулей

		Написание процедуры «море» с использованием цикла прямого пересчета

		Инициализация графического режима

		В  цикле с предусловием произвести рисование волны и задание движения объекта по траектории

		Рисование графического объекта

		Задержка выполнения программы

		Установка шага движения

		Закрытие графического режима 



Листинг программы:



program corablik;

uses Graph, Crt;

var  d,t,x,y,y0,a,b: integer

 procedure more(a,b:integer);

 begin

  moveto(0,y0);

  setcolor(blue);

  for a:=0 to 680 do

   begin

    b:=y0-round(sin(a*pi/180)*30;

     lineto(a,b);

   end;

 end;

Begin

  d := Detect;  t:=2;

  InitGraph(d, t, '');

  y0 := 250;

    x:=600;

    while x>=0 do

     begin

      cleardevice;

      more(a,b);

      setcolor(white);

      y:=y0-40-round(sin(x*pi/180)*30);

      MoveTo(x - 60, y + 40);

      LineTo(x - 40, y + 60);

      LineTo(x + 40, y + 60);

      LineTo(x + 60, y + 40);

      LineTo(x - 60, y + 40);

      MoveTo(x + 35, y + 40);

      LineTo(x + 35, y - 60);

      LineTo(x - 40, y + 40);

      LineTo(x + 35, y + 40);

      delay(2500); 

      x:=x-2;{шаг движения}

    end;

 CloseGraph;

end.





2.2 Разработка программы, реализующей  перемещение по экрану окружности



Исходные данные: 

x,y – начальные координаты центра окружности, тип целый.

r – радиус окружности, тип целый

d,t – переменные для инициализации графического режима



Промежуточные данные:

dx – величина перемещения по оси Х, тип целый

dy – величина перемещения по оси Y, тип целый



Использование модулей:

		crt включает в себя процедуры очистки (clrscr) и задержки экрана(readkey);

		graph позволяет провести инициализация графического режима с помощью процедуры InitGraph;  включает в себя процедуры и функции, позволяющие вырисовывать графические объекты и применять к ним различные типы, стили и цвета оформления.



Алгоритмическая структура:

цикл с постусловием repeat … until

условный оператор if…then…[else]



Алгоритм программы:

Задание имени программы

Открытие модулей

Инициализация графического режима

Рисование рамки вокруг экрана

Рисование окружности белого цвета

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

Задержка выполнения программы

Рисование черной окружности

Расчет новых координат

Закрытие графического режима 



Листинг программы



																Program Multik;

																Uuses Graph, Crt;

																Var x, y, dy, dx, r, d, : integer;

																Begin

																 d :=detect; t:=2;

																 Initgraph(d,t,''); 

																 Rectangle(0,0,GetMaxX,GetMaxY);  

																 x:=100; y:=100;     

																 dx:=10;          

																 dy:=10;          

																 r:=15 ;        

																Repeat

																  SetColor(15);      

																  Circle(x,y,r);

																  if y>=GetMaxY-radius then                

																     begin dy:=-10; Sound(2000); end;

																  if y<=radius         then                

																     begin dy:= 10; Sound(3000); end;

																  if x>=GetMaxX-radius then                

																     begin dx:=-10; Sound(5000); end;

																  if x<=radius         then                

																     begin dx:= 10; Sound(4000); end;

																  Delay(1000);               

																  NoSound;

																  SetColor(0);                 

																 Circle(x,y,r);        

																  x:=x+dx; y:=y+dy;          

																 Until KeyPressed;

																 CloseGraph;                 

																End. 



Заключение



Представление данных на мониторе компьютера в  графическом виде впервые было реализовано в середине 50-х годов для больших ЭВМ, применявшихся в научных и военных исследованиях. С тех пор графический способ отображения данных стал неотъемлемой принадлежностью подавляющего числа компьютерных систем, в особенности персональных.

В данной курсовой работе были описаны различные процедуры и функции, предназначенные для создания графических объектов в Турбо Паскале.

Используя  выше перечисленные процедуры и функции, можно  изображать различные фигуры различных форм и размеров, а так же показывать   движения фигур.



Список использованных источников





		Информатика(Базовый курс) С. В. Симонович, СПб: Питер, 2001г.

		Основы языка Turbo Pascal(учебный курс), П. И. Рудаков, М. А. Федотов, Москва: Радио и Связь, 2000г.

		Основы программирования в задачах и примерах, А. В. Милов, Харьков: ФОЛИО, 2002г.

		Программирование. С. Симонович, Г. Евсеев, Москва: АСТ – ПРЕСС книга 2000г.

		Практика программирования, Ю. Кетков, А. Кетков, СПб: БХБ/ Петербург, 2002г.

		Turbo Pascal/ С. А. Немнюгин.- СПб: Издательство «Питер», 2001.– 496 с.:ил.

		Turbo Pascal: учитесь программировать, О. А. Меженный, Москва: изд.дом «Вильямс», 2001г

		Программирование в среде TURBO PASCAL-7.0. А. И. Марченко, Л. И. Марченко. – Киев: ВЕК, 1998.

		Информатика: Учебное пособие./ А. В. Могилев. – М.:Academa, 2000.

		TURBO PASCAL. С. А. Немнюгин. – СПб.: Питер, 2000.

		TURBO PASCAL: Учебное пособие./ В. Б. Попов. – М.: Финансы и статистика, 2003 г.





4

3