МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
кафедра АТ
Графічно-розрахункова робота № 1
З курсу
“Комп’ютерна графіка”
Варіант №10
1.Мета роботи:
Набути практичних навиків в складанні програм для побудови зображень на екрані комп’ютера за допомогою засобів мови Турбо-Паскаль.
2. Завдання:
Побудувати графік функції z=ex, заданої таблично. Графік повинен відображати результати розрахунків, яуі записані у файлі на диску. Масштаб розмітки осей координат графіка повинен відповідати реальним результатам розрахунків. Параметри для побудови графіка:
Тип лінії – штрих-пунктирна, товщина –3 пікселя, колір лінії – Cyan, шрифт розмітки осей графіка – Small.
3. Виведення необхідних формул для побудови графіка:
3.1 Перетворення реальних координат до машинних:
Для ього використовують такі вирази:
Xмаш=X0маш + Xреальн* kx;
Yмаш=Y0маш –Yреальн*ky, де Xмаш ,Yмаш – поточні машинні координати точки в пікселях, X0маш,Y0маш – відображення центру реальних координат на екрані в машинних координатах;
3.2 Коефіцієнти перетворення:
Коефіцієнти перетворення необхідні, щоб графік помістився на екрані, або розтягнувся на весь екран.
4.2. Загальна блок-схема алгоритму програми (2), що будує графік табульованої функції.
Початок
1
Ініціалізація
графічного режиму
2
Задання кольору фону
і кольору ліній та сим-
волів
3
Встановлення стилю
для побудови ліній
4
Визначення максима-
льних і мінімальних
значень змінних X,Z
5
Визначення коефіцієн-
тів масштабування та
координат точки цен-
тру координат
6
I=0
7.
Відкриття файлу data.dat
і зчитування з нього зна-
чення змінних x,z
4
3
7
8
Встановлення курсора в
точку з координатами
(x/kx+x0+i,y0-y/ky)
9
прочитано весь так
файл?
ні
10
Зчитування з файлу значе-
нь змінних x,y.Проведення
лінії до точки з координа-
тами (x/kx+x0+i,y0-y/ky)
11
ні
так
12. Закриття файлу data.dat
13.
Встановлення кольору
ліній та символів;встано-
влення стилю для побу-
дови ліній.
14
Побудова координат-
них осей
515
414
.
15.
3
14
16.
Завершення роботи в
графічному режимі
Кінець
4.3. Деталізована блок схема блоку № 15
Початок
1
Закриття графічниго
режиму
Кінець
4.4. Деталізована блок-схема блоку №1
Початок
1
Ініціалізація графіч-
ного режиму
так 2 Помилки ні
ініціалізації графіч-
ного режиму?
3
Помилка ініціалізації
графічного режиму
4
Вихід із програми
Кінець
4.5. Деталізована блок-схема блоку №4
Початок
1
Відкриття файлу data.dtp
зчитування з файлу зна-
чень змінних x,y
2
maxX=x; minx=x;
maxY=y; minY=y;
3
Прочитаний увесь
файл
4
Зчитування з файлу зна-
чень змінних x,y
5 6
maxX<x maxX:=x
7
8
minX:=x minX>x
9 10
maxY<y maxY:=y
11
12
minY:=y minY>y
Кінець
4.6. Деталізована блок-схема блоку №5
Початок
1
Lx:=maxX-minX
Ly:=maxY-minY
2
3
P1:=(640*minx)/Lx
Kx:=Lx/620 maxX>0,minX<0
4 5 P1:=15
maxX>=0,minX>=0 Kx:=maxX/620
6
7
P1:=590
Kx:=minx/620 maxX<=0,minX<=0
9 P2:=480-
maxY>0,minY<0 (480*minY)/Ly+5
Ky:=maxX/440
10
11
P2:=465
Ky:=maxY/440 maxY>=0,minY>=0
12 13 P2:=12
maxY<=0,minY<=0 Ky:=minY/440
14
X0:=P1; Y0:=P2;
Кінець
4.7. Деталізована блок-схема блоку №13
Початок
1
Будуємо лінію задаючи
координати її початкової
і кінцевої точки
(x0,0,x0,480);
2
Будуємо лінію задаючи
координати її початкової
і кінцевої точки
(0,y0,640,y0);
3
Будуємо лінію задаючи
координати її початкової
і кінцевої точки
(630,y0-5,640,y0);
4
Будуємо лінію задаючи
координати її початкової
і кінцевої точки
(630,y0+5,640,y0);
5
Будуємо лінію задаючи
координати її початкової
і кінцевої точки
(x0-5,10,x0,0);
6
Будуємо лінію задаючи
координати її початкової
і кінцевої точки
(x0+5,10,x0,0);
Кінець
4.8. Деталізована блок-хема блоку №14
Початок
1
Побудова засічок та їх
номерація на осі ОХ
справа від центру коор-
динат
2
Побудова засічок та їх
номерація на осі ОХ
зліва від центру коор-
динат
3
Побудова засічок та їх
номерація на осі ОY
під віссю ОХ
4
Побудова засічок та їх
номерація на осі ОY
над віссю ОХ
Кінець
4. Блок-схеми алгоритмів програми.
4.1. Блок-схема алгоритму програми (1), що табулює задану функцію.
Початок
Відкриття файлу data.dat
x:=a
x<=b
z:=x/3; запис у файл зна-
чень змінних x,y;
x:=x+h
Закриття файлу data.dat
Кінець
5. Остаточний текст програми:
5.1 Текст програми (1), що табулює задану функцію:
var
a,b:integer;
x,y,h,t:real;
f:file of real;
begin
a:=-500;
b:=500;
h:=3;
assign(f, 'd:\data.dat');
rewrite(f);
x:=a;
while x<=b do
begin
y:=abs(sqr(x)*x);
write(f,x);
write(f,y);
x:=x+h;
end;
close(f);
end.
5.2 Текст програми (2), котра будує графік протабульованої функції:
uses Graph,crt;
{******************************************}
Procedure IntGraphMode(Regim:integer);
var Driver,Error:integer;
begin
Driver:=Detect;
Initgraph(Driver,Regim,'d:\tp\bgi' );
Error:=GraphResult;
if error <>grOk then
begin
writeln(GraphErrorMsg(error));
halt(1);
end;
end;
{********************************************}
Procedure CloseGraphMode;
begin
CloseGraph;
end;
{*********************************************}
procedure osi(x0,y0:integer);
begin
line (x0,0,x0,480);
line (0,y0,640,y0);
line (630,y0-5,640,y0);
line (630,y0+5,640,y0);
line (x0-5,10,x0,0);
line (x0+5,10,x0,0);
end;
{*******************************}
procedure rosmitka (X0,Y0:integer;Kx,Ky:real);
Var
i,V:integer;
st:string;
begin
{ SetUserCharSize(1, 3, 1, 3);}
for i:=1 to 20 do
BEGIN
line(X0+64*i,Y0-3,X0+64*i,Y0+3);
STR((64*i*Kx):0:2,st);
outtextxy(x0+64*i, y0+5,st);
line(X0-64*i,Y0-3,X0-64*i,Y0+3);
STR(-(64*i*Kx):0:2,st);
outtextxy(x0-64*i, y0+5,st);
line(X0+3,Y0+24*i,X0-3,Y0+24*i);
STR(-(24*i*Ky):0:2,st);
outtextxy(x0+5, y0+24*i,st);
line(X0+3,Y0-24*i,X0-3,Y0-24*i);
STR((24*i*Ky):0:2,st);
outtextxy(x0+5, y0-24*i,st);
outtextXY(x0+5,Y0+2,'0');
end;
end;
{*************************************************************}
procedure MaxMinEl (var X0,Y0:integer;var Kx,Ky);
var f :file of real;
x,y:real;
maxX, maxY,minY ,minX:real ;
P1,p2:integer;
begin
assign (f, 'D:\data.dtp');
reset(f);
read(f,x);
read (f,y);
maxX:=x;
maxY:=y;
minY:=y;
minX:=x;
while not (eof(f)) do
begin
read (f,x);
read (f,y);
if maxX<x then maxX:=x;
if minX>x then minX:=x;
if maxY<y then maxy:=y;
if minY>y then minY:=y;
end;
end;
{************************************************************************}
procedure rosraxynok (var X0,Y0:integer;var Kx,Ky:real);
var f :file of real;
x,y:real;
maxX, maxY,minY ,minX,Lx,Ly:real ;
P1,p2:integer;
begin
Lx:=maxX-minX;
Ly:=maxy-minY;
if ((maxX>0) and (minX<0)) then
begin
P1:=round(abs((640*minX))/Lx);
Kx:= LX/620;
end;
if ((maxX>=0) and (minX>=0)) then
begin
P1:=15;
Kx:= maxX/620;
end;
if ((maxX<=0) and (minX<=0)) then
begin
P1:=590;
Kx:=ABS(minX)/620;
end;
if ((maxY>0) and (minY<0)) then
begin
P2:=480-round(abs((480*minY)/LY))+5;
Ky:=LY/440;
end;
if ((maxY>=0) and (minY>=0)) then
begin
P2:=480-15;
Ky:=maxY/440;
end;
if ((maxY<=0) and (minY<=0)) then
begin
P2:=12;
Ky:=abs(minY)/440;
end;
X0:=P1;
Y0:=P2;
end;
{*******************************************************************}
var tmp1:integer;
X0,Y0:integer;
Kx,Ky:real;
maxX, maxY,minY ,minX,Lx,Ly:real ;
I,k:integer ;
f:file of real;
x,y:real;
begin
IntGraphMode(VGAMed);
setcolor(3);
setlinestyle(1,3,3);
assign (f, 'D:\data.dat');
MaxMinEl (X0,Y0,Kx,Ky);
rosraxynok ( X0,Y0, Kx,Ky);
begin
for i:=0 to 1 do
begin
reset(f);
read(f,x);
read(f,y);
{**********************************}
tmp1:=3;
if (kx=0) then kx:=1;
if ky=0 then ky:=1;
if ky=0 then tmp1:=1;
{ moveto(round(x)}
moveto( round(x/Kx)+X0-tmp1+i, -round(y/Ky)-tmp1+Y0);
while not eof(f) do
Begin
read(f,x);
read(f,y);
lineto (round(x/Kx)+X0-tmp1+i,-round(y/Ky)-tmp1+Y0);
End;
close(f);
end;
end;
setcolor(2);т
setlinestyle(0,0,0);
osi(x0,y0 );
rosmitka(X0,Y0,Kx,Ky);
readln;
CloseGraph;
end.