Модуль Graph широко применяется для построения графиков и вычерчивания линий, окружностей, эллипсов, прямоугольников и т.д. Используемые линии могут быть сплошные, штриховые и т.д. Замкнутые области можно закрашивать сплошной заливкой, штриховкой и др. Большинство процедур модуля Graph используется для построения графических изображений. При этом в начале необходимо задать стиль (тип и толщину) линии контура с помощью процедуры
Определены следующие константы и их значения для выбора Типа_линии:
Имя константы
Значение
Характеристика
SolidLn
непрерывная
DottedLn
линия из точек
CenterLn
штрих–пунктирная
DashedLn
пунктирная
UserBitLn
определяемая пользователем
Образецдолжен быть равен 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)); {последней (замыкающей) должны совпадать}
Сведения о других примитивах можно найти в книгах по Турбо Паскалю или в справочной системе Турбо Паскаля.
Все фигуры, как отмечалось выше, рисуются текущим цветом и типом линии. Цвет линии задается из имеющегося активного набора цветов – палитры.
Пример. Написать программу построения графика заданной функции Y=f(X) для аргумента X, изменяющегося от xn до xk. Для определенности будем считать, что Y=sin(x), xn = –2π, xk = 2π.
Общие соображения по написанию программы для построения графиков приводились в п. 5.1.4. При построении графика должны быть определены масштабы – коэффициенты, с помощью которых натурные величины (X, Y) будут переводиться в графические координаты (xG, yG). В общем случае пределы изменения натурных величин: аргумента (xn, xk) и функции (Ymin, Ymax) должны быть отображены на выбранные пределы изменения графических координат:
xGn – x графическое начальное,
xGk – x графическое конечное,
yGn – y графическое начальное,
yGk –y графическое конечное.
С учетом сказанного, масштабы можно определить по формулам:
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}
Закраска замкнутой области выполняется процедурами:
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 окружностей одним цветом контура}