Материал к лекции "Модуль Graph"
Вид материала | Лекции |
- Программа первого модуля: Множества и отображения, 29.86kb.
- Работа с графикой в Turbo Pascal, 79.29kb.
- Лабораторная работа №2 Создание и редактирование диаграмм в документах word, 83.26kb.
- Необходимо прочитать этот материал к лекции 27. 09. 2006, 70.32kb.
- Изучив материал лекций и Главы 5 (В. В. Ощепкова. Язык и культура), составьте перечень, 40.12kb.
- Модуль 3 Специальная сессия: домашнее насилие, 161.47kb.
- Методические рекомендации студентам, 215.81kb.
- Лекции Вам несомненно пригодятся в дальнейшем обучении и в реальной работе по созданию, 189.38kb.
- Экзаменационные вопросы, 19.67kb.
- В. Э. Гордин расписание занятий 3 модуль (21 января 23 февраля), 40.75kb.
Материал к лекции "Модуль Graph".
Интерфейсная часть модуля включает следующие ресурсы:
Процедуры и функции установки графических режимов:
- Инициализация графического режима:
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; ....
- Изменение режима работы графического адаптера:
SetGraphMode(Mode:word);
- Завершение работы в графическом режиме:
CloseGraph;
Если завершить программу не выходя из графического режима, то нормальная работа DOS нарушается.
- Временный выход в текстовый режим:
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;
- Чтение размера и цветов текущей палитры: GetPalette(var Palette: PaletteType);
- Замена палитры: SetAllPalette(Palette: PaletteType);
- Замена одного цвета в палитре: SetPalette(ColorNum,Color:word);
- Установка цвета фона: SetBkColor(Color:word);
- Установка текущего цвета рисования: SetColor(Color:word);
- Возврат стандартной палитры: 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; {утроенная}
- Установка стиля, образца и толщины линии:
SetLineStyle(<стиль>,<образец>,<толщина>:word);
Образец линии - 16 бит, единицы и нули кодируют точки и пропуски, например:
1010.1010.1010.1010 - соответствует шестнадцатеричному числу $AAAA.
- Установка образца и цвета штриховки: SetFillStyle(<образец>,<цвет>:word);
- Установка пользовательского образца штриховки:
SetFillPatern(<образец>:FillPaternType;<цвет>:word);
Тип для образца штриховки:
Type FillPatternType = array[1..8] of byte;
Например:Const P1:FillPaternType=($AA,$55,$AA,$55,$AA,$55,$AA,$55); - определяет 8 строк по 8 точек, задающих частые ромбы.
- Закраска области, внутри которой находится точка с координатами х,y:
FloodFill(x,y,<цвет контура>: word);
Процедуры и функции рисования:
- Рисование точки: PutPixel(x,y,<цвет>:word);
- Определение цвета точки с указанными координатами: GetPixel(x,y):word;
- Задание положения "текущей точки": MoveTo(x,y:word);
- Смещение координат "текущей точки": MoveRel(dx,dy:word);
- Определение координат "текущей точки": GetX:word; {х} GetY:word; {y}
- Определение максимальных значений: GetMaxX:word; GetMaxY:word
- Рисование линии по двум точкам: Line(x1,y1,x2,y2:word);
- Рисование линии из "текущей точки": LineTo(x,y:word);
- Рисование линии из "текущей точки" с приращением: LineRel(dx,dy:word);
- Рисование прямоугольника: Rectangle(x1,y1,x2,y2:word);
- Рисование заштрихованного прямоугольника: Bar(x1,y1,x2,y2:word);
- Рисование параллелепипеда:
Bar3D(x1,y1,x2,y2,<глубина>:word; <верхняя грань>:boolean);
Обычная глубина - 25% ширины.
- Рисование ломаной линии:
DrawPoly(<количество точек>:word; PolyPoint:<массив элементов PointType>);
Тип для определения точек:
Type PointType=record(x,y:word); end;
- Рисование закрашенного многоугольника:
FillPoly(<число вершин>:word; PolyPoint:<массив элементов PointType>);
- Рисование окружности: Circul(x,y,<радиус>:word);
- Рисование дуги: Arc(x,y,<нач.угол>,<кон.угол>,<радиус>:word);
Направление рисования - против часовой стрелки от положительной части оси абсцисс.
- Получение координат концов дуги: GetArcCoord(Var ArcCoo:ArcCoordType);
Тип для определения координат концов дуги:
Type ArcCoordType= record x,y,xstart,ystart,xend,yend:word end;
- Рисование сектора или заштрихованной окружности:
Pieslice(x,y, <нач.угол>,<кон.угол>,<радиус>:word);
- Рисование эллипса или его дуги:
Ellipse(x,y, <нач.угол>,<кон.угол>,<радиус x>,<радиус y>:word);
- Рисование заштрихованного эллипса:
FillEllipse(x,y, <радиус x>,<радиус y>:word);
- Рисование заштрихованного сектора эллипса:
Sector(x,y, <нач.угол>,<кон.угол>,<радиус x>,<радиус y>:word);
- Определение отношения расстояния между точками по горизонтали и вертикали (для VGA = 1!): GetAspectRatio(Var xasp,yasp:word);
- Установка отношения расстояния между точками по горизонтали и вертикали для рисования: 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; {указатель выше текста}
- Установка текущего шрифта, его стиля и размера:
SetTextStyle(<шрифт>,<направление>,<размер>:word);
- Установка типа выравнивания при горизонтальном и вертикальном направлениях:
SetTextJustify(<горизонт.>,<вертик.>:word);
- Установка ширины и высоты символов: SetUserCharSize(Mx,Dx,My,Dy:word);
Параметры определяют коэффициенты по высоте и ширине:
h=hf*My/Dy; l=lf*Mx/Dx, где hf и lf - ширина и высота символов шрифта.
- Определение текущей высоты строки в пикселях: TextHeight(<строка>:string);
- Определение текущей ширины строки в пикселях: TextWidth(<строка>:string);
- Вывод строки с текущей точки: OutText (<строка>:string);
- Вывод строки с заданной точки: OutTextXY(x,y:word;<строка>:string);
Процедуры управления окнами, страницами:
- Очистка экрана: ClearDevice;
- Установка окна: SetViewPort(x1,y1,x2,y2:word;<отсечение>:boolean);
- Определение координат установленного окна:
GetViewSettings(Var win:ViewPortType);
Type ViewPortType= record x1,y1,x2,y2:word; Clip:boolean; end;
- Очистка окна: ClearViewPort;
- Установка видимости страницы: SetVisualPage(<номер страницы>:word);
- Установка активной страницы: 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.
Процедуры и функции создания движущихся изображений.
- Определение размера области памяти, необходимой для сохранения прямоугольного фрагмента изображения заданного размера: ImageSize(x1,y1,x2,y2:word):word;
- Сохранение прямоугольного фрагмента изображения в памяти:
GetImage(x1,y1,x2,y2:word;var p:pointer);
(p - указатель, содержащий адрес области памяти размером ImageSize, отведенной для сохранения изображения.)
- Вывод сохраненного изображения на экран в окно с левым верхним углом (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.
0>