Возможность работы с графикой – одно из наиболее очевидных преимуществ персональных компьютеров. Поэтому фактически во всех системах программирования для персональных компьютеров предусмотрен какой-либо набор операторов и процедур для вывода графической информации. Система программирования Turbo Pascal содержит графический интерфейс BGI (Borland Graphics Interface), предназначенный для программирования графических изображений. В состав BGI входят модуль Graph (файл graph.tpu), содержащий все константы, процедуры и функции BGI-графики, управляющие программы (драйверы) видеосистемы (файлы типа .bgi), а также файлы шрифтов (файлы типа *.chr). Модуль Graph подключается в программе с помощью оператора Uses.
В IBM-совместимой ПЭВМ могут быть установлены различные видеоадаптеры, поэтому компьютер будет способен работать с разными типами мониторов, отображать различное число точек на экране и различное число цветов. Чтобы одна и та же программа могла работать на компьютерах с разными видеоадаптерами, в BGI-графике часть программы, выполняющих непосредственное взаимодействие с видеоадаптером, вынесена в отдельный файл с расширением *.bgi.
Фактически во всех современных компьютерах применяются видеоадаптеры, совместимые со стандартом VGA (Video Graphics Array), поэтому для работы с графикой необходим драйвер egavga.bgi.
Отметим, что модуль Graph содержит большое число программных объектов, полное описание которых можно найти в соответствующей литературе.
Графические режимы работы видеосистемы компьютера характеризуются двумя основными параметрами – разрешающей способностьюи цветовой глубиной изображения. Разрешающая способность, или разрешение (resolution), показывает, сколько отдельных точек, из которых состоит изображение на экране монитора, можно отобразить. Эти точки получили название пиксели (pixel – picture element). Например, если разрешение составляет 640 на 480 пикселей, или 640480, то на экране изображение занимает 480 строк по 640 точек в каждой строке, всего 307200 точек. Цветовая глубина (color depth) показывает, сколько цветов одновременно могут отображаться на экране. Например, при цветовой глубине 16 каждый пиксел на экране можно окрасить в один из 16 цветов; при этом для кодирования цвета одного пиксела требуется 4 бита памяти (24=16). Таким образом, и разрешение, и цветовая глубина существенно зависят от объема видеопамяти, в которой хранится числовой образ изображения. Основные режимы работы видеосистемы типа VGA и соответствующие константы модуля Graph приведены в табл. 6.13.
Таблица 6.13 Режимы работы видеоадаптера VGA
Константа | Разрешение | Цветовая глубина |
VGALo | 640200 | 16 |
VGAMed | 640350 | 16 |
VGAHi | 640480 | 16 |
Рассмотрим далее фрагмент программы, в которой устанавливается графический режим VGAHi. При этом предполагается, что файл драйвера egavga.bgi находится в каталоге E:\TP6\BGI.
Пример. Инициализация графического режима.
USES CRT,Graph;
VAR driver,mode: INTEGER;
BEGIN driver:=Detect; {определение видеоадаптера} mode:=VGAHi; {задание графического режима} InitGraph(driver,mode,'E:\TP6\BGI');{инициализация}
. . .
END.
В приведенном фрагменте в переменную driver записывается результат выполнения функции Detect, которая возвращает в виде кода тип видеосистемы компьютера. Переменная mode хранит константу, задающую требуемый видеорежим. Процедура InitGraph включает графический экран. Ей передаются три параметра: код типа видеосистемы, код графического режима и путь к файлу драйвера. Первые два параметра передаются по ссылке, поэтому они должны быть переменными типа INTEGER.
Отметим, что не всегда инициализация графики проходит успешно. Может оказаться, что не найден файл egavga.bgi или видеоадаптер не поддерживает требуемый видеорежим. Поэтому после вызова процедуры InitGraph рекомендуется проверять результат инициализации. Для этого предусмотрена переменная GraphResult, в которую после вызова любой процедуры или функции модуля Graph заносится код ее завершения. Если этот код не равен константе grOK, то имеет место ошибка. Характер ошибки можно определить с помощью функции GraphErrorMsg, возвращающей краткое описание ошибки в виде текстовой строки.
Пример. Усовершенствованная процедура инициализации графики. USES CRT, Graph;
. . .
PROCEDURE StartGraph(mode:INTEGER; path:STRING); VAR driver,error: INTEGER;
. . . BEGIN
driver:=Detect;
InitGraph(driver,mode,path); error:=GraphResult;
IF error <> grOK THEN
BEGIN
Writeln('Ошибка графики: ',GraphErrorMsg(error));
Halt(1) {завершение программы с кодом 1}
END
END; . . .
BEGIN
StartGraph(VGAHi,'E:\TP6\BGI'); . . .
ReadKey; {задержка до нажатия клавиши}
CloseGraph; RestoreCRTMode END.
В данном примере программы реализуется усовершенствованный алгоритм инициализации графического режима, предусматривающий в случае неудачи выдачу аварийного сообщения и прекращение работы программы. В конце программы, работающей с модулем Graph, должны вызываться процедуры закрытия графического режима CloseGraph и восстановления исходного текстового режима RestoreCRTMode.
Оперативно переключать видеорежимы в программе можно при помощи процедуры SetGraphMode(режим).
В BGI-графике предусмотрена возможность создания невидимого окна (viewport) в заданном месте экрана. Весь последующий графический вывод будет производиться в это окно, а координаты будут отсчитываться от левого верхнего угла окна. Это удобно при необходимости перемещать картинку – достаточно нарисовать ее в окне, а при переносе просто указать новые координаты окна.
Окно создается процедурой SetViewPort(x1,y1,x2,y,2clip), где x1, y1 – координаты левого верхнего угла окна; x2, y2 – координаты правого нижнего угла; clip – параметр типа Boolean, указывающий, будут ли отсекаться элементы изображения, выходящие за рамки окна (clip=True), или они будут рисоваться (clip=False).
Для уничтожения окна и перехода к системе координат экрана следует выполнить процедуру SetVierwPort(0,0,GetMaxX,GetMaxY,TRUE).
Все рисование в BGI-графике выполняется по координатам. Начало координат – точка (0,0) – лежит в левом верхнем углу экрана, ось OX направлена слева направо, а ось OY – сверху вниз. Каждая координата изменяется от 0 до некоторого максимального значения. Эти значения можно определить с помощью функций GetMaxX и GetMaxY, которые возвращают максимально возможные координаты точки по координатам X и Y соответственно. Так, для видеорежима с разрешением 640480 допустимые координаты лежат в диапазонах [0..639] и [0..479]. Центр экрана при этом находится в точке с координатами (GetMaxX div 2, GetMaxY div 2).
Рисовать можно любым из 15 цветов, кроме черного (черным может быть только фон). Цвета задаются с помощью констант: Black, Blue, Green, Cyan, Red, Magenta, Brown, Yellow, White, LightGray, DarkGray, LightGreen, LightCyan, LightMagenta.
Цвет фона задается процедурой SetBKColor(цвет). Цвет точек и линий изображения (но не цвет заливки!) задается процедурой SetColor(цвет). Процедура ClearDevice очищает графический экран и заполняет его фоновым цветом.
Все изображаемые объекты можно условно разделить на два вида: контурные и закрашенные. Контурные объекты образуются точками и линиями (отрезок, дуга, сектор, круг, эллипс, прямоугольник). Закрашенные объекты образуются сплошными закрашенными областями (закрашенный прямоугольник, закрашенный эллипс). В табл. 6.14 приведены процедуры рисования контурных объектов. Все угловые величины, используемые в качестве параметров в процедурах модуля Graph, отсчитываются в градусах против часовой стрелки.
Таблица 6.14 Процедуры рисования контурных объектов
Arc(x,y,sa,sb,r) | Рисует дугу с центром в точке с координатами (x,y), начальным углом sa, конечным углом sb и радиусом r | |
Circle(x,y,r) | Рисует окружность с центром в точке с координатами (x,y) и радиусом r | |
Ellipse(x,y,sa,sb,a,b) | Рисует эллипс или сектор эллипса с центром в точке с координатами (x,y), начальным углом sa, конечным углом sb, полуосями a и b | |
Line(x1,y1,x2,y2) | Проводит отрезок из точки с координатами (x1,y1) в точку с координатами (x2,y2) | |
PutPixel(x,y,c) | Задает цвет точки с координатами (x,y), код цвета – с | |
Rectangle(x1,y1,x2,y2) | Рисует прямоугольник с концами диагонали в точках с координатами (x1,y1) и (x2,y2) | |
Sector(x,y,a1,a2,r1,r2) | Рисует сектор с центром в точке с координатами (x,y), начальным углом a1, конечным углом a2, начальным радиусом r1 и конечным радиусом r2 |
Обращение к процедуре SetColor(цвет) должно быть выполнено до процедуры рисования объекта. Толщина и внешний вид линии контура объекта определяются с помощью процедуры SetLineStyle(s,p,t), где s – вид линии: SolidLn (сплошная); DottedLn (в виде точек); CenterLn (штрихпунктирная); DashedLn (пунктирная); p – всегда 0; t – толщина линии: NormWidth (один пиксел); ThickWidth (три пиксела).