Тема:
Графический режим. Инициализация графического
режима. Построение точки, линии.
Стандартное состояние компьютера после запуска
Турбо Паскаля - текстовый режим. Для того, чтобы использовать его графические
средства, программист должен "определенным образом инициировать режим
работы дисплейного адаптера". В графическом режиме работой дисплейного
адаптера управляет графический драйвер.
Драйвер - это специальная программа,
которая управляет техническими средствами компьютера. Для всех существующих
типов адаптеров фирма Borland разработала графические драйверы
(они имеют расширение .bgi и находятся на диске в одноименном подкаталоге).
Необходимые процедуры и функции для работы с
графикой собраны стандартном модуле - Graph.
Инициализация графики производится с помощью
процедуры InitGraph, которая имеет вид:
InitGraph(GraphDriver, GraphMode, Path);
где переменные GraphDriver и GraphMode имеют тип Integer,
а переменная Path имеет тип String.
То, что записано в скобках, называется параметрами
вызова процедуры, а сейчас рассмотрим параметры GraphDriver, GraphMode
и Path.
GraphDriver - целая переменная, определяющая
тип драйвера. Процедура загружает драйвер в оперативную память и переводит
адаптер в графический режим работы. Тип драйвера должен соответствовать
типу графического адаптера. Для указания типа драйвера в модуле предопределены
следующие константы:
CGA EGA EGAMono HercMono VGA
MCGA EGA64 IBM8514 ATT400 PC3270
Detect = 0
Целая переменная GraphMode задает режим
работы графического адаптера. Многие адаптеры могут работать в нескольких
режимах. Например, переменная GraphMode в момент обращения к InitGraph
может иметь одно из следующих значений для адаптера VGA:
- VGALo = 0;
- VGAMed = 1;
- VGAHi = 2;
Примечание:
Более подробно о переменной Mode можно
узнать в справочном руководстве по TurboPascal.
Теперь представьте такой вариант: Вам нужно
написать программу на языке 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 можно подразделить
на несколько функциональных групп по выполняемым действиям. Рассмотрим
эти группы (внутри групп взяты основные функции, необходимые нам для первоначального
ознакомления с графикой):
- Инициализация графики, подготовительные работы, управление цветом,
закрытие режима:
- InitGraph установление (инициализация) графического режима
работы
- CloseGraph завершение работы с графикой
- DetectGraph определение драйвера
- FloodFill заливка замкнутого контура выбранным типом и цветом
палитры
- RestoreCRTMode возврат в текстовый режим
- SetBkColor выбор и установка нового цвета закраски фона
- SetColor выбор и установка нового текущего цвета
- SetFillStyle выбор и установка нового шаблона и цвета заполнения
- Процедуры и функции для управления курсором и видеостраницами:
- ClearDevice очистка текущего устройства вывода
- ClearViewPort очистка текущего окна
- GetMaxX получение максимально доступной координаты по оси
X
- GetMaxY получение максимально доступной координаты по оси
Y
- GetPixel получение текущего цвета точки экрана
- GetX получить значение координаты X
- GetY получить значение координаты Y
- MoveRel переместить курсор из данной текущей точки на заданное
приращение.
- MoveTo переместить курсор из данной текущей точки в заданную
точку
- Процедуры и функции для работы с "графическими примитивами":
- Arc Рисует дугу
- Bar Рисует полосу
- Bar3D Рисует трехмерную полосу
- Circle Рисует окружность
- DrawPoly Рисует многоугольник
- Ellipse Рисует эллиптическую дугу или эллипс
- FillEllipse Рисует заполненный эллипс
- FillPoly Заполняет многоугольник
- Line, LineRel, LineTo Рисует линию
- Rectangle Рисует прямоугольник
- Sector Рисует сектор эллипса
- PutPixel Рисует точку
- Процедуры для работы с текстом
- OutText Вывод текста
- OutTextXY Вывод текста
Итак, для запуска графической системы нам необходимо:
- Подключить модуль GRAPH - библиотеку графических процедур:
Uses Graph;
- Установить графический режим с помощью двух переменных:
Program G;
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 пикселям.
Чтобы точно строить изображение на экране, Вам
нужно сначала нарисовать, как это должно выглядеть на бумаге. Для этого
начертите в тетради систему координат графического режима.
Итак, отсчет начинается с верхнего левого угла
с координатами (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
- устанавливает текущий цвет для выводимых линий и символов.
Задания.
- Исправьте свою программу так, чтобы процедуры рисовали линии различных
цветов.
- В начерченной ранее системе координат изобразите на чертеже точки:
А(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).
- Соедините точки, получая отрезки:
AB, BC, CD, AD, EK, KL, LF, FM, ME.
Какая фигура у Вас получилась?
- Напишите программу, рисующую эту фигуру, по вашему рисунку.
|