МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
ДЕРЖАВНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра АТ
ІКТАМ
Графічно-розрахункова робота
з комп’ютерної графіки
“Побудова зображень на екрані комп’ютера”
Виконав:
cт.. гр.КС-2
Прийняв:
Львів 2005 р.
1. ЗАВДАННЯ
Розробити блок-схему алгоритму та програму мовою Turbo Pascal для побудови довільних графіків функцій. Програма складається з двох частин:
1) здійснює табуляцію функції і записує результати у двійковий файл;
2) зчитує дані з файлу і будує графік з автоматичним масштабуванням осей координат та їх оцифровкою.
Шрифт розмітки осей графіка – Triplex. Колір ліній – Blue. Колір фону – black чи white.
2. ТЕОРЕТИЧНА ЧАСТИНА
2.1. Табулювання функції та збереження результатів в двійковий файл.
Функція, що за умовою задачі вибирають довільним чином, буде неодноразово використовуватися в програмі, тому слід написати підпрограму-функцію, після чого щоразу викликати цю функцію. Функція описується таким чином:
function <назва>(<список формальних параметрів>) : <тип функції>;
<розділи описів і оголошень функції>;
begin
<розділ команд функції, де має бути така команда: ‘назва:=вираз’>
end;
Після цього виклик функції здійснюється лише з виразів так:
<назва> (<список фактичних параметрів>)
Наступна дія в програмі – введення інтервалу табуляції функції та кроку табуляції. Для цього використаємо стандартні команди writeln та read. Для виконання табуляції використаємо цикл з передумовою:
while <логічний вираз> do <команда 1>;
При цьому щоразу відбувється збільшення значення X на крок h.
Додаткова проблема – запис результатів табулювання в двійковий файл. Для розв’язання цієї проблеми використаємо запис (record) – структурований тип даних, призначений для зберігання в оперативній пам’яті та опрацювання певних даних. Запис описують у розділі type так:
type <назва типу запису>=record
<назва поля 1> : <тип поля 1>;
...
<назва поля n> : <тип поля n>;
end;
Після цього доступ до конкретного поля запису дає складне ім’я вигляду:
<назва запису>.<назва поля>
Для роботи із файлом у розділі описів типів описують файловий тип:
type <ім’я типу>=file of <базовий тип>;
Це також можна зробити безпосередньо у розділі оголошення змінних. Далі в програмі будуть використані такі команди:
assign(<ім’я файлу>,<зовнішнє ім’я>); - налогоджує зв’язок між іменем файлу і файлом на зовнішньому носії;
rewrite(<ім’я файлу>); - відкриває файл для записування в нього даних;
write(<ім’я файлу>,<ім’я змінної>); - записує (виводить) дане у файл;
close(<ім’я файлу>); - закриває файл.
Запис даних у файл здійснюється в тому ж циклі, що й табулювання функції.
2.2. Вибір місця побудови координатних осей та розрахунок коефіцієнта масштабування.
Наступною частиною програми є розрахунок координат для побудови осей абсцис і ординат та розрахунок коефіцієнта масштабування. Визначимо спочатку коефіцієнт масштабування. Для цього знайдемо діапазони отриманих значень для X та Y (віднімемо мінімальне значення від максимального). Щоб знайти діапазон значень X, віднімемо початкове значення інтервалу від кінцевого. Щоб знайти діапазон значень Y, потрібно знайти мінімальне та максимальне значення функції, яких вона набуває на заданому інтервалі значень аргумента X. Пошук цих значень буде відбуватися в тому ж циклі, де табулюється функція.
Після цього порівняємо, де діапазон значень більший: по осі абсцис, чи по осі ординат. В залежності від результату порівняння, продовження виконання програми буде відбуватися по певній гілці розгалуження. І, відповідно до цього, коефіцієнт масштабування буде розраховуватися за певною формулою.
Додатковою проблемою є вибір положення осі ординат (Y). Для цього використовуються додаткові розгалуження, які перевіряють положення початкового та кінцевого значень інтервалу на осі абсцис (X). В залежності від їх розміщення відносно нуля будується вісь Y, координата якої в кожному випадку обчислюється за певною формулою, що вибирається в залежності від вибраної гілки розгалуження.
Крім того треба розрахувати крок hg (щоразовий зсув по осі абсцис при збільшенні значення X на крок h). Для цього використаємо формулу:
hg:=trunc(h*M);
тобто hg = ціла частина від множення h на M, де M – коефіцієнт масштабування, що був знайдений раніше.
2.3. Графічна частина роботи.
Для роботи в графічному режимі підключаємо модуль Graph.tpu , що включає в себе стандартні графічні процедури та функції. Далі задається графічний режим:
<розділи описів та оголошень конкретної програми>;
var driver, mode : integer; {Для характеристик дисплея}
Begin
driver:=detect; {detect – стандартна стала}
initgraph (driver, mode, ' '); {Задання графічного режиму}
<текст конкретної програми з графічними командами>
end.
Коли графічний режим задано, можна визначитися з кольорами майбутнього зображення. Використаємо такі процедури:
setbkcolor (<колір>) – задає колір фону;
setcolor (<колір>) – задає колір майбутнього зображення.
Далі йде побудова осей координат, а потім йде побудова самого графіка.
Для цього значенням X та Y надаємо їх початкові значення, далі здійснюємо перехід від математичних координат до графічних. Курсор встановлюємо на першій точці графіка. Після цього починаємо використовувати двійковий файл: відкриваємо, а потім в циклі – щоразу зчитуємо значення та будуємо лінії до відповідної точки. Для цього використовуємо такі процедури:
read(<ім’я файлу>,<ім’я змінної>); - читає (вводить) дане з файлу в оперативну пам’ять;
reset(<ім’я файлу>); - відкриває файл для читання з нього даних.
Коли всі значення зчитані – файл закривається.
Далі здійснюємо оцифровку осі координат, використовуючи стандартні процедури:
outtextxy (x, y, <текст>) – виводить текст у заданому місці;
settextstyle (<шрифт>, <напрям>, <розмір>) – задає вигляд символів, напрямок виведення: 0 – горизонтально чи 1 – вертикально, і розміри символів: 1, 2, 3.
Кожного разу замість координати x ставляться значення, що були обчислені в циклі: (xmin-10) – для позначення мінімума (початку інтервала), (x0+3) – для позначення нуля, (xmax-10) – для позначення максимума (кінця інтервала). Після цього програма завершує свою роботу.
3. БЛОК-СХЕМА АЛГОРИТМУ
3.1. Головна блок-схема.
1.
табуляція ф-ції і запис результатів у двійковий файл
Рис. 3.1. Головна блок-схема.
12.
11.
10.
9.
8.
7.
6.
5.
4.
3.
2.
кінець
побудова осей та графіка
вибір варіанту побудови осей
закриваємо файл
n:=k1.onz; ymin:=k1.yminz; ymax:=k1.ymaxz;
зчитуємо дані
відкриваємо файл для читання
налогоджуємо зв’язок з темповим файлом
вводимо a,b,h
оголош. змінні і константи
початок
3.2. Блок-схема табулювання функції та запису результатів в двійковий файл.
збільшення на крок
присвоєння значення
присвоєння значення
так
ні
ymin:=y;
y<ymin
так
ні
ymax:=y;
запис даних у файл
присвоєння значень
виведення значень
обчислення функції
умова виконання циклу
присвоєння значень
оголошення змінних
y>ymax
y:=f(x);
a,b,h,x,y,n,ymin,ymax,k1,file1
x:=x+h; n:=n+1;
file1, k1
x, y
k1.ox:=x; k1.oy:=y;
ні
x<=b
x:=a; n:=0; ymin:=f(x); ymax:=f(x)
початок
1.
Рис. 3.2. Табулювання ф-ції та запис результатів у файл.
5
16
15.
14.
11.
12.
13.
10.
9.
8.
7.
6.
5.
4.
3.
2.
вiдкриваємо файл для запису
налогоджуємо зв’язок з файлом
4
6
16.
Рис. 3.2. Табулювання ф-ції та запис результатів у файл (продовження).
21.
20.
19.
18.
17.
file1, k1
кінець
закриваємо головний файл
закриваємо темповий файл
вiдкриваємо темповий файл для запису
налогоджуємо зв’язок з темповим файлом
3.3. Блок-схема знаходження положення осі Х та коефіцієнта масштабування.
1.
оголошення змінних
оголошення змінних
умова виконання циклу
7
28
7
16
xmax:= ціла частина від ( 100+M*(b-a) );
xmin:=100;
так
ні
x0:= ціла частина від ( 100+M*(-a) );
(a<0) and (b=0)
xmax:= ціла частина від ( 100+M*(b-a) );
xmin:=100;
кінець
так
ні
x0:= ціла частина від ( 100+M*(-a) );
(a<0) and (b<0)
так
ні
повідомлення про помилку, вихід з програми
a>=b
M:=400/(ymax-ymin);
так
ні
(ymax-ymin) > (b-a)
x0, hg, xmin, xmax
a, b, h, M, ymin, ymax
початок
2.
3.
Рис. 3.3. Блок-схема знаходження положення осі Х та коефіцієнта масштабування.
52.
7.
15.
14.
13.
12.
11.
10.
9.
8.
6.
5.
4.
9
51
8
29
так
ні
(ymax-ymin) <= (b-a)
xmax:=500;
xmin:= ціла частина від ( 500-M*(b-a) );
так
ні
x0:= ціла частина від ( 500-M*b );
(a>0) and (b>0)
xmax:= ціла частина від ( 100+M*b );
xmin:=100;
так
ні
x0:=100;
(a=0) and (b>0)
xmax:= ціла частина від ( 100+M*(b-a) );
xmin:=100;
так
ні
x0:= ціла частина від ( 100+M*(-a) );
(a<0) and (b>0)
5
4
5
15
Рис. 3.3. Блок-схема знаходження положення осі Х та коефіцієнта масштабування (продовження).
28.
27.
26.
25.
24.
23.
22.
21.
20.
19.
18.
17.
16.
9
43
xmin:=100; xmax:=500;
x0:= ціла частина від ( 100+M*(-a) );
так
ні
M:=400/(b-a);
(a<0) and (b>0)
xmin:=100; xmax:=500;
x0:=500;
так
ні
M:=400/(b-a);
(a<0) and (b=0)
xmin:=100; xmax:= ціла частина від ( 100+M*(b-a) );
x0:= ціла частина від ( 100+M*(-a) );
кінець
так
ні
M:=400/(-a);
(a<0) and (b<0)
так
ні
повідомлення про помилку, вихід з програми
a>=b
7
28
29.
Рис. 3.3. Блок-схема знаходження положення осі Х та коефіцієнта масштабування (продовження).
52.
42.
41.
40.
39.
38.
37.
36.
35.
34.
33.
32.
31.
30.
43.
52.
51.
50.
49.
48.
47.
46.
45.
44.
Рис. 3.3. Блок-схема знаходження положення осі Х та коефіцієнта масштабування (продовження).
кінець
hg:= ціла частина від (h*M);
xmin:= ціла частина від ( 500-M*(b-a) ); xmax:=500;
x0:= ціла частина від ( 500-M*b );
так
ні
M:=400/b;
(a>0) and (b>0)
xmin:=100; xmax:=500;
x0:=100;
так
ні
M:=400/(b-a);
(a=0) and (b>0)
7
28
8
42
3.4. Блок-схема графічної частини роботи.
розрахунок ординати наступної точки
читання з файлу
параметри виконання циклу
розрахунок графічн. координат
присвоєння значення
оголошення змінних
оголошення змінних
оголошення константи
11
20
11
19
11
18
y:=k1.oy; y1:=y0- ціла частина від (M*y);
file1, k1
____
i=1,n
n=n+1
y:=f(x); y1:=y0- ціла частина від (M*y);
x:=a; x1:=x0+ ціла частина від (M*x);
driver:=detect;
mode, y1, x1, M, i, n, file1
driver, x0, xmin, xmax, x, y
y0
початок
1.
Рис. 3.4. Блок-схема графічної частини роботи.
17.
16.
15.
14.
13.
12.
11.
10.
9.
8.
7.
6.
5.
4.
3.
2.
відкриваємо файл для зчитування даних
переміщуємо курсор у вказане місце
налогоджуємо зв’язок з файлом
будуємо засічки на осі X
будуємо координатні осі
задаємо кольори і стиль
задаємо графічний режим
10
15
10
17
10
15
розрахунок абсциси наступної точки
кінець
18.
x:=k1.ox; x1:=x0+trunc(M*x);
Рис. 3.4. Блок-схема графічної частини роботи (продовження).
25.
24.
23.
22.
21.
20.
19.
виводимо назву графіка (Графік 1)
вибір шрифта
позначаємо на осі MIN, MAX та нуль
вибираємо колір і шрифт
закриваємо файл
будуємо лінію до розрахованої точки
4. ПРОГРАМА
Program Zadacha;
uses Crt, Graph;
type kog=record {Опис типу запису}
ox:real;
oy:real;
onz:integer;
yminz:real;
ymaxz:real;
end;
myfile=file of kog;
const y0=240;
var file1,tmp : myfile;
k1 : kog;
a,b,h,x,y,M,ymax,ymin : real;
hg,i,n,x0,xmin,xmax : integer;
function f(x:real):real;
begin
f:= sqrt(abs(x)) {Формула функції}
end;
procedure Tabulation(a,b,h:real);
var file1:myfile;
k1:kog;
x,y,ymax,ymin:real;
n:integer;
begin
assign(file1, 'kog.dat');
rewrite(file1); {Вiдкриття файлу для запису}
x:=a;
n:=0;
ymin:=f(x);
ymax:=f(x);
while x<=b do
Begin
y:=f(x);
writeln ('x=', x:5:2, ' y=', y:6:4);
k1.ox:=x;
k1.oy:=y;
write(file1, k1); {Запис даних у файл}
if y>ymax then ymax:=y;
if y<ymin then ymin:=y;
x:=x+h;
n:=n+1;
end;
k1.yminz:=ymin;
k1.ymaxz:=ymax;
k1.onz:=n;
assign(tmp, 'tmp.dat');
rewrite(tmp);
write(tmp,k1);
close(tmp);
close(file1); {Закриття файлу}
end;
{Варіанти побудови координатних осей}
{та вибір масштабування}
procedure osikoord(a,b,h,ymax,ymin:real);
begin
if (ymax-ymin) > (b-a) then
begin
M:=400/(ymax-ymin);
if (a>=b) then
begin
writeln('ERROR! MIN >= MAX');
halt;
end;
if (a<0) and (b<0) then
begin
x0:=trunc( 100+M*(-a) );
xmin:=100;
xmax:=trunc( 100+M*(b-a) );
end;
if (a<0) and (b=0) then
begin
x0:=trunc( 100+M*(-a) );
xmin:=100;
xmax:=trunc( 100+M*(b-a) );
end;
if (a<0) and (b>0) then
begin
x0:=trunc( 100+M*(-a) );
xmin:=100;
xmax:=trunc( 100+M*(b-a) );
end;
if (a=0) and (b>0) then
begin
x0:=100;
xmin:=100;
xmax:=trunc( 100+M*b );
end;
if (a>0) and (b>0) then
begin
x0:=trunc( 500-M*b );
xmin:=trunc( 500-M*(b-a) );
xmax:=500;
end;
end;
if (ymax-ymin) < (b-a) then
begin
if (a>=b) then
begin
writeln('ERROR! MIN >= MAX');
halt;
end;
if (a<0) and (b<0) then
begin
M:=400/(-a);
x0:=trunc( 100+M*(-a) );
xmin:=100;
xmax:=trunc( 100+M*(b-a) );
end;
if (a<0) and (b=0) then
begin
M:=400/(b-a);
x0:=500;
xmin:=100;
xmax:=500;
end;
if (a<0) and (b>0) then
begin
M:=400/(b-a);
x0:=trunc( 100+M*(-a) );
xmin:=100;
xmax:=500;
end;
if (a=0) and (b>0) then
begin
M:=400/(b-a);
x0:=100;
xmin:=100;
xmax:=500;
end;
if (a>0) and (b>0) then
begin
M:=400/b;
x0:=trunc( 500-M*b );
xmin:=trunc( 500-M*(b-a) );
xmax:=500;
end;
end;
hg:=trunc(h*M);
end;
{Початок графічної частини}
procedure grpart(a,M:real;y0,x0,n,xmin,xmax:integer);
var driver,mode,y1,x1:integer;
begin
clrscr; driver:=detect; initgraph(driver,mode,'');
setcolor(1); setbkcolor(0);
setlinestyle(0,0,3);
{побудова осей координат}
line(10,y0,630,y0); line(x0,470,x0,10);
line(xmax,235,xmax,245); line(xmin,235,xmin,245);
line(x0,10,x0-5,25); line(x0,10,x0+5,25);
line(630,y0,615,y0+5); line(630,y0,615,y0-5);
x:=a; x1:=x0+trunc(M*x); {x,y - математичні координати}
y:=f(x); y1:=y0-trunc(M*y); {x1,y1 - графічні координати}
moveto(x1,y1); setcolor(1);
reset (file1);
for i:=1 to n do
begin
read(file1,k1);
y:=k1.oy; y1:=y0-trunc(M*y);
x:=k1.ox; x1:=x0+trunc(M*x);
lineto(x1,y1);
end;
close(file1); {Закриття файлу}
setcolor(15); {оцифровка осi координат}
settextstyle(TriplexFont,0,1);
outtextxy(xmin-10,250,'MIN');
outtextxy(x0+3,245,'0');
outtextxy(xmax-10,250,'MAX');
settextstyle(TriplexFont,0,2);
outtextxy(200,380, 'Графік 1');
end;
{Основна програма}
Begin
clrscr;
writeln ('write MIN parameter of an interval:');
read (a);
writeln ('write MAX parameter of an interval:');
read (b);
writeln ('write step:');
read (h);
Tabulation(a,b,h);
assign(tmp, 'tmp.dat');
reset (tmp);
read(tmp,k1);
n:=k1.onz;
ymin:=k1.yminz;
ymax:=k1.ymaxz;
close(tmp); {Закриття файлу}
osikoord(a,b,h,ymax,ymin);
grpart(a,M,y0,x0,n,xmin,xmax);
readln(x)
end.
5. ВИСНОВКИ
Щоб виконати цю програму, необхідно знати і вміти використовувати в мові Turbo Pascal функції, описи, а також – знати необхідні команди і процедури при роботі з файлами і з графічним режимом. Написання програми дає особливо добрий практикум в галузі роботи з файлами та з графічним режимом. Виконавши цю прогаму, можна навчитися будувати графіки функцій в середовищі Turbo Pascal через задання необхідної функції.