Цель: Научиться работать с монитором в графическом режиме, изучить графические возможности среды Pascal.

1. Теоретические сведения.

Установка графического режима.

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

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

Procedure InitGraph (Var gd, gm:Integer; Path:String),

в которой переменная gd определяет тип графического драйвера, переменная gm – режим работы графического адаптера, константа Path – маршрут поиска файла драйвера. Для автоматического определения типа драйвера можно использовать процедуру Detect:

gd: = detect;

InitGraph (gd, gm, \C:\Bp\Bgi\);

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

Процедура

Procedure CloseGraph;

завершает работу адаптера в графическом режиме и восстанавливает текстовый режим работы экрана.

В ходе работы в графическом режиме можно использовать функцию:

Function GraphResult : Integer;

возвращающюю значение, в котором закодирован результат последнего обращения к графическим процедурам. Для каждого значения в модуле Graph определена константа:

Const

grOk = 0; {Нет ошибок}

grInitGraph = -1; {Не инициализировался графический режим}

grNotDetect = -2; {Не определен тип драйвера}

grFileNotFind = -3; {Не найден графический драйвер}

НЕ нашли? Не то? Что вы ищете?

grInvalidDriver = -4; {Неправильный тип драйвера

grNoLoadMem = -5; {Нет памяти для размещения драйвера}

grNoScanMem = -6; {Нет памяти для просмотра областей}

grNoFloodMem = -7; {Нет памяти для закраски областей}

grFontNotFound = -8; {Не найден файл со шрифтом}

grNoFontMem = -9; {Нет памяти для размещения шрифта}

grInvalidMode = -10 {Неправильный графический режим}

grError = -11; {Общая ошибка}

grError = -12; {Ошибка ввода-вывода}

grInvalidFont = -13; {Неправильный формат шрифта}

grInvalidFontNum = -14; {Неправильный номер шрифта}

После обращения к функции GraphResult признак ошибки сбрасывается, поэтому повторное обращение к ней вернет ноль.

С помощью функции

Function GraphErrorMzg(Code:Integer):String;

можно по коду ошибки Code получить текстовое сообщение.

Ниже приведена типичная последовательность операторов для инициации графического режима с автоматическим определением типа драйвера:

Var gd, gm, Error: Integer;

begin

gd: = Detect; {Автоопределение драйвера}

InitGraph (gd, gm,'C:\Bp\Bgi'); {Инициируем графику}

Error: = GraphResult; {Получаем результат}

If Not (Error = grOk)

then {Проверяем ошибку}

Begin

{Выводим сообщение об ошибке}

Writeln (GraphErrorMsg(Error)); ……..

end

else {нет ошибки}

Begin

….{команда работы с графикой}

CloseGraph {Закрывается графический режим}

end

end.

Координаты.

Экран монитора в графическом режиме представляет собой множество точек, изменяя цвет которых можно получить графическое изображение. Каждая точка имеет свои координаты. Т. о., экран в графическом режиме можно рассматривать как координатную плоскость (см. рис.1). Стандартный размер экрана монитора SVGA составляет 640*480 пиксел (точек). Левый верхний угол экрана имеет координаты (0,0). Размерность экрана можно получить с помощью функции типа Integer GetMaxX и GetMaxY, которые возвращают максимальные координаты экрана в текущем режиме работы соответственно по горизонтали (по X) и вертикали (по Y).

В графическом режиме, аналогично курсору в текстовом режиме, имеется графический указатель. Его координаты можно получить с помощью функции типа Integer GetX и GetY.

Процедура

Procedure MoveRel (dX, dY: Integer).

Здесь dX, dY – приращение новых координат указателя (соответственно по горизонтали и вертикали) относительно того положения, которое занимал указатель к моменту обращения к процедуре.

Цвета.

Процедура

Procedure SetColor (Color: Word);

устанавливает текущий цвет Color для выводимых линий и символов. В модуле Graph определены точно также те константы для задания цвета, как и в модуле Сrt.

Функция

Function GetColor:Word

возвращает код текущего цвета, а функция

Function GetMaxColor:Word

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

Процедура

Procedure SetBkColor (Color:Word)

устанавливает цвет фона, а функция

Function GetBkColor:Word

возвращает значение, соответствующее текущему цвету фона.

Процедура

Procedure ClearDevice;

заполняет экран цветом фона, а графический указатель устанавливает в левой верхний угол экрана.

Линии и точки.

Процедура

Procedure PutPixel (X, Y: Integer): Word

выводит точку с координатами X, Y цветом Color.

Функция

Procedure GetPixel (X, Y: Integer): Word

возвращает значение, соответствующее цвету пиксела с координатами (X,Y).

Процедура

Procedure Line (X1, Y1, X2, Y2:: Integer);

вычерчивает линию с координатами начала (X1,Y1) и конца (X2,Y2). Линия вычерчиваетcя текущим стилем (смотри далее) и текущим цветом

Процедура

Procedure LineTo(X,Y: Integer);

вычерчивает линию от текущего положения указателя до положения, заданного его новыми координатами (X,Y). Aналогичным образом,

Процедура

Procedure LineRel(dX,dY: Integer);

вычерчивает линию от текущего положения указателя до положения, заданного приращения его новыми координатами. В процедурах LineTo и LineRel линия вычерчивается текущим стилем и текущим цветом.

Процедура

Procedure SetLineStyle (Type, Pattern, Thick:Word);

устанавливает новый стиль вычерчивания линий. Тип линии Type может быть задан с помощью одной из следующих констант:

Const

Solidln = 0; {Сплошная линия}

Dottedln = 1; {Точечная линия}

Centerln = 2; {Штрих-пунктирная линия}

Dashedln = 3; {Пунктирная линия}

UserBittn = 4; {Узор линии определяется пользователем}

Параметр Pattern учитывается только для линий, вид которых определяется пользователем (т. е. Type=UserBitln).

Толщина линий Thick может быть задана одним из двух значений:

Const

NormWidth = 1; {Толщина в один пиксел}

ThickWidth = 3; {Толщина в три пиксел}

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

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

Процедура

Procedure Rectаngle( X1,Y1,X2,Y2: Integer );

вычерчивает прямоугольник с координатами левого верхнего угла (X1,Y1) и правого нижнего угла (X2,Y2).Прямоугольник вычерчивается с использованием текущего цвета и текущего стиля линий.

Процедура

Procedure DrawPoly(N:Word;var Points);

вычерчивает произвольную ломанную линию, заданную координатами точек излома. Здесь:

N – количество точек излома, включая обе крайние точки,

Points – одномерный массив из элементов типа PointType, описанного в модуле Graph следующим образом:

Type

PointType = Record

x, y:Word;

end;

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

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

Procedure Circle( X,Y: Integer; R: Word );

вычерчивает окружность с центром в точке (X,Y) и радиусом R. Окружность выводится текущим цветом. Толщина линии устанавливается текущим стилем, вид линии всегда SolidLine (сплошная).

Процедура

Procedure Arc (X, Y: Integer; BegA, EndA, RX, RY:Word);

Черчит дугу окружности. Здесь X,Y – координаты центра; BegA, EndA – соответственно начальный и конечный углы дуги; R- радиус. Углы отсчитываются против часовой стрелкии указываются в градусах. Нулевой угол соответствует горизонтальному направлению вектора слева направо. На рис.2 изображены дуги с углами 0 и 90, а также 270 и 540 градусов.

0-90

 

270-540

 

Рис. 2.

 

Процедура

Procedure Ellipse (X, Y: Integer; BegA, EndA, RX, RY:Word);

вычерчивает эллипсную дугу. Здесь X,Y – координаты центра; BegA, EndA – соответственно начальный и конечный углы дуги; RX,RY – горизонтальный и вертикальный радиусы эллипса в пикселах. При вычерчивании дуги эллипса используются те же соглашения относительно линий, что и в процедуре Circle, и те же соглашения относительно углов, что и в процедуре Arc.

Заполнения.

Процедура

Procedure SetFillStyle(Fill, Color: Word);

Устанавливает стиль заполнения. Здесь Fill – тип заполнения; Color – цвет заполнения. С помощью заполнения можно покрывать какие-либо фрагменты изображения периодически повторяющимся узором. Для указания типа заполнения можно использовать следующие константы:

Const

EmptyFill = 0; {Заполнение фоном, узор отсутствует}

SolidFill = 1; {Сплошное заполнение}

LineFill = 2; {Заполнение ----}

LtSlashFill = 3; {Заполнение /////}

SlashFill = 4; {Заполнение утолщенными ///}

BkSlashFill = 5; {Заполнение утолщенными \\\}

LtBkSlashFill = 6; {Заполнение \\\\\}

HatchFill = 7; {Заполнение ++++}

XHatchFill = 8; {Заполнение ххххх}

InterleaveFill = 9; {Заполнение в прямоугольную клеточку}

WideDotFill = 10; {Заполнение редкими точками}

CloseDotFill = 11; {Заполнение частыми точками}

Процедура

Procedure FloodFole (X, Y: Integer; Border: Word);

заполняет произвольную замкнутую фигуру, используя текущий стиль заполнения (узор и цвет). Здесь – X,Y – координаты любой точки внутри замкнутой фигуры; Border – цвет граничной линии. Если фигура незамкнута, заполнение “разольется” по всему экрану.

Процедура

Procedure Bar (X1,Y1, X2, Y2: Integer);

заполняет прямоугольную область экрана используя текущий образец узора и текущий цвет заполнения. Здесь (X1, Y1) – координаты левого верхнего угла, (X2, Y2) – правого нижнего угла запрашиваемой области.

Процедура

Procedure Bar3D(X1,Y1,X2, Y2, Depth:Integer;Top:Boolean);

вычерчивает трехмерное изображение параллелепипеда и закрашивает его переднюю грань. Здесь (X1,Y1) и (X2,Y2) – координаты левого верхнего и правого нижнего углов передней грани; Depth – третье измерение трехмерного изображения в пикселах (“глубина”); Top – способ изображения верхней грани. Если Top=True, верхняя грань параллелепипеда вычерчивается. В качестве значения этого параметра может использоваться одна из следующих констант, определенных в модуле Graph:

Const

TopOn = True;

TopOff = False;

При вычерчивании используется текущий стиль линий (SetLineStyle) и текущий цвет (SetColor). Передняя грань заливается текущим стилем заполнения (SetFillStyle)

Процедура

Procedure FillEllipsd (X, Y, RX, RY: Integer);

обводит линией и заполняет эллипс. Здесь X, Y – горизонтальный и вертикальный радиусы эллипса в пикселах. Эллипс обводится линией, заданной процедурами SetLineStyle и SetColor, и заполняется с использованием параметров, установленных процедурой SetFillStyle

Процедура

Procedure FillEllipse (X, Y, RX, RY: Integer);

Обводит линией и заполняет эллипс. Здесь X, Y – координаты центра; RX,RY – горизонтальный и вертикальный линией, заданной процедурами SetLine Style и SetColor, и заполняется с использоваеи параметров, установленных процедурой SetFillStyle.

Процедура

Pprocedure Sector (X, Y:Integer;BegA, EndA, RX, RY:Word);

вычерчивает и заполняет эллипсный сектор. Здесь BegA, EndA – соответственно начальный и конечный углы эллипсного сектора. Остальные параметры обращения аналогичны параметрам процедуры FillEllipse.

Процедура

Procedure PieSlice (X,Y:Integer;BegA,EndA,R:Word);

вычерчивает и заполняет сектор окружности. В отличии от процедуры Sector, указывается лишь один радиус R, остальные параметры аналогичны параметрам процедуры Sector.

Вывод текста.

Описываемые ниже стандартные процедуры и функции поддерживают вывод текстовых сообщений в графическом режиме

Процедура

Procedure OutText (Text : String)

выводит текстовую строку Text, начиная с текущего положения указателя, в состветствии с установленным стилем и выравниванием (см. далее). Аналогичная процедура

Procedure OutTextXY (X,Y:Integer; Text:String)

выводит строку, начиная с заданного места. При этом указатель не меняет своего положения.

Процедура

Procedure SetTextStyle (Font, Direct, Size:Word)

устанавливает стиль текстового вывода на графический экран. Здесь Font – номер шрифта (от 1 до 10); Direct- код направления ( HorizDir=0 – слева – направо; VortDir=1-снизу – вверх); Size – размер шрифта (от 1 до 10).

Процедура

Procedure SetTextJustify (Horiz, Vert: Word)

задает выравнивание выводимого текста по отношению к текущему положению указателя или к заданным координатам. Здесь Horiz – горизонтальное выравнивание;

Vert – вертикальное выравнивание. В качестве фактических параметров можно использовать следующие константы:

Const

LeftText = 0; {Указатель слева от текста}

CenterText = 1; {Симметрично слева и справа, сверху и снизу}

RightText = 2; {Указатель справа от текста}

BottomText; {Указатель снизу от текста}

TopText = 2; {Указатель сверху от текста}.

В некоторых случаях могут пригодиться функции

Function TextWidth(Txt:String):Word;

Function TextHeight(Txt:String):Word;

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

Вопросы для самоконтроля.

1. Установление графического режима.

2. Контроль ошибок графических операций.

3. Координаты точек на экране.

4. Управление цветом.

5. Вывод на графический экран линий и точек.

6. Вывод многоугольников, дуг, окружностей, эллипсов.

7. Заполнение фрагментов графического экрана.

3. Задание.

Написать программу, которая выводит на графический экран план расположения дома, в котором Вы проживаете. На плане необходимо указать название улиц, административных и промышленных знаний (кинотеатров, ВУЗов, магазинов и т. д.), номера домов, а также остановки общественного транспорта и маршруты передвижения от них к дому.

4. Список литературы

1. «Алгоритмические языки в техникуме». – М.: Высшая школа, 1990. – 222 стр.

2. «Паскаль для всех». – М.: Энергоатомиздат, 1988. – 188 стр.

3. «Языки программирования» (Паскаль, ПЛ/М). – М.: Высшая школа, 1987. – 142 стр.

Содержание

Лабораторная работа №1. 1

Лабораторная работа №2. 14

Лабораторная работа №3. 24

Лабораторная работа №4. 30

Лабораторная работа №5. 32

Лабораторная работа №6. 37

Лабораторная работа №7. 44

Лабораторная работа №8. 49

Лабораторная работа №9. 52

Лабораторная работа № 10. 57

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9