Стандартное состояние компьютера после
запуска Турбо Паскаля – текстовый режим. Для того, чтобы использовать его
графические средства, программист должен "определенным образом
инициировать режим работы дисплейного адаптера". В графическом режиме
работой дисплейного адаптера управляет графический драйвер.
Драйвер – это специальная программа, которая управляет техническими средствами
компьютера. Для всех существующих типов адаптеров фирма Borland разработала
графические драйверы (они имеют расширение .bgi и находятся на диске в одноименном
подкаталоге).
Необходимые процедуры и функции для работы с
графикой собраны стандартном модуле – Graph.
Инициализация графики производится с помощью
процедуры InitGraph, которая имеет вид:
InitGraph(GraphDriver,
GraphMode, Path);
где переменные
GraphDriver и GraphMode
имеют тип Integer, а переменная Path имеет тип String.
То, что записано в скобках, называется параметрами
вызова процедуры (подробнее с данным вопросом мы ознакомимся позднее в теме
“Процедуры и функции”), а сейчас рассмотрим параметры GraphDriver, GraphMode и
Path.
GraphDriver – целая переменная, определяющая тип драйвера. Процедура загружает
драйвер в оперативную память и переводит адаптер в графический режим работы.
Тип драйвера должен соответствовать типу графического адаптера. Для указания
типа драйвера в модуле предопределены следующие константы:
CGA |
1 |
EGA |
3 |
EGAMono |
5 |
HercMono |
7 |
VGA |
9 |
MCGA |
2 |
EGA64 |
4 |
IBM8514 |
6 |
ATT400 |
8 |
PC3270 |
10 |
Detect = 0;
Целая переменная GraphMode задает
режим работы графического адаптера. Многие адаптеры могут работать в нескольких
режимах. Например, переменная GraphMode в момент обращения к InitGraph
может иметь одно из следующих значений для адаптера VGA:
VGALo = 0;
VGAMed = 1; VGAHi = 2;
Теперь представьте такой вариант: Вам нужно
написать программу на языке Pascal с использованием графических возможностей
компьютера. Хорошо, если это – программа для компьютера с известным адаптером.
А если нет, как действовать в этом случае? Выход один. Если нам неизвестен тип
адаптера или программа должна работать с любым адаптером, необходимо обращаться
к InitGraph с запросом на автоматическое определение драйвера.
Это происходит следующим образом: переменной
GraphDriver присваиваем значение detect. В этом случае компьютер сам определит
необходимый драйвер и подберет наилучший режим.
Program Primer1;
Uses
Graph;{Подключение модуля библиотеки графических
процедур}
Var
GraphDriver,
GraphMode : integer;
Begin
GraphDriver := detect; {автоопределение типа драйвера }
InitGraph(GraphDriver, GraphMode, Path);
{Инициализация графического режима}
. . .
. . .
. . .СloseGraph;{Закрытие графического режима}
End.
Для получения графического изображения нужно
заставить светиться заданным цветом определенную группу пикселей (точек). Это
можно делать в программе, но ваша работа тогда станет очень трудоёмкой. Чтобы
облегчить труд программиста существует модуль Graph, в котором содержиться 79
полезных процедур и функций, десятки стандартных констант и типов данных
(например, процедуры рисования линии, окружности и др.). Чтобы воспользоваться
этим модулем нужно сначала его подключить. Для этого в программе записывают
строчку: Uses Graph.
Условно весь модуль Graph можно подразделить
на несколько функциональных групп по выполняемым действиям. Рассмотрим эти
группы (внутри групп взяты основные функции, необходимые нам для
первоначального ознакомления с графикой):
1) Инициализация графики, подготовительные
работы, управление цветом, закрытие режима:
InitGraph |
установление (инициализация) графического режима работы |
CloseGraph |
завершение работы с графикой |
DetectGraph |
определение драйвера |
FloodFill |
заливка замкнутого контура выбранным типом и цветом палитры |
RestoreCRTMode |
возврат в текстовый режим |
SetBkColor |
выбор и установка нового цвета закраски фона |
SetColor |
выбор и установка нового текущего цвета |
SetFillStyle |
выбор и установка нового шаблона и цвета заполнения |
2) Процедуры и функции для управления
курсором и видеостраницами:
ClearDevice |
очистка текущего устройства вывода |
ClearViewPort |
очистка текущего окна |
GetMaxX |
получение максимально доступной координаты по оси X |
GetMaxY |
получение максимально доступной координаты по оси Y |
GetPixel |
получение текущего цвета точки экрана |
GetX |
получить значение координаты X |
GetY |
получить значение координаты Y |
MoveRel |
переместить курсор из данной текущей точки на заданное приращение. |
MoveTo |
переместить курсор из данной текущей точки в заданную точку |
3). Процедуры и функции для работы с
"графическими примитивами":
Arc |
Рисует дугу |
Bar |
Рисует полосу |
Bar3D |
Рисует трехмерную полосу |
Circle |
Рисует окружность |
DrawPoly |
Рисует многоугольник |
Ellipse |
Рисует эллиптическую дугу или эллипс |
FillEllipse |
Рисует заполненный эллипс |
FillPoly |
Заполняет многоугольник |
Line,
LineRel, LineTo |
Рисует линию |
Rectangle |
Рисует прямоугольник |
Sector |
Рисует сектор эллипса |
PutPixel |
Рисует точку |
4) Процедуры для работы с текстом
OutText |
Вывод текста |
OutTextXY |
Вывод текста |
Итак, для запуска графической системы нам
необходимо:
1. Подключить модуль GRAPH – библиотеку
графических процедур:
Uses
Graph;
2. Установить графический режим с помощью
двух переменных:
Var
GraphDriver, GraphMode: integer;
Begin
GraphDriver:=detect;
InitGraph(GraphDriver, GraphMode,
'..\BGI');
{С этого момента все графические средства доступны пользователю}
{ тело программы }
CloseGraph;
End.
Задание. Наберите шаблон для программы, работающей в графическом режиме. Нам
он понадобиться в дальнейшем.
Внимание! Прежде чем запустить программу на
выполнение, необходимо на компьютере установить маршрут поиска файлов каталога
BGI. Для этого выполните следующее:
F10 –
Options – Directories
В окне EXE&TPU
directory набрать ..\BGI
Клавишей TAB перейти к окну Unit directories и набрать ..\BGI
Клавишей TAB перейти к ОК и нажать Enter.
Система координат в графическом режиме.
Любая информация при работе в графическом
режиме на экране монитора представлена совокупностью светящихся точек –
пикселей, которые определяются цветом и координатами – положением относительно
левого верхнего угла экрана с координатами (0,0).
Дисплей может работать в нескольких графических
режимах, каждому из которых соответствует свой формат изображения, т. е.
разрешающая способность (количество пикселей по горизонтали и вертикали) экрана
и набор используемых цветов.
Чтобы узнать максимальные координаты экрана в
текущем режиме работы, воспользуемся стандартными функциями GetMaxX и GetMaxY.
Для этого наберите небольшую программу:
Uses Graph;
Var
GraphDriver, GraphMode: integer;
Begin
GraphDriver:=detect;
InitGraph(GraphDriver, GraphMode,
‘..\BGI’);
Writeln(GetMaxX, 'x', GetMaxY);
Readln;
CloseGraph;
End.
Примечание. Для нашего графического режима обычно
значение максимальной координаты X равно 640 пикселям, а Y– 480 пикселям.
Чтобы точно строить изображение на экране,
Вам нужно сначала нарисовать, как это должно выглядеть на бумаге. Для этого
начертите в тетради систему координат графического режима.
x
Итак, отсчет начинается с верхнего левого
угла с координатами (0;0), значение Х – столбец, отсчет слева направо; значение
Y – строка, отсчет сверху вниз.
Чтобы строить изображение, нужно указать
точку начала вывода. В графическом режиме нет видимого курсора, но есть так
называемый невидимый текущий указатель (Current Pointer). После
инициализации графического режима указатель стоит в точке (0;0). Чтобы
переместить его в нужное место используют следующие процедуры:
MoveTo (X, Y), где переменные X, Y типа Integer – перемещает текущий указатель в точку с
координатами (X,Y).
Например, MoveTo (200, 100)
MoveRel (dX, dY), где переменные dX, dY типа Integer – перемещает текущий указатель по горизонтали
на расстояние, равное dX пикселям, а по вертикали на расстояние, равное dY
пикселям. (Relation (англ.) – относительно)
Например, если после выполнения предыдущей процедуры текущий указатель
находится в точке (200, 100), то после выполнения процедуры MoveRel (25, 150)
он будет находится в точке с координатами (225, 250).
PutPixel(X, Y, Color), где переменные X, Y типа Integer, а Color
типа Word – процедура выводит
точку заданного цвета Color в точку с координатами (X, Y).
Задание. Наберите в теле программы следующие процедуры PutPixel(300, 150,
Red), PutPixel(45, 420, 9) и просмотрите их действие.
Для задания цвета точки можно использовать
как слово на английском языке, так и цифру из следующей таблицы:
Цвет |
Цвет |
Код |
Black |
черный |
0 |
Blue |
синий |
1 |
Green |
зеленый |
2 |
Cyan |
бирюзовый |
3 |
Red |
красный |
4 |
Magenta |
малиновый |
5 |
Brown |
коричневый |
6 |
LightGray |
светло-серый |
7 |
DarkGray |
темно-серый |
8 |
LightBlue |
ярко-голубой |
9 |
LightGreen |
ярко-зеленый |
10 |
LightCyan |
ярко-бирюзовый |
11 |
LightRed |
ярко-красный |
12 |
LightMagenta |
ярко-малиновый |
13 |
Yellow |
желтый |
14 |
White |
белый |
15 |
Line (X1, Y1, X2, Y2), где переменные X1, Y1, X2, Y2 типа Integer – рисуется линия от точки (X1, Y1) до точки
(X2, Y2).
LineTo (X, Y), где переменные X, Y
типа Integer – рисуется линия из
точки, где находится в данный момент курсор в точку (X, Y).
LineRel (dX,dY), где переменные dX, dY типа Integer – рисуется линия из точки, где находится в
данный момент курсор (X, Y) в точку (X+dX,Y+dY).
Задание. Придумайте самостоятельно примеры с использованием всех процедур
вычерчивания линий.
У Вас не получается нарисовать линии? В чем
же причина? Если внимательно посмотреть на эти процедуры и сравнить их с
процедурой PutPixel, то можно заметить, что в них нет параметра, указывающего
цвет рисования линии. В этом и других аналогичных случаях цвет задается
специальной процедурой.
SetColor (Color), где переменная Color типа Word - устанавливает текущий цвет для выводимых
линий и символов.
Задания. 1. Исправьте свою программу так, чтобы процедуры рисовали линии
различных цветов.
2. В начерченной ранее системе координат
изобразите на чертеже точки:
А(150,450), В(100,350), С(350,350),
D(300,450), E(200,350), F(200,50), L(250,40), K(200,20), M(300,250),
X(175,400), Y(225,400), Z(275,400).
3. Соедините точки, получая отрезки:
AB, BC,
CD, AD, EK, KL, LF, FM, ME.
Какая фигура у Вас получилась?
4. Напишите программу, рисующую эту фигуру,
по вашему рисунку.