
- •5.2. Модуль graph
- •5.2.1. Переход в графический режим и возврат в текстовый.
- •5.2.2. Инициализация графического режима
- •InitGraph (Driver, Mode, Path);
- •5.2.3. Экран и окно в графическом режиме
- •5.2.4. Рисование линий и точек.
- •5.2.5. Рисование многоугольников
- •5.2.6. Рисование дуг, окружностей, эллипсов
- •5.2.7. Краски, палитры, заполнения
- •5.2.8 Вывод текста
- •Задачи для самостоятельного решения.
- •Литература
5.2.8 Вывод текста
Специально для графического режима разработаны процедуры и функции, обеспечивающие вывод текстовых сообщений различными шрифтами в горизонтальном и вертикальном направлениях.
Процедура OutText. Процедура OutText выводит текстовую строку, начиная с текущего положения указателя.
Формат вызова процедуры в программе:
OutText(Txt);
Переменная Txt типа string - выводимая строка. При горизонтальном направлении вывода указатель смещается в конец выведенного текста, при вертикальном - не меняет своего положения. Если текст выходит за границы экрана, то при использовании штриховых шрифтов он отсекается, а в случае стандартного шрифта не выводится.
Процедура OutTextXY. Процедура OutTextXY выводит строку с заданного места.
Формат вызова процедуры в программе:
OutTextXY(X, Y ,Txt);
Переменные X,Y типа Integer - координаты точки начала вывода текста, Txt - переменная или костанта типа string (выводимая строка).
Замечание. В модуле Graph нет процедур, предназначенных для вывода численных данных. Для вывода данных такого типа нужно сначала преобразовать число в строку с помощью процедуры Str, а затем посредством операции конкатенации подключить ее к выводимой строке Txt в процедуре OutTextXY.
Процедура SetTextStyle. Процедура SetTextStyle устанавливает стиль текстового вывода на графический экран.
Формат вызова процедуры в программе:
SetTextStyle(Font, Direct, Size);
Переменные Font, Direct, Size типа Word. Font - код шрифта; Direct - код направления; Size - код размера шрифта. Для указания кода шрифта можно использовать следующие, предварительно определенные константы:
const
DefaultFont =0; {Точечный шрифт 8 на 8}
TriplexFont =1; {Утроенный шрифт TRIP.CHR}
SmallFont =2; {Уменьшенный шрифт LITT.CHR}
SansSerifFont =3; {Прямой шрифт SANS.CHR}
GothicFont =4; {Готический шрифт GOTH.CHR}
Шрифт DefaultFont создается графическим драйвером в момент инициации графики.
Для задания направления выдачи текста можно использовать константы:
const
HorizDir =0; {Слева направо}
VertDir =1; {Снизу вверх}
Процедура SetTextJustify. Процедура SetTextJustify задает вырав-нивание выводимого текста по отношению к текущему положению указателя или к заданным координатам.
Формат вызова процедуры в программе:
SetTextJustify(Horiz, Vert);
Переменные Horiz, Vert типа Word. Horiz горизонтальное , Vert - вертикальное выравнивание.
Выравнивание определяет как будет располагаться текст - левее или правее указанного места, выше, ниже или по центру. Здесь можно использовать следующие константы:
const
LeftText =0; {Указатель слева от текста}
CenterText =1; {Симметрично слева и справа, сверху и снизу}
RightText =2; {Указатель справа от текста}
BottomText =0; {Указатель снизу от текста}
TopText =2; {Указатель сверху от текста}
Процедура SetUserCharSize. Процедура SetUserCharSize изменяет размер выводимых символов в соответствии с заданными пропорциями.
Формат вызова процедуры в программе:
SetUserCharSize(X1, X2, Y1, Y2);
Переменные X1..Y2 - выражения типа Word, определяющие пропорции по горизонтали и вертикали.
Функция TextWidth. Функция TextWidth возвращает длину выводимой текстовой строки в пикселях.
Формат обращения к функции в программе:
N:=TextWidth(Txt);
Переменная N типа Word, переменная Txt типа string.
Функция TextHeight. Функция TextHeight возвращает высоту шрифта в пикселях.
Формат обращения к функции в программе:
N:=TextHeight(Txt);
Переменная N типа Word, переменная Txt типа string.
Пример 1. Программа выводит на экран разноцветные линии, выходящие из середины нижней границы экрана (веер).
program Ris_1;
uses Crt, Graph;
var
Driver, Mode: integer;
color: word;
x, y: integer;
begin
Driver:= Detect;
InitGraph(Driver,Mode,'c:\bp\bgi');
Randomize; color:=0;
repeat
x:=random(GetMaxX); y:=random(GetMaxY);
setcolor(color); line(320,480,x,y); inc(color);
if color=GetMaxColor then color:=0;
until keypressed;
closegraph
end.
Пример 2. Программа периодически выводит на экран «звездное небо» и затем гасит его. Для выхода из программы нажмите клавишу ввода.
program Ris_2;
uses Crt, Graph;
const n=1000;{количество звезд}
type
Pixel_type=record x,y:integer end;
var
Driver,Mode,e,k: integer;
color: word;
x1,y1,x2,y2: integer;
a: array[1..n] of Pixel_type;
begin
Driver:= Detect;
InitGraph(Driver,Mode,'c:\bp\bgi');
e:=GraphResult;
if e<>0 then writeln('ошибка инициализации – ',e)
else
begin
{создаем окно в центре экрана}
x1:=GetMaxX div 4; y1:=GetMaxY div 4;
x2:=3*x1; y2:=3*y1;
Rectangle(x1, y1, x2, y2);
SetViewPort(x1 + 1, y1 + 1, x2 – 2, y2 – 2, ClipOn);
{создаем и запоминаем звезды}
for k:=1 to n do
with a[k] do
begin x:=Random(x2 – x1); y:=Random(y2 – y1) end;
{Зажигаем и гасим звезды}
color:=0;
repeat
for k:=1 to n do
begin
inc(color);
if color=GetMaxColor then color:=0;
with a[k] do
PutPixel(x,y,color); delay(100)
end;
if not KeyPressed then
for k:=n downto 1 do
with a[k] do
PutPixel(x,y,black);
until KeyPressed;
CloseGraph
end
end.
Пример 3. Программа выводит на экран пятиугольник и закрашивает его голубым цветом (при нажатии клавиши ввода), красным в полоску.
program Ris_2;{мноугольник}
uses Crt, Graph;
type
point = record
x, y: integer
end;
const points: array[1..6] of point = ((x: 120; y: 20), (x: 220; y: 20),
(x: 320; y: 120), (x: 220; y: 320), (x: 120; y: 200), (x: 120; y: 20));
var
Driver, Mode: integer;
color: word;
begin
Driver:= Detect;
InitGraph(Driver,Mode,'c:\bp\bgi');
SetColor(4);
DrawPoly(6,points); readln;
SetFillStyle(1,11);
FloodFill(130,25,4); readln;
SetFillStyle(3,12);
FillPoly(6,points);
readln;
CloseGraph
end.
Пример 4. Программа выводит на экран окружность, эллипс, дугу и сектор.
program Ris_4;
uses Crt, Graph;
var
Driver, Mode: integer;
color: word;
x, y: integer;
xr,yr,r: word;
angl1,angl2: word;
begin
Driver:= Detect;
InitGraph(Driver,Mode,'c:\bp\bgi');
SetColor(4);
x:=100; y:=200; r:=50;
SetFillStyle(1,11);
Circle(x,y,r);
FloodFill(100,200,4); readln;
x:=250; xr:=50; yr:=100; r:=100;
SetFillStyle(1,12);
Ellipse(x,y,0,360,xr,yr);
FloodFill(250,200,4); readln;
SetFillStyle(3,12);
FillEllipse(530,140,60,90); readln;
Arc(500,300,0,100,50); readln;
SetColor(10); SetFillStyle(1,10);
PieSlice(430,400,10,100,70); readln;
CloseGraph
end.
Пример 5. Программа выводит на экран рисунок – паровозик.
program Ris_5;
uses Graph, crt;
var
Driver, Mode, e: integer;
color: word;
procedure paravoz;
begin {паравозик}
SetBkColor(7);
SetFillStyle(1,4); Rectangle(80,240,420,360);
FloodFill(90,245,15);
SetFillStyle(1,2); Bar(420,120,560,360);
SetFillStyle(1,15);Bar(450,150,530,230);
SetFillStyle(1,4); Bar(130,240,180,180);
end;
procedure kolesa;
var x: integer;
begin {колеса}
x:=180;
SetFillStyle(1,1);
While x<= 520 do
begin
circle(x,390,30);
FloodFill(x,390,15);
x:=x+70
end;
end;
procedure dim;
var x,y,r:integer;
begin {дым}
y:=120; x:=160; r:=25;
SetColor(15);
while y>=10 do
begin
circle(x,y,r);
x:=x+20; y:=y-20; r:=r-4;
end
end;
begin
Driver:= Detect;
InitGraph(Driver,Mode,'c:\bp\bgi');
e:=GraphResult;
if e<>0 then writeln('ошибка инициализации -', e);
Color:=15;
paravoz; kolesa;dim;
delay(30000){задержка изображения на экране}
end.
Пример 6. Программа выводит на экран пирамиду.
program Ris_6;{пирамида}
uses Crt, Graph;
var
Driver, Mode: integer;
color: word;
x,y: integer; z: string;
begin
Driver:= Detect;
InitGraph(Driver,Mode,'c:\bp\bgi');
Color:=15; z:='PIRAMIDA';
SetTextStyle(0, 0, 3);
OutTextXY(100, 10, z);
SetLineStyle(3, 0, 1);
Line(320, 40, 320, 335); {SO}
Line(200, 300, 450, 300); {AB}
SetLineStyle(0, 0, 1);
Line(320, 40, 200, 300); {SA}
Line(320, 40, 450, 300); {SB}
Line(320, 40, 360, 400); {SC}
Line(200, 300, 360, 400); {AC}
Line(360, 400, 450, 300); {BC}
SetTextStyle(1, 0, 2);
OutTextXY(325, 20, 'S');
OutTextXY(460, 300, 'B');
OutTextXY(360, 410, 'C');
OutTextXY(190, 300, 'A');
OutTextXY(300, 320, 'O');
Delay(50000)
end.
Пример 7. Программа выводит на экран график функции.
program Ris_7;
uses Crt, Graph;
var
Driver, Mode: integer;
color: word;
i,xg,yg: integer;
x: real;
begin
Driver:= Detect;
InitGraph(Driver,Mode,'c:\bp\bgi');
SetColor(15); SetBkColor(0);
Line(10,90,250,90); Line(10,20,10,160);
x:=0; SetLineStyle(0,0,3);
for i:=0 to 190 do
begin
xg:=10+round(95/pi*x); yg:=90-round(50*sin(x));
PutPixel(xg,yg,11);
x:=x+pi/95
end;
OutTextXY(15,25,'Y');
OutTextXY(255,90,'X');
OutTextXY(100,40,'y=sinx');
Readln;
CloseGraph
end.
Пример 8. Программа выводит следующее изображение: на рисунке большая окружность окружена четырьмя поменьше, каждая из которых в свою очередь окружена четырьмя окружностями с ещё меньшими радиусами.
program Ris_8;
uses Crt, Graph;
var Driver, Mode: integer; color: word;
x,y,n,r,r1: integer; k1,k2:real;
procedure Picture(x,y,r,r1,n:integer);
var x1,y1:integer; i:integer;
begin
if n>0 then
begin
circle(x,y,r);r1:=trunc(r*k2);
for i:=1 to 4 do
begin x1:=trunc(x+r1*cos(pi/2*i)); y1:=trunc(y+r1*sin(pi/2*i));
picture(x1,y1,trunc(r*k1),r1,n-1);
end;
end;
end;
begin
Write('Введите количество уровней n – '); Readln(n);
Write('Введите радиус первой окружности r – '); Readln(r);
x:=600 div 2; y:=400 div 2;
k1:=0.3; k2:=2;
Driver:= Detect;
InitGraph(Driver,Mode,'c:\bp\bgi');
Picture(x,y,r,r1,n);
readln;
CloseGraph
end.