End.
У процедуры InitGraph три параметра. Первый параметр в этой процедуре задает тип видеоадаптера, второй определяет режим, а третий представляет собой строку с указанием расположения драйвера на диске.
Для завершения работы в графическом режиме необходимо всегда производить вызов процедуры CloseGraph. Очищает экран, переводит адаптер в текстовый режим.
Любое изображение на экране монитора формируется из отдельных элементов – пикселов (от английского pixel, возникшего в результате объединения слов «рисунок» (picture) и «элемент» (element)) которые можно закрасить в тот или иной цвет.Экран монитора можно рассматривать как матрицу пикселов. Для получения того или иного изображения на экране монитора как в графическом, так и в текстовом режимах необходимо заставить светиться строго определенную группу пикселов. В текстовом режиме на экран могут выводиться только определенные символы, образы которых хранятся в постоянной или оперативной памяти компьютера, а управление отдельными пикселями невозможно. В графическом режиме появляется возможность управления отдельными пикселями, что позволяет формировать любые изображения [34, с. 112].
Каждый пиксель имеет две координаты: xи y. Количество пикселей зависит от типа адаптера и режима его работы (рисунок 3). Значения xmax и ymax зависят от текущего графического видеорежима. В случае адаптера VGA и режима VGAHi xmax = 639, а ymax = 479.
В модуле Graph определены две функции GetMaxx и GetMaxy, возвращающие текущие значения параметров xmax и ymax, соответственно.
Рис. 3. Система координат
«Текущий указатель» (CP – Current Pointer) или, как его еще называют, графический курсор выполняет те же функции, что и курсор в текстовом режиме, однако является при этом невидимым. Положение графического курсора указывает на начальные координаты изображения графического примитива, выводимого «от текущей позиции». Текущий указатель перемещается специальными процедурами. В частности, процедура MoveTo (x, y); перемещает его в точку экрана, с координатами (x, y). Другая процедура – MoveRel (dx, dy); перемещает текущий указатель на dx пикселов по горизонтали и на dyпикселов по вертикали относительно последнего положения текущего указателя.
Какие бы изображения не выводились на экран, все они построены из точек. Имея средство построения точки определенного цвета в нужном месте экрана теоретически можно создать изображение любой сложности.
Вывод точки осуществляется процедурой PutPixel (x, y, Color), где x и y– экранные координаты точки, а Color – ее цвет.
Пример:
x := GetMaxxdiv 2; {Вывод красной точки в центр экрана}
y := GetMaxy div 2;
PutPixel (x, y, Red );
При выводе на экран точки ее цвет указывается непосредственно в процедуре PutPixel. Во всех остальных случаях, при построении графических примитивов (линий, прямоугольников, окружностей и т.п.), а также при выводе текста, цвет их контуров (цвет пера) задается специальной процедурой: SetColor (Color), где Color – цвет.
Для установки цвета фона графического экрана имеется процедура: SetBkColor (Color). При выполнении процедуры SetBkColor экран сразу же окрашивается в заданный цвет.
Для построения отрезков прямых имеется специальная процедура Line (x1, y1, x2, y2), где x1, y1 – координаты начала, а x2, y2 – координаты конца отрезка.
Пример программы. Изобразить треугольник с разноцветными краями.
Program Primer_2;
Uses Graph;
Var Gd,Gm: Integer;
Begin
Gd:=VGA; Gm:=VGAHi; InitGraph (Gd,Gm,'..\bgi');
If GraphResult=grOk
Then begin
SetColor (LightMagenta); {Цвет - светло-сиреневый}
Line (120,210,520,210); {Горизонтальныйотрезок}
SetColor (LightCyan); {Цвет - светло-циановый}
Line (120, 210, 320, 10); {Левыйкатет}
Set Color (Green); {Цвет - зеленый}
Line (320, 10,520,210); {Правыйкатет}
ReadLn;
CloseGraph;
End
End.
Процедура LineTo (x, y) строит отрезок прямой из точки текущего положения указателя в точку с координатами x, y.
Turbo Pascal 7.0 позволяет вычерчивать линии самого различного стиля:
тонкие, широкие, пунктирные.
Установка стиля производится процедурой SetLineStyle (Style, Pattern, Thickness), где Style – параметр, определяющий стиль линии. Возможные значения этого параметра приведены в «таблице 1» [23, с. 143].
Таблица 1.
Стили линии
Описание стиля | Константа |
сплошная линия | SolidLn = 0 |
точечная линия | DottedLn = 1 |
штрих-пунктирная линия | CenterLn = 2 |
пунктирная линия | DashedLn = 3 |
стиль, определяемый пользователем | UserBitLn = 4 |
Pattern – образец; Thickness – толщина линии. Если применяется один из стандартных стилей, значение параметра Pattern должно быть равно 0.
Параметр Thickness может принимать всего два значения:
NormWidth = 1 – линия толщиной в один пиксел;
ThickWidth = 3 – линия толщиной в три пиксела.
Далее будут приведены процедуры, с помощью которых можно строить различные геометрические фигуры (окружности, прямоугольники, дуги). При этом стиль линии, которой вычерчивается контур той или иной фигуры также устанавливается процедурой SetLineStyle.
Для построения прямоугольных фигур имеется несколько процедур. Первая из них – процедура вычерчивания одномерного прямоугольника: Rectangle (x1, y1, x2, y2), где x1, y1 – координаты верхнего левого угла, x2, y2 – координаты правого нижнего угла прямоугольника.
Примерпрограммы:
Program Primer_3;
Uses Graph;
Var grDriver: Integer;
grMode: Integer;
i,x,y: Integer;
Procedure Rect (x,y,x1,y1: Integer);
{Рисует прямоугольник, у которого левый нижний угол}
{имеет координаты (x,y), а правый верхний – (x1,y1)}
Begin
Line (x,y,x,y1); {Левая сторона}
Line (x1,y,x1,y1); {Правая сторона}
Line (x,y1,x1,y1); {Верхняя сторона}
Line (x,y,x1,y) {Нижняя сторона}
End;
Begin
GrDriver:=VGA; GrMode:=VGAHi;
InitGraph (grDriver,grMode,'..\bgi');
If GraphResult=grOk
Then begin
For i:=1 to 15 do
Begin
x:=i*30; y:=i*25; SetColor (i);
Rect (x,y,x+50,y+60)
End;
ReadLn;
CloseGraph;
End;
End.
Для построения закрашенных прямоугольников используется процедура: Bar (x1, y1, x2, y2), где параметры x1, y1, x2 и y2 имеют то же смысл, что и в процедуре Rectangle.
Цвет и стиль закраски устанавливается процедурой SetFillStyle (Pattern, Color), где параметр Pattern определяет стиль (шаблон) заливки, а параметр Color – ее цвет.
Для построения «объемных» закрашенных прямоугольников используется процедура: Bar3D ( x1, y1, x2, y2, Depth, Top ).
Тип и цвет заливки устанавливается процедурой SetFillStyle. Параметр Depth определяет глубину трехмерного контура. Чаще всего его значение равно четверти ширины прямоугольника: Depth := (x2-x1) div 4;
Параметр Top определяет, строить над прямоугольником вершину (True) или нет (False). Например:
SetFillStyle(XhatchFill, Red );
Bar3D (10, 10, 50, 100, 10, True);
Процедура вычерчивания окружностей текущим цветом имеет вид: Circle ( x, y, Radius ), где x, y – координаты центра окружности, а Radius – ее радиус. Например, следующий фрагмент выводит ярко-зеленую окружность c радиусом 50 пикселов и центром в точке 450, 100:
SetColor (LightGreen);
Circle (450, 100, 50);
Для вычерчивания дуг используется процедура Arc (x, y, StartAngle, EndAngle, Radius), где x, y – координаты центра дуги, StartAngle и EndAngle – начальный и конечный угол (в градусах), Radius – радиус. Очевидно, что если StartAngle = 0, а EndAngle = 359, то вычерчивается полная окружность.
Для заполнения внутренней или внешней области фигуры определенным образцом закраски используется процедура: FloodFill (X, Y, Border), где x, y – координаты точки внутри или вне фигуры, Border – цвет контура фигуры. Если точка (x, y) находится внутри замкнутой области, то заполняется внутренняя область. Если эта точка находится вне замкнутой области, то заполняется ее внешняя часть [23, с. 222].
Пример: красная окружность, заполненная зеленой штриховкой
SetColor (Red); Circle (450, 100, 50);
SetFillStyle (SlashFill, Green);
FloodFill (450, 100, Red);
В графическом режиме стандартные процедуры вывода Write и Writeln не работают. Для вывода текстовой информации на графический экран используют две процедуры OutText и OutTextxy.
Процедура: OutText (TextString) выводит на экран строку текста, начиная с текущего положения графического курсора.
Например: OutText (‘Добро пожаловать!’);
Явный недостаток этой процедуры – нельзя указать произвольную точку начала вывода. Его можно устранить с помощью процедуры MoveTo, которая перемещает указатель в нужную позицию, но лучше воспользоваться процедурой: OutTextxy (x, y, TextString),где x, y – координаты точки начала вывода текста, TextString – константа или переменная строкового типа string. Например, чтобы вывести сообщение «Для продолжения нажмите любую клавишу ...», начиная с точки 20, 400 надо записать:
OutTextxy (20, 400, ‘Для продолжения нажмите любую клавишу ...’);
Для начинающих проблемой является вывод числовых данных на графический экран, ибо в модуле Graph нет предназначенных для этого процедур. Выход прост: преобразовать числовое значение в строковое с помощью процедуры Str.