Процедуры write и writeln могут быть использованы только в текстовом режиме, т.к. именно в этом режиме экран дисплея рассматривается как консольное устройство CON. В графическом режиме для вывода на экран дисплея текстовых сообщений необходимо использовать одну из двух стандартных процедур модуля graph:
1)outtext (<строка>)
выражение строкового типа <строка> выводится на экран, начиная с текущей позиции графического курсора;
2)outtextxy(X,Y,<строка>)
выражение <строка> выводится на экран, начиная с заданных координат (X,Y).
Установить вид выводимых на экран символов позволяет процедура
3)settextstyle(<шрифт>,<направление>,<размер>);
Шрифт выводимых символов задается числом из диапазона 0..10. Шрифты с 1 по 10 – векторные, с которыми просто проводятся операции масштабирования. Для русского алфавита может быть использован только шрифт 0. Направление выводимого текста задается значением 0 – горизонтальное или 1 – вертикальное.
Размер символов сообщения определяется коэффициентом увеличения символа. В случае использования векторных шрифтов размер выводимых символов можно регулировать с помощью процедуры:
4)setusercharsize(MX,DX,MY,DY),
которая изменяет ширину и высоту символов активного шрифта. Параметры MX,DX задают коэффициент изменения ширины (как отношение MX/DX), а параметры MY,DY определяют высоту символа при выводе. Стандартный размер символов, по отношению к которому осуществляется масштабирование, устанавливается процедурой 3).
В языке TURBO Pascal имеется значительное количество графических процедур и
функций. Нам понадобятся лишь некоторые из них. Для того чтобы компилятор
"узнавал" их названия, мы должны после заголовка программы разместить строчку
следующего вида:
uses Graph;(что в переводе на русский означает "используется графика").
До сих пор во время нашей работы за компьютером экран всегда находился в
текстовом режиме, поэтому на экране можно было видеть только лишь символы
(правда, включая такие изыски, как так называемые "символы псевдографики").
Для рисования прямых, окружностей и пр. необходимо перевести экран в графический
режим. Для включения графического режима используется процедура InitGraph.
Простейшая программа может иметь вид:
Пример 1.
PROGRAM Primer_1;
uses Graph;
var Gd,Gm: Integer;
BEGIN
Gd:=VGA; { Графический адаптер - VGA }
Gm:=VGAHi; {Графический режим VGAHi (640x480)}
InitGraph (Gd,Gm,'..\bgi'); {Включить графический режим }
If GraphResult=grOk
then {Если режим включился успешно}
{ Нарисовать отрезок прямой}
Line (0,0,639,479); ReadLn
END.
Мы видим, что у процедуры InitGraph три параметра. В качестве первых двух
фактических параметров должны стоять имена целых (integer) переменных. Не будем
вдаваться в подробности, почему это так; вместо этого выясним их предназначение.
Первый параметр является кодом графического адаптера (т.е. электронной схемы,
управляющей выводом информации на экран). (Дело в том, что на IBM-совместимых
компьютерах применяется ряд стандартных графических адаптеров, носящих названия
CGA, EGA, VGA.)
По нашей программе можно догадаться, что в используемых нами компьютерах
используется адаптер VGA, и компилятор сам "узнает" слово VGA и заменит его на
нужное целое число (на самом деле равное 9, но мы этого можем и не запоминать).
Каждый графический адаптер позволяет использовать несколько графических режимов, отличающихся количеством цветов и разрешающей способностью (в дальнейшем мы узнаем, что это такое). И второй из параметров как раз предназначен для того, чтобы указать, какой из графических режимов следует включить. Пока что мы
ограничимся лишь одним графическим режимом VGAHi.
Третий параметр является строкой, содержащей путь к файлу, который называется
EGAVGA.BGI. В этом файле содержится драйвер (такая специальная программа),
необходимый для работы с адаптерами EGA и VGA. И, как легко увидеть из нашего
примера, файл этот находится в подкаталоге TPBGI.
Все вышеизложенное необходимо знать каждому грамотному пользователю
IBM-совместимых компьютеров. Однако в нашей лабораторной работе достаточно
использовать конструкцию, использованную в первом примере, для включения
графического режима. (И не страшно, если в ней не все понятно.)
Для того чтобы мы могли что-либо нарисовать на экране, нам нужно уметь задавать
положение на экране того, что мы рисуем. Для этого с экраном связывается система
координат следующего вида:
(0,0) X
+ --------------------------------------------->
|
|
|
Y|
Каждая точка на экране на самом деле представляет собой очень маленький
прямоугольник (и поскольку это не совсем точка, то иногда используют специальный
термин - "пиксел"). Количество точек (пикселов), умещающихся на экране по
вертикали и горизонтали, называют разрешающей способностью. Разрешающая
способность экрана в режиме VGAHi - 640x480. Это означает, что по горизонтали на
экране умещается 640 точек, а по вертикали - 480.
Точка в левом верхнем углу экрана имеет координаты (0,0). Координата X любой
точки экрана лежит в пределах от 0 до 639, а координата Y - в пределах от 0 до
479. Как Вы уже догадались, процедура Line (x1,y1,x2,y2) рисует на экране прямую,
соединяющую точки (x1,y1) и (x2,y2).
Пример 2.
Изобразить на экране прямоугольный треугольник с вершинами (320, 10),
(120,210), (520,210).
PROGRAM Primer_2;
uses Graph;
var Gd,Gm: Integer;
BEGIN
Gd:=VGA; Gm:=VGAHi; InitGraph (Gd,Gm,'..\bgi');
If GraphResult=grOk
then begin
Line (120,210,520,210); {Горизонтальный отрезок}
Line (120,210,320,10); {Левый катет }
Line (320,10,520,210); {Правый катет }
ReadLn
end; end.
Довольно обидно работать на цветном мониторе только с черно-белыми изображениями. Для задания цвета рисования прямых, окружностей, точек и пр. используется процедура SetColor. В качестве единственного ее параметра нужно указать целое число, являющееся кодом цвета. Цвета кодируются в соответствии со следующей кодовой таблицей:
Black=0-черныйDarkGray=8-темно-серый
Blue=1-синийLightBlue=9-голубо
Green=2-зеленыйLightGreen=10- светло-зеленый
Cyan=3-цвет морской волныLightCyan=11-светло-циановый
Если Вы хорошо знаете, английский язык, то Вам будет удобнее использовать не числа, а соответствующие им идентификаторы; если же Вы английский знаете плохо, то все равно полезнее запомнить английские названия цветов, чем запоминать числа, кодирующие цвета.
Пример 3.
Изобразить тот же треугольник, что и в предыдущем примере, но сделать стороны треугольника разноцветным.
PROGRAM Primer_3;
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
end
END.
Пример 4. Разноцветные лучи.
PROGRAM Primer_4;
uses Graph;
const CenterX=320;
CenterY=240;
Radius=200;
var Gd,Gm: Integer;
i : Integer;
dx,dy: Integer;
BEGIN
Gd:=VGA; Gm:=VGAHi; InitGraph (Gd,Gm,'..\bgi');
If GraphResult=grOk
then begin
For i:=0 to 160 do
begin
dx:=Round (Radius*sin(i*pi/80));
dy:=Round (Radius*cos(i*pi/80));
SetColor (i MOD 16);
Line(CenterX,CenterY,CenterX+dx,CenterY+dy)
end;
ReadLn
End END.
Пример 5 . Концентрические окружности.
Для рисования окружностей используется процедура Circle с тремя целочисленными
параметрами, задающими координаты центра окружности и радиус.
PROGRAM Primer_5;
uses Graph;
const CenterX=320;
CenterY=240;
var Gd,Gm: Integer;
i : Integer;
BEGIN
Gd:=VGA; Gm:=VGAHi; InitGraph (Gd,Gm,'..\bgi');
If GraphResult=grOk
then begin
For i:=0 to 23 do
Circle (CenterX,CenterY,i*10);
ReadLn
end
END.
Пример 6. Разноцветные концентрические окружности.
Для закраски замкнутой области используется процедура FloodFill, три
целочисленных параметра, которой задают начальную точку закраски и код цвета ограничивающей область линии. Цвет, которым будет производиться закраска, ничего общего не имеет с цветом, задаваемым процедурой SetColor. Цвет закраски задается вторым параметром процедуры SetFillStyle. Первый параметр этой процедуры (задающий узор для закраски) на первых порах будем задавать равным единице (что соответствует сплошной закраске).
PROGRAM Primer_6;
uses Graph;
const CX=320;
CY=240;
var Gd,Gm: Integer;
i : Integer;
BEGIN
Gd:=VGA; Gm:=VGAHi; InitGraph (Gd,Gm,'..\bgi');
If GraphResult=grOk
then begin
For i:=0 to 23 do
Circle (CX,CY,i*10);
For i:=0 to 23 do
begin
SetFillStyle (1,i MOD 16);
{ Закрашивать до границы белого цвета}
FloodFill (CX,CY+i*10-5,White)
end;
Readln
end
END.
Пример 7.
PROGRAM Primer_7;
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
End: end.
Рисование прямоугольников - часто встречающаяся проблема, и поэтому
неудивительно, что существует стандартная процедура, работающая так же, как и созданная нами ниже процедура Rect. Она называется Rectangle.
Пример 8.
Для рисования "заполненных" прямоугольников используется процедура Bar. Так же, как и для процедуры Rectangle, мы должны указать четыре числа - координаты двух противоположных углов прямоугольника. (Для процедуры Bar цвет задается не с помощью SetColor, а с помощью SetFillStyle!).
PROGRAM Primer_8;
uses Graph;
const Step=35;
var grDriver: Integer;
grMode : Integer;
i,x,y : Integer;
PROCEDURE Square (x,y: Integer);
{ Рисует цветастый квадрат, центр которого }
{ имеет координаты (x,y)}
var i,d: Integer;
BEGIN
For i:=15 downto 0 do
begin
SetFillStyle (SolidFill,i); d:=i*3+2;
Bar (x-d,y-d,x+d,y+d)
end
END;
BEGIN
GrDriver:=VGA; grMode:=VGAHi;
InitGraph (grDriver,grMode,'..\bgi');
If GraphResult=grOk
then begin
For i:=0 to 10 do
{ На "побочной" диагонали - 11 точек }
begin
x:=50+i*Step; y:=50+(10-i)*Step;
SetColor(i); Square(x,y)
end;
ReadLn
end
END.
При рисовании сложных изображений, содержащих много отрезков, возникает довольно противная проблема - вычислять координаты всех точек. Если использовать процедуру LineRel, то достаточно указывать смещения по обеим координатам относительно текущей точки.
Для относительного перемещения без рисования используется процедура MoveRel Для задания начальных значений координат текущей точкииспользуется процедура MoveTo
Пример 9. Квадратная спираль.
PROGRAM Primer_9;
uses Graph;
const CenterX=320;
CenterY=240;
d=12;
var grDriver: Integer;
grMode : Integer;
i,L : Integer;
PROCEDURE Vitok (L,dL: Integer);
{ Начиная от текущей точки, рисует виток спирали}
{ из четырех отрезков увеличивающейся длины}
{ L - длина первого отрезка}
{ dL - приращение длины для каждого из следующих отрезков }
MoveTo (x+dx2-wx2,y-dy2); { Центр левой части рамы окна }
LineRel (wx,0); { Горизонтальная часть рамы окна }
SetFillStyle (SolidFill,Red);
FloodFill (x+1,y-1,White);
SetFillStyle (SolidFill,Blue);
FloodFill (x+dx2,y-dy-1,White)
END;
BEGIN
grDriver:=VGA; grMode:=VGAHi;
InitGraph (grDriver,grMode,'..\bgi');
If GraphResult=grOk
then begin
For i:=1 to 6 do
For j:=1 to 5 do
Domik (i*80,j*80);
ReadLn
end
END.
Если Вас интересуют другие графические процедуры или функции, то Вам следует обратиться к системе "помощи" (Help). Для этого в меню Help выберите пункт Standard units. Среди всего прочего Вы увидите список названий стандартных модулей (неважно, что вы не знаете, что это такое). Если установить курсор на слово Graph (этого можно достигнуть и с помощью клавиши Tab) и нажать Enter, то на экране появится общая информация о модуле Graph. Для продолжения нам предлагается два выбора:
Go to GRAPH.TPU Functions and Procedures
Go to GRAPH.TPU Constants and Types
Если выбрать пункт "Перейти к константам и типам GRAPH.TPU", то Вы сможете добраться до такой полезной информации, как названия графических режимов и их разрешение, названия цветов, названия стилей закраски и т.п. На случай, если Вам захочется там что-нибудь поискать, приведем перевод названий некоторых пунктов соответствующего меню:
Color Constants Цветовые константы
Fill Pattern Constants Константы для образцов закраски
Graphics Drivers Графические драйверы
Graphics Modes for Each Driver Графические режимы для каждого драйвера
Выбрав же пункт "Перейти к процедурам и функциям GRAPH.TPU", мы увидим внушительный список названий графических процедур и функций. Если поместить курсор на название приглянувшейся Вам процедуры (или функции), и нажать "перевод строки", то Вы увидите краткое описание этой процедуры (функции), и в конце - предложение посмотреть пример. (Если, скажем, Вы читаете информацию о процедуре Ellipse, то в самом конце Вы увидите слова