Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль.doc
Скачиваний:
58
Добавлен:
07.06.2015
Размер:
1.21 Mб
Скачать

23.3.4. Построение графических изображений

Модуль Graph широко применяется для построения графиков и вычерчивания линий, окружностей, эллипсов, прямоугольников и т.д. Используемые линии могут быть сплошные, штриховые и т.д. Замкнутые области можно закрашивать сплошной заливкой, штриховкой и др. Большинство процедур модуля Graph используется для построения графических изображений. При этом в начале необходимо задать стиль (тип и толщину) линии контура с помощью процедуры

1) SetLineStyle(Тип_линии, Образец, Толщина : Word);

Определены следующие константы и их значения для выбора Типа_линии:

Имя константы

Значение

Характеристика

SolidLn

0

непрерывная

DottedLn

1

линия из точек

CenterLn

2

штрих–пунктирная

DashedLn

3

пунктирная

UserBitLn

4

определяемая пользователем

Образец должен быть равен 0, если используется стандартная линия (Типа 0..4) и отличен от 0, если пользователь задает свой образец.

Для параметра Толщина определены константы:

NormWidth = 1 – нормальная толщина,

ThicklWidth = 3 – жирная (тройная) линия.

2) Построение линий выполняется процедурами:

Line(X1,Y1,X2,Y2); – проводит линию между точками с координатами (X1,Y1) и (X2,Y2);

LineTo(X,Y); – проводит линию из текущего положения курсора до точки с координатами (X,Y).

3) Процедура Circle(X,Y:integer; R:Word) – строит окружность радиусом R с центром в точке (X,Y).

4) Процедура Rectangle(X1,Y1,X2,Y2) – строит прямоугольник с координа­тами: (X1,Y1) – верхний левый, (X2,Y2) – нижний правый угол.

5) Процедура DrawPoly(колич_координат:word; var координаты_вершин); рисует многоугольник, используя текущие цвет и тип линии. Параметр координаты_вершин является нетипизированным и содержит координаты (X, Y) вершин многоугольника. Тип координат – Word. Параметр колич_координат задает их число.

Замечание. Для вычерчивания n-угольника нужно задать n+1 координату, причем вершина (n+1) должна иметь координаты, совпадающие с вершиной 1. Обычно координаты_вершин задают как типизированную константу. При этом используют определенный в модуле Graph тип PointType, представляющий собой запись, содержащую два значения: X и Y.

Ниже приведен текст программы, использующей процедуру DrawPoly для рисования шестиугольника. Обратите внимание на способ задания координат вершин в виде типизированной константы–массива.

Program DemoDrawPoly;

uses

Graph,Crt;

const

N=7; { Количество вершин многоугольника +1}

MultiRect: array[1..N] of PointType = {Координаты вершин}

((X: 200; Y: 100), {Координаты первой вершины и }

(X: 285; Y: 155),

(X: 285; Y: 255),

(X: 200; Y: 300),

(X: 115; Y: 255),

(X: 115; Y: 155),

(X: 200; Y: 100)); {последней (замыкающей) должны совпадать}

var

Gd, Gm, GrEr: Integer;

begin

Gd := Detect;

InitGraph(Gd, Gm, ’d:\bp\bgi’);

GrEr := GraphResult;

if GrEr = grOk then

begin

DrawPoly(N, MultiRect);

OutTextXY(50,20,’Нажмите любую клавишу...’);

Repeat Until KeyPressed;

CloseGraph;

end

else

begin

WriteLn(’Ошибка графики: ’,GrEr,’. Нажмите Enter...’);

Readln;

end;

end.

Сведения о других примитивах можно найти в книгах по Турбо Паскалю или в справочной системе Турбо Паскаля.

Все фигуры, как отмечалось выше, рисуются текущим цветом и типом линии. Цвет линии задается из имеющегося активного набора цветов – палитры.

Пример. Написать программу построения графика заданной функции Y=f(X) для аргумента X, изменяющегося от xn до xk. Для определенности будем считать, что Y=sin(x), xn = –2π, xk = 2π.

Общие соображения по написанию программы для построения графиков приводились в п. 5.1.4. При построении графика должны быть определены масштабы – коэффициенты, с помощью которых натурные величины (X, Y) будут переводиться в графические координаты (xG, yG). В общем случае пределы изменения натурных величин: аргумента (xn, xk) и функции (Ymin, Ymax) должны быть отображены на выбранные пределы изменения графических координат:

xGnx графическое начальное,

xGkx графическое конечное,

yGny графическое начальное,

yGky графическое конечное.

С учетом сказанного, масштабы можно определить по формулам:

mx:=(xGk-xGn)/(xk-xn); { Масштаб по X }

my:=(yGk-yGn)/(ymax-ymin); { Масштаб по Y }

Максимальное и минимальное значения функции (хотя бы приблизительные, лучше с запасом в большую сторону) должны быть заданы пользователем. Для перехода к графическим координатам получим следующие соотношения:

xG:=Round(xGn+(x-xn)*mx);

yG:=Round(yGn+(ymax-y)*my);

Для построения графика воспользуемся процедурой LineTo, которая будет проводить линию от точки к точке.

Программа построения графика может быть такой.

Program PlotGrafik;

uses

Crt, Graph;

const

xGn=20; { Константы, определяющие }

yGn=50; { область экрана, }

xGk=600; { в которую будет }

yGk=470; { выводиться график }

xn=-2*pi/2; { Начальное и }

xk=2*pi/2; { конечное значение аргумента }

ymin=-1; { Предполагаемые минимальное и }

ymax=1; { максимальное значения функции }

kT=150; { Количество точек графика }

var

grDr, grMd, grEr : integer;

x, y, Dx : real;

xG, yG : integer;

mx, my : real; { Масштабы по X и Y }

Function f(x:real):Real;

begin

f:=sin(x); {Функция, для которой строится график}

end;

begin

grDr:=Detect;

InitGraph(GrDr, GrMd, ’D:\bp\BGI’);

GrEr:=GraphResult;

if GrEr=GrOk then { Графический режим удачно открыт}

begin

SetBkColor(Blue);

ClearDevice; {Очистим экран, сделаем фон голубым}

Dx:=(xk -xn)/(kT-1); { Шаг изменения аргумента }

mx:=(xGk-xGn)/(xk-xn); { Масштаб по X }

my:=(yGk-yGn)/(ymax-ymin); { Масштаб по Y }

SetLineStyle(0,0,1); { Одинарная линия }

SetColor(Red); { Оси нарисуем красным }

Line(Round(xgn+(0-xn)*mx),ygn-20,

Round(xgn+(0-xn)*mx),ygk); {Ось Y, на ней X=0}

Line(xgn,Round(ygn+(ymax-0)*my),

xgk+20,Round(ygn+(ymax-y)*my));{Ось X, на ней Y=0}

{Изображение стрелки на конце оси X и надписи X}

MoveTo(xgk+20,Round(ygn+(ymax-y)*my));

LineRel(-8,4);

MoveTo(xgk+20,Round(ygn+(ymax-y)*my));

LineRel(-8,-4);

MoveRel(0,-25);

SetTextStyle(1,0,1); {Шрифт для обозначения осей}

OutText(’X’);

{Рисование стрелки на конце оси Y и надписи Y}

MoveTo(Round(xgn+(0-xn)*mx),ygn-20);

LineRel(-4,8);

MoveTo(Round(xgn+(0-xn)*mx),ygn-20);

LineRel(4,8);

MoveRel(0,-15);

OutText(’Y’);

SetColor(white); { Белый цвет для линии графика }

x:=xn; { Текущее значение для X }

y:=F(x); { Значение функции для этого X }

xG:=Round(xgn+(x-xn)*mx); {Графическая коорд. по X}

yG:=Round(ygn+(ymax-y)*my);{Графическая коорд. по Y}

MoveTo(xg,yg); { Курсор в эту точку экрана }

While x<=xk do {Цикл для всех значений аргумента}

begin

x:=x+dx;

y:=f(x);

xG:=Round(xgn+(x-xn)*mx);

yG:=Round(ygn+(ymax-y)*my);

LineTo(xG,yG);

end;

SetTextStyle(0,0,1); { Шрифт для вывода текста }

OutTextXY(5,5,’График функции Y=Sin(X)’);

OutTextXY(5,20,’Нажмите любую клавишу...’);

Repeat Until KeyPressed

CloseGraph; { Закрываем графический режим }

end

else

begin

WriteLn(’Ошибка графики ’,GrEr,’ ’,GraphErrorMsg(GrEr));

WriteLn(’Нажмите Enter...’);

ReadLn;

end;

End.

Закраска замкнутой области выполняется процедурами:

5) SetFillStyle(Тип_закраски, Цвет : Word); – устанавливает тип (стиль) закраски и ее цвет.

В Турбо Паскале определено большое количество типов закраски, которые можно задавать либо с использованием предопределенных имен констант, либо их значений. Приведем некоторые из них:

0 – заполнение области фоновым цветом;

1 – сплошное заполнение области заданным цветом;

2– заполнение области горизонтальными линиями ;

3– заполнение области наклонными линиями ;

4– заполнение области толстыми наклонными линиями

. . . . . . .

11 – заполнение области частыми точками;

12 – заполнение области стилем, определяемым пользователем.

Цвет - цвет закраски (из палитры).

Пример. SetFillStyle(4,1);

6) FloodFill(x,y,Цвет_границы : Word); – закрашивает ограниченную область, используя текущий образец закраски.

Точка (x, y) является внутренней точкой закрашиваемой области. Для заполнения области, ограниченной цветом, определяемым параметром Цвет_границы, используется текущий образец закраски.

Например, программа, которая рисует концентрические окружности с координатами центра (150, 100) всеми 15-ю цветами (MaxColors) и закрашивает получившиеся кольца всеми 11-ю типами заливки и цветом, отличным от цвета контура будет иметь вид.

Program All_Colors;

Uses

Graph;

Var

Er,GraphDriver, GraphMode : Integer;

X, Y : Integer;

Radius, Color : Integer;

Begin

GraphDriver := Vga;

GraphMode := VgaHi;

InitGraph(Graphdriver, GraphMode,’’);

Er := GraphResult;

If Er=Grok then

begin

ClearDevice; {Черный цвет фона – по умолчанию }

For Color := 0 to MaxColors do

Begin

SetColor(Color);

For Radius := 1 to 11 do

Begin

Circle(150, 100, Radius*10);

SetFillStyle(Radius, MaxColors - Color);

Floodfill(150-Radius*10+5, 100, Color);

End;

{ Останов после вывода 11 окружностей одним цветом контура}

readln;

End;

CloseGraph;

end

Else

Writeln(’Ошибка графики ’,Er);

Readln;

end.