Материал к лекции "Модуль Graph"

Вид материалаЛекции

Содержание


InitGraph(driver,mode,' ')
Const SolidLn=0
Const EmptyFill=0
Const NormWidth=1
Const DefaultFont=0
Const HorizDir=0
Const LeftText=0
PROCEDURE tablfunc( var x,y:arr; var k:integer)
GetImage(x1,y1,x2,y2:word;var p:pointer)
PutImage(x,y:word; var p:pointer;:word
Var dr,mode,x,y:integer
Подобный материал:

Материал к лекции "Модуль Graph".

Интерфейсная часть модуля включает следующие ресурсы:

Процедуры и функции установки графических режимов:
  1. Инициализация графического режима:

    InitGraph(var driver:word; {драйвер}

    var Mode:word; {режим работы драйвера}

    Path:string); {путь к драйверу}

    Константы для драйверов:

    Const

    Detect=0; {автоматическое определение драйвера и режима}

    EGA=3;

    VGA=9;

    Константы для режимов работы:

    Const

    EGALo=0; {640*200, 16 цветов, 4 страницы}

    EGAHi=1; {640*350, 16 цветов, 2 страницы}

    Путь устанавливается либо ' ', если драйвер EGAVGA.BGI находится в текущей директории, либо конкретный для данной установки Паскаля, например: 'С:\BP\BGI'.

    Пример:

    Var driver,mode,error:word; .....

    Begin driver:=detect;

    InitGraph(driver,mode,' ');

    error:=GraphRezult; {проверка правильности подключения}

    if error<>0 then begin writeln('Ошибка графического режима',

    GraphErrorMSG(error));

    Halt(1); {аварийное завершение программы}

    end; ....
  2. Изменение режима работы графического адаптера:

    SetGraphMode(Mode:word);
  3. Завершение работы в графическом режиме:

    CloseGraph;

    Если завершить программу не выходя из графического режима, то нормальная работа DOS нарушается.
  4. Временный выход в текстовый режим:

    RestoreCrtMode;

    Пример:

    ... RestoreCrtMode; {выход в текстовый режим}

    ReadLn(....);

    SetGraphMode(GetGraphMode);... {возврат в графических режим}

Процедуры и функции управления цветом:

Константы цвета для EGA:

Const

EGABlack = 0;{черный}

EGABlue = 1; {синий}

EGAGreen= 2; {зеленый}

EGACyan = 3; {голубой}

EGARed = 4; {красный}

EGAMagenta=5; {фиолет.}

EGABrown=6; {коричневый}

EGALightGrey=7;{светло-серый}

EGADarkGrey = 56; {темно-серый}

EGALightBlue = 9; {ярко-синий}

EGALightGreen = 10; {ярко-зеленый}

EGALightCyan = 11; {ярко-голубой}

EGALightRed = 12; {розовый}

EGALightMagenta = 13; {сиреневый}

EGAYellow = 14; {желтый}

EGAWhite = 15; {белый}

Кроме этого, определен специальный тип для палитры:

Type PaletteType = record

size:byte; {размер палитры}

Colors:array[0..MaxColors] of shortint; {цвета палитры}

end;
  1. Чтение размера и цветов текущей палитры: GetPalette(var Palette: PaletteType);
  2. Замена палитры: SetAllPalette(Palette: PaletteType);
  3. Замена одного цвета в палитре: SetPalette(ColorNum,Color:word);
  4. Установка цвета фона: SetBkColor(Color:word);
  5. Установка текущего цвета рисования: SetColor(Color:word);
  6. Возврат стандартной палитры: GetDefaultPalette(var Palette: PaletteType);

Процедуры и функции управления типом, толщиной линии и видом штриховки:

Константы стиля линии:

Const SolidLn=0; {сплошная}

DottedLn=1; {точечная}

CenterLn=2; {штрих-пунктирная}

DashedLn=3; {пунктирная}

UserBitLn=4; {определенная пользователем}

Константы образца штриховки:

Const EmptyFill=0;{без штриховки}

SolidFill=1; {сплошная заливка}

LineFill=2; {----}

LtSlashFill=3; {////}

SlashFill=4; {//// толстые}

BkSlashFill=5; {\\\\ толстые}

LtBkSlashFill=6; {\\\\}

HatchFill=7; {++++}

XHatchFill=8; {хххх}

InterLeaveFill=9; {+ + +}

WideDotFill=10; {. . . . }

CloseDotFill=11; {.....}

UserFill=12; {стиль, определенный пользователем}

Константы толщины линии:

Const NormWidth=1; {нормальная}

ThickWidth=3; {утроенная}
  1. Установка стиля, образца и толщины линии:

    SetLineStyle(<стиль>,<образец>,<толщина>:word);

    Образец линии - 16 бит, единицы и нули кодируют точки и пропуски, например:

    1010.1010.1010.1010 - соответствует шестнадцатеричному числу $AAAA.
  2. Установка образца и цвета штриховки: SetFillStyle(<образец>,<цвет>:word);
  3. Установка пользовательского образца штриховки:

    SetFillPatern(<образец>:FillPaternType;<цвет>:word);

    Тип для образца штриховки:

    Type FillPatternType = array[1..8] of byte;

    Например:Const P1:FillPaternType=($AA,$55,$AA,$55,$AA,$55,$AA,$55); - определяет 8 строк по 8 точек, задающих частые ромбы.
  4. Закраска области, внутри которой находится точка с координатами х,y:

    FloodFill(x,y,<цвет контура>: word);

Процедуры и функции рисования:
  1. Рисование точки: PutPixel(x,y,<цвет>:word);
  2. Определение цвета точки с указанными координатами: GetPixel(x,y):word;
  3. Задание положения "текущей точки": MoveTo(x,y:word);
  4. Смещение координат "текущей точки": MoveRel(dx,dy:word);
  5. Определение координат "текущей точки": GetX:word; {х} GetY:word; {y}
  6. Определение максимальных значений: GetMaxX:word; GetMaxY:word
  7. Рисование линии по двум точкам: Line(x1,y1,x2,y2:word);
  8. Рисование линии из "текущей точки": LineTo(x,y:word);
  9. Рисование линии из "текущей точки" с приращением: LineRel(dx,dy:word);
  10. Рисование прямоугольника: Rectangle(x1,y1,x2,y2:word);
  11. Рисование заштрихованного прямоугольника: Bar(x1,y1,x2,y2:word);
  12. Рисование параллелепипеда:

    Bar3D(x1,y1,x2,y2,<глубина>:word; <верхняя грань>:boolean);

    Обычная глубина - 25% ширины.
  13. Рисование ломаной линии:

    DrawPoly(<количество точек>:word; PolyPoint:<массив элементов PointType>);

    Тип для определения точек:

    Type PointType=record(x,y:word); end;
  14. Рисование закрашенного многоугольника:

    FillPoly(<число вершин>:word; PolyPoint:<массив элементов PointType>);
  15. Рисование окружности: Circul(x,y,<радиус>:word);
  16. Рисование дуги: Arc(x,y,<нач.угол>,<кон.угол>,<радиус>:word);

    Направление рисования - против часовой стрелки от положительной части оси абсцисс.
  17. Получение координат концов дуги: GetArcCoord(Var ArcCoo:ArcCoordType);

    Тип для определения координат концов дуги:

    Type ArcCoordType= record x,y,xstart,ystart,xend,yend:word end;
  18. Рисование сектора или заштрихованной окружности:

    Pieslice(x,y, <нач.угол>,<кон.угол>,<радиус>:word);
  19. Рисование эллипса или его дуги:

    Ellipse(x,y, <нач.угол>,<кон.угол>,<радиус x>,<радиус y>:word);
  20. Рисование заштрихованного эллипса:

    FillEllipse(x,y, <радиус x>,<радиус y>:word);
  21. Рисование заштрихованного сектора эллипса:

    Sector(x,y, <нач.угол>,<кон.угол>,<радиус x>,<радиус y>:word);
  22. Определение отношения расстояния между точками по горизонтали и вертикали (для VGA = 1!): GetAspectRatio(Var xasp,yasp:word);
  23. Установка отношения расстояния между точками по горизонтали и вертикали для рисования: SetAspectRatio(xasp,yasp:word);

Процедуры и функции управления текстом:

Константы шрифтов:

Const DefaultFont=0;{обычный}

TriplexFont=1; {триплехный}

SmallFont=2; {мелкий}

SanSerifFont=3; {прямой}

GothicFont=4; {готический}


Константы направления:

Const HorizDir=0;{горизонтальное направление} VertDir=1; {вертикальное направление}

Константы выравнивания при вертикальном и горизонтальном направлениях:

Const LeftText=0; {указатель слева от текста}

CenterText=1; {указатель по центру текста}

RightText=2; {указатель справа от текста}

BottomText=0; {указатель ниже текста}

CenterText=1; {указатель по центру текста}

TopText=2; {указатель выше текста}
  1. Установка текущего шрифта, его стиля и размера:

    SetTextStyle(<шрифт>,<направление>,<размер>:word);
  2. Установка типа выравнивания при горизонтальном и вертикальном направлениях:

    SetTextJustify(<горизонт.>,<вертик.>:word);
  3. Установка ширины и высоты символов: SetUserCharSize(Mx,Dx,My,Dy:word);

    Параметры определяют коэффициенты по высоте и ширине:

    h=hf*My/Dy; l=lf*Mx/Dx, где hf и lf - ширина и высота символов шрифта.
  4. Определение текущей высоты строки в пикселях: TextHeight(<строка>:string);
  5. Определение текущей ширины строки в пикселях: TextWidth(<строка>:string);
  6. Вывод строки с текущей точки: OutText (<строка>:string);
  7. Вывод строки с заданной точки: OutTextXY(x,y:word;<строка>:string);

Процедуры управления окнами, страницами:
  1. Очистка экрана: ClearDevice;
  2. Установка окна: SetViewPort(x1,y1,x2,y2:word;<отсечение>:boolean);
  3. Определение координат установленного окна:

    GetViewSettings(Var win:ViewPortType);

    Type ViewPortType= record x1,y1,x2,y2:word; Clip:boolean; end;
  4. Очистка окна: ClearViewPort;
  5. Установка видимости страницы: SetVisualPage(<номер страницы>:word);
  6. Установка активной страницы: SetActivePage(<номер страницы>:word);

Пример 1. Программа построения графика функции.

PROGRAM grafik;

uses GRAPH; {подключение модуля графики}

CONST n=5;m=2; {количество позиций на число и мантиссу при выводе}

TYPE arr = array[1..100 ] of real; ari = array [1..100] of integer;

VAR

xmin,xmax,ymin,ymax:real; {экстремальные значения X,Y }

dx,dy:real; {шаг сетки по X и Y на графике}

mx,my:real; {масштабные коэффициенты}

kxn,kxk,kyn,kyk:integer; {границы вывода на экране }

dkx,dky:integer; {шаг сетки по X и Y на экране}

nx,ny:integer; {количество линий сетки по X,Y}

gd,gm:integer; {тип и режим графич. адаптера}

kpr,i: integer; {количество точек просчета}

x,y:arr; {массивы для значений функции и аргуменнта}

kx,ky:ari; {массивы для координит по X,Y}

st:string; {выводимое значение функции или аргумента}


PROCEDURE tablfunc( var x,y:arr; var k:integer); {подсчет функции}

var h,xn,xk: real; i: integer;

begin

writeln('табулирование функции y=cos(x+2)/x');

write('введите значение начала и конца отрезка,на котором считаем функцию:');

readln(xn,xk);

write('введите количество точек для рассчета(<=100): ');

readln(k); writeln;

h:=(xk-xn)/(k-1);

for i:=1 to k do

begin x[i]:=xn+(i-1)*h; y[i]:=cos(x[i]+2)/x[i]; end;

end;


PROCEDURE minmax( k:integer; var y:arr; var yn,yk:real); {поиск экстремумов}

var i:integer;

begin

yn:=y[1]; yk:=y[1];

i:=0;

for i:=1 to k do

begin

if y[i] < yn then yn:=y[i];

if y[i] > yk then yk:=y[i];

end;

end;


PROCEDURE coord (k:integer; yn,yk:real; var x,y:arr; var kx,ky:ari; var kxn,kxk,kyn,kyk:integer); {подсчет координат }

var mx,my: real; i:integer;

begin

writeln('введите координаты диагонали прямоугольника');

writeln(' в котором будем строить функцию: (xn>=60,xk<=600,yn>=15,yk<=320) ');

readln(kxn,kxk,kyn,kyk);writeln;

mx:=(kxk-kxn)/abs(x[k]-x[1]);

my:=(kyk-kyn)/abs(yk-yn);

for i:=1 to k do

begin

kx[i]:=round((x[i]-x[1])*mx)+kxn;

ky[i]:=round((yk-y[i])*my)+kyn;

end;

end;


BEGIN

tablfunc(x,y,kpr); {табулирование функции}

minmax(kpr,y,ymin,ymax); {поиск миним.,максим.}

coord(kpr,ymin,ymax,x,y,kx,ky,kxn,kxk,kyn,kyk); {подсчет координат}

write(' введите количество линий сетки по оси x и по оси y (<=10): ' );

readln(nx,ny); writeln;

gd:=detect;

initgraph(gd,gm,'');

setcolor(11); setbkcolor(7); {голубой на сером}

rectangle(kxn,kyn,kxk,kyk); {прямоугольн.для вывода графика}

setcolor(4); {красный}

for i:=1 to kpr-1 do line (kx[i],ky[i],kx[i+1],ky[i+1]); {график}

dkx:=round((kxk-kxn)/nx); dky:=round((kyk-kyn)/ny); {расчет координат шага сетки}

setcolor(11); {светло-серый}

for i:=1 to nx do line(kxn+dkx*i,kyn,kxn+dkx*i,kyk); {сетка, параллельно оси Y}

for i:=1 to ny do line(kxn,kyk-dky*i,kxk,kyk-dky*i); {сетка, параллельно оси X}

setcolor(9); {ярко-синий}

dx:=(x[kpr]-x[1])/nx; dy:=(ymax-ymin)/ny; {расчет значений шага сетки}

for i:=1 to nx+1 do {вывод значений аргумента}

begin

str((x[i]+dx*(i-1)):n:m,st); {преобразование числа в строку}

outtextxy(kxn+dkx*(i-1)-(n-m)*8+4,kyk+15,st); {вывод под линией сетки}

end;

for i:=1 to ny+1 do {вывод значений функции }

begin

str((ymin+dy*(i-1)):n:m,st);

outtextxy(kxn-(n*8+6),kyk-dky*(i-1)-4,st); {вывод слева от оси Y}

end;

readln;

closegraph;

end.

Пример 2. Программа построения круговой диаграммы с надписями.

program difgramma;

uses graph;

const n=12; {максимальное количество значений функции}

r=150; {радиус диаграммы}

ns=5; {общее кол-во позиций в записи числа при выводе}

ms=2; {количество позиций в дробной части числа}

rasx=10; {расст. по оси абсцисс между надп.и диагр.}

rasy1=15; {расстояние по оси ординат между началом надписи и диаграммой}

kt=8; {высота литеры в пикселах}

col1=10; {цвет вывода диаграммы}

fon=8; {цвет фона}

type m=array[1..n+1] of integer;

m1=array[1..n] of real;

var f:m1; {массив значений функции}

alfa:m; {массив значений углов диаграммы}

driver,err, {переменные для типа и режима работы адаптера}

k, {фактическое количество значений функции}

i,j, {параметры циклов}

bet, {величина угла, образованного радиусом и биссектрисой сектора диаграммы}

y,x, {координаты точки, являющейся центром дуги сектора}

x1,y1, {координаты начальной точки вывода надписи}

xn,yn: integer; {координаты центра диаграммы}

st:string; {строка для хранения выводимой надписи}

s:real; {сумма значений функции}

xa,ya:word; {коэфф. учета разрешающих способностей}

begin {ввод исходных данных}

writeln('Введите количествово значений функции(от 1 до',n:3,')'); readln(k);

s:=0;

for i:=1 to k do

begin

writeln('Введите',i:3,'-ое значение функции'); readln(f[i]);

while f[i]<0 do

begin

writeln('Недопустимое значение, повторите ввод');

writeln('Введите',i:3,'-ое значение функции'); readln(f[i]);

end;

s:=s+f[i];

end;

if s=0 then begin writeln('Все значения нулевые'); readln; Halt(1); {выход по ошибке} end;

driver:=detect; InitGraph(driver,err,'e:\dosapp\tp5');

SetBkColor(fon); SetColor(col1);

xn:=GetMaxX div 2; yn:=GetMaxY div 2; {вычисление координат центра диаграммы}

alfa[1]:=0; alfa[k+1]:=360;

for i:= 2 to k+1 do {строим диаграмму}

begin

alfa[i]:=alfa[i-1]+round(f[i-1]/s*360);

SetFillStyle(i mod 10,i);

Pieslice(xn,yn,alfa[i-1],alfa[i],r);

bet:=(alfa[i-1]+alfa[i]) div 2; {вычисление начальных координат вывода надписей}

x:=xn+round(r*cos(bet*pi/180));

y:=yn-round(r*sin(bet*pi/180));

if ((bet>=0)and(bet<=90))or((bet>=270)and(bet<=360)) then x1:=x+rasx else x1:=x-kt*ns-rasx;

if ((bet>=0)and(bet<=180)) then y1:=y-rasy1 else y1:=y+(rasy1-kt);

str(f[i-1]:ns:ms,st); {преобраз. к строковому}

OutTextXY(x1,y1,st); {представлению и вывод надп.}

end;

readln; CloseGraph;

end.

Процедуры и функции создания движущихся изображений.
  1. Определение размера области памяти, необходимой для сохранения прямоугольного фрагмента изображения заданного размера: ImageSize(x1,y1,x2,y2:word):word;
  2. Сохранение прямоугольного фрагмента изображения в памяти:

    GetImage(x1,y1,x2,y2:word;var p:pointer);

    (p - указатель, содержащий адрес области памяти размером ImageSize, отведенной для сохранения изображения.)
  3. Вывод сохраненного изображения на экран в окно с левым верхним углом (x,y):

PutImage(x,y:word; var p:pointer;<способ наложения>:word;

Константы видов наложения:

Const NormalPut=0;{наложение со стиранием}

XorPut=1; {побитное "исключающее или"}

OrPut=2; {побитное "или"}

AndPut=3; {побитное "и"}

NotPut=4; {побитное "не"}

Пример. Программа движения белого круга по экрану со стиранием прежнего изображения краем образа (запоминаем по 3 позиции с каждой стороны лишние, они окрашены цветом фона).

Program ex;

Uses Graph,Crt;

Var dr,mode,x,y:integer;

p:pointer; {указатель на некоторую область памяти}

Begin dr:=detect; {автоматическое определение драйвера и режима}

InitGraph(dr,mode,'');

GetMem(p,ImageSize(0,0,99,99)); {выделение памяти под сохранение изображения}

x:=0; y:=0;

Pieslice(50,50,0,360,47); {рисование закрашенного круга}

GetImage(0,0,99,99,p);{сохранение изображения в памяти}

repeat

PutImage(x,y,p,0); {вывод изображения из памяти (стирание краем образа!)}

delay(10); {задержка}

x:=x+3;

y:=y+1;

until x>getmaxx-50; {выход по достижении конца экрана}

CloseGraph;

End.