- •1. Теоретичні відомості
- •1.1. Ініціалізація графічного режиму
- •Var gd, gm: integer;
- •InitGraph( gd, gm,’вказується шлях до драйвера, чим докладніше, тим краще’)
- •1.2. Базові процедури і функції.
- •1.3. Екран і вікно в графічному режимі.
- •SetViewPort (x1, y1, x2, y2:integer, Clip:boolean);
- •SetViewPort( 0, 0, GetMaxX, GetMaxY, true);
- •1.4. Виведення найпростіших фігур.
- •1.4.1. Виведення точки.
- •PutPixel (X, у: integer, color:word);
- •Шкала кольорів
- •1.4.2. Виведення лінії.
- •Line (x1, y1, x2,y2 :integer);
- •SetColor(Gyan); Line(1,1,600,1);
- •SetLineStyle(1,0,1); Line(15,15, 150,130);
- •Line(15,15, 150,130);
- •1.5. Побудова багатокутників.
- •1.5.1. Побудова прямокутників.
- •Rectangle (x1, y1, x2, y2:integer ),
- •Bar (x1, y1, x2, y2:integer),
- •Bar3d (x1, y1, x2,y2, d: integer, а:boolean)
- •1. SetColor(Green);
- •2. SetFillStyle(1,3);
- •3. SetFillStyle(1,3);
- •1.5.2. Побудова багатокутників.
- •DrawPoly(а: word, var PolyPoints).
- •Var gd, gm: integer;
- •Xm, ym, xmaxD4, ymaxD4:word;
- •Initgraph(gd, gm, ‘ с/bp’);
- •FillPoly(а: word, var PolyPoints).
- •Initgraph(gd, gm, ‘ с/bp’);
- •1.6. Побудова дуг і кіл.
- •1.7. Робота з текстом.
- •1.7.1. Виведення тексту.
- •OutText(‘натисніть будь-яку клавішу”);
- •OutTextXy(X, у: integer, Textst: string),
- •OutTextXy(60, 100, ‘натисніть будь-яку клавішу”)
- •1.7.2. Виведення чисельних значень.
- •1.7.3. Шрифти.
- •SetTextStyle(Font,d,c:word),
- •Стандартні шрифти
- •1.7.4. Вирівнювання тексту.
- •SetTextJustify(Horiz, Vert : word)
- •1.8. Побудова графіків функцій.
- •1.9. Цикли в графіці. Побудова випадкових процесів.
- •1.10. Створення ілюзії руху.
- •I, i1, i2, i3: real; gd, gm: integer;
- •2. Приклад виконання лабораторного завдання.
- •GetMem(BitMap,Size);
- •Var gd,gm:integer;
- •X,y:integer;
- •InitGraph (gd,gm,'egavga.Bgi');
- •Var gd,gm:integer;
- •VX,Vy,X,y:real;
- •InitGraph (gd,gm,'egavga.Bgi');
- •3. Завдання до виконання лабораторної роботи
- •4. Контрольні запитання
- •Ініціалізація графічного режиму.
- •5. Варіанти завдань
1.9. Цикли в графіці. Побудова випадкових процесів.
Для того, щоб картинки не були монотонними і регулярними, можна задавати фігурам випадкові розміри, колір, координати. Для цього є спеціальна функція Random. Вона генерує випадкові числа з [0, 1). Для розширення первинного проміжку використовується функція Random(і: word), яка видає число з діапазону 0...і. Насправді ці функції генерують деяку послідовність псевдовипадкових чисел, і щоб добитися ілюзії повної «випадковості» використовують команду Randomize, яка змінює базу датчика випадкових чисел.
Приклад. Намалювати у випадковому місці екрану точку випадкового кольору.
Фрагмент програми:
Randomize
x:=random(640);
у:=Random(480);
с:=Random(15);
PutPixel(x, у, с);
Приклад. Намалювати 5000 точок випадкового кольору у випадковому місці.
Фрагмент програми:
For i:=1 to 5000 do
begin
x:=Random(640);
у:=Random(480);
с:=Random(15);
PutPixel(x, у, с);
end;
1.10. Створення ілюзії руху.
Створити видимість руху зображення на екрані можна декількома способами. Розглянемо два з них.
I спосіб. Імітація руху об'єкту на екрані за рахунок багатократного виконання програмою набору дій: намалювати – пауза – стерти (намалювати в тому ж місці кольором фону) – змінити координати положення малюнка.
Перед початком складання програми треба продумати опис об'єкту, що «рухається», характер зміни координат, що визначають поточне положення об'єкту, діапазон зміни і крок.
Вправа 1. Вивчити текст програми, яка малює модель атома. Перевірити її дію.
program Model_At;
uses Crt, Graph;
const
Ra=100;{радіус атома}
Rc=10; {радіус ядра}
Re=4; {радіус електрона}
k=0.5; {коефіцієнт стиснення орбіт електронів}
Dr=30; {параметр зміни координат електрона}
Step1=0.2; {крок зміни положення електрона}
Step=100; {час затримки – швидкість руху електронів}
var
cx, су, у, y1, y2, x, x1, x2, x3, y3:integer;
I, i1, i2, i3: real; gd, gm: integer;
begin
clrscr;
gd:=detect; initgraph(gd, gm, ‘шлях до драйвера’);
SetTextStyle(0, 0, 2);
OutTextXY(200, 30, ‘Модель атома’);
cx:= GetMaxX div 2; {визначити центр экрана- положення ядра}
су:= GetMaxY div 2;
PieSlice(cx, су, 0, 360, Rc);{намалювати ядро атома}
SetColor(Red);
SetLineStyle(0, 0, 3);
Line(cx-7, су, cx+7, су);
Line(cx, cy-5, cx, cy+5);
SetLineStyle(0,0,1);
SetFillStyle(1, 1);
I:=Pi/4; {задати початкове положення 4 електронів}
I1:= - Pi/4;
I2:= - Pi/2;
I3:= Pi/2;
SetTextStyle(0, 0, 1);
SetColor(jellow);
OutTextXY(180, 420,’Для відміни натискуйте будь-кого клавишу’);
While not KeyPressed do {повторювати, поки не натискує будь-яка клавіша }
begin
{ визначити координати електронів}
x:=Round (Ra*cos(I)) +cx;
у:= Round (k+Ra*sin(I)) +cy;
x1:= Round((Ra+Dr)*cos(I1))+cx;
y1:= Round (k*(Ra+Dr)*sin(I1)) +cy;
x2:= Round((Ra-Dr)*cos(I2))+cx;
y2:= Round (k*(Ra-Dr)*sin(I2)) +cy;
x3:= Round((Ra-Dr)*cos(I3)*2.3)+cx;
y3:= Round (k*(Ra-Dr)*sin(I3)*2.3) +cy;
{встановити синій колір і намалювати електрони}
SetColor(1);
Circle (x, у, Re);
PutPixel(x, у, 2);
Circle (x1, y1, Re);
PutPixel(x1, y1, 2);
Circle (x2, y2, Re);
PutPixel(x2, y2, 2);
Circle (x3, y3, Re);
PutPixel(x3, y3, 2);
Delay(Step);
{намалювати електрони кольором фону}
SetColor(0);
Circle (x, у, Re);
PutPixel(x, у, 2);
Circle (x1, y1, Re);
PutPixel(x1, y1, 2);
Circle (x2, y2, Re);
PutPixel(x2, y2, 2);
Circle (x3, y3, Re);
PutPixel(x3, y3, 2);
{задати зміну положення електронів}
I:=I + Step1;
I1:=I1 – Step1;
I2:=I2 + Step1;
I3:=I3 + Step1;
end; {кінець циклу}
CloseGraph;
end.
II спосіб. Ілюзія руху створюється за допомогою спеціальних процедур і функцій.
Функція ImageSize(x1, y1, x2, y2: integer):word повертає розмір пам'яті в байтах, необхідний для розміщення прямокутного фрагмента зображення, де x1,y1 – координати лівого верхнього і x2, y2 – правого нижнього кутів фрагмента зображення.
Процедура GetImage(x1, y1, x2, y2:integer, var Buf) поміщає в пам'ять копію прямокутного фрагмента зображення, де x1 ,y2 – координати кутів фрагмента зображення, Buf – спеціальна змінна куди буде поміщена копія відеопам'яті з фрагментом зображення. Buf повинна бути не менше значення, що повертається функцією ImageSize з тими ж координатами.
Процедура PutImage(x1, y1, x2, y2:integer, var Buf, Mode:word) виводить в задане місце екрану копію фрагмента зображення, раніше поміщену в пам'ять процедурою GetImage. X, У – координати лівого верхнього кута того місця на екрані, куди буде скопійований фрагмент зображення; Buf – спеціальна змінна, звідки береться зображення, Mode – спосіб копіювання. Координати правого нижнього кута не вказуються, оскільки вони повністю визначаються розмірами копії зображення, що виводиться на екран. Координати лівого верхнього кута можуть бути будь-ким, лише б тільки копія уміщалася в межах екрану (якщо копія не розміщується на екрані, то вона не виводиться, і екран залишається без змін). Параметр Mode визначає спосіб взаємодії розміщуваної із зображенням, що вже є на екрані (таб. 7.8).
Таблиця 7.8
Константа |
Значення |
Операція |
Пояснення |
Normalput |
0 |
Заміна існуючого на копію |
Стирає частину екрану і на це місце поміщає копію |
Xorput |
1 |
Виняткове або |
Малює збережений образ або стирає раніше намальований, зберігаючи фон |
Orput |
2 |
Об'єднувальне або |
Накладає збережений образ на існуючий |
Andput |
3 |
Логічне і |
Об'єднує збережений образ і вже існуючий на екрані |
Notput |
4 |
Інверсія зображення |
Те ж саме, що і 0, тільки копія виводиться в інверсному вигляді |
Вправа 2. Вивчити програму, яка малює зоряне небо і переміщає на його фоні малюнок НЛО. Перевірити дію програми.
program NLO;
uses crt, graph;
const
k=20;
Pause=50;
var
gd,gm,xmin,xm,ymin,ym,x,у,tx,ty,rx,ry,size,i,dx,dy,width,height:integer;
sauser:Pointer;
begin
Randomize;
gd:= detect; initgraph(gd, gm, ‘шлях до драйвера”);
SetTextStyle(0, 0, 2);
OutTextXY(50, 10, ‘Демонстрація руху НЛО’);
{Малюємо НЛО}
x:=R*5;
у:=R*2;
xm:=GetmaxX- 5;
ym:=GetmaxY-25;
Ellipse(x, у, 0, 360, R, R div 3+2);
Ellipse(x, y-4, 190, 357, R, R div 3);
Line(x + 7, у - 6, x + 10, у - 12);
Line(x -7, у - 6, x + 10, у - 12);
Circle(x + 10, у - 10, 2);
Circle(x -10, у - 10, 2);
FloodFill(x+1, y+4, White);
{визначаємо габарити НЛО і поміщаємо в спеціальну динамічну змінну}
Tx:= x-R;
Ty:=y-14;
Rx:;=x+R;
Ry:=y+R div3 +3;
Width:=Rx-Tx+1;
Size:=ImageSize(Tx, Ty, Rx, Ry);
GetMem(sauser, Size);
GetImage(Tx, Ty, Rx, Ry, sauser^);
{стираємо побудоване зображення}
PutImage(Tx, Ty, sauser^, XorPut);
{малюємо зоряне небо}
SetStyle(1, blue); {встановити стиль і колір зафарбовування голубе небо}
SetColor(White);
{накреслити прямокутник і відкрити вікно}
Rectangle(xmin, ymin, GetmaxX, GetmaxY);
SetViewPort(xmin, ymin, GetmaxX, GetmaxY, ClipOn);
FloodFill(xmin+1, ymin+1, White);
For i:=1 to 500 do {намалювати 500 зірок білого кольору}
PutPixel(Random(GetmaxX),
Random(GetmaxY- ymin), 15);
{задаємо початкове положення НЛО}
x:=xm div 3 – xmin;
у:=ym div 3 – ymin;
dx:=6;
dy:=6;
Repeat {цикл: повторювати, поки не натискує будь-яка клавіша}
PutImage(x, у, sauser^, XorPut); {зображаємо об'єкт}
Delay (Pause);{ затримка}
PutImage(x, у, sauser^, XorPut); {після паузи стираємо об'єкт}
{переміщаємо об'єкт}
If (x<xmin) Or (y<ymin) Or (x+Width +1> xm) Or (y+Height +1> ym) Then
begin {якщо об'єкт зміщується вліво-вверх за межі вікна, змінити координати так, щоб він залишався у вікні}
If (x- Dx< xmin) then x:= xmin else x := x- Dx;
If (y- Dy< ymin) then у:= ymin else у := y- Dy;
Dx:= GetmaxX div 10 - Random(GetmaxX div 4);
Dy:= GetmaxY div 10 - Random(GetmaxY div 4);
end
else
begin { якщо об'єкт зміщується вправо-вниз за межі вікна, змінити координати так, щоб він залишався у вікні}
If (x+Dx<xm) then x:=x+Dx else x:=Random(GetmaxX)-Random(GetmaxXdiv4);
If (у+Dy<ym) then у:=у+Dy else у:=Random(GetmaxY)-Random(GetmaxYdiv3);
end;
until KeyPressed; {завершити, як тільки натискуватиме клавіша }
FreeMem (sauser, Size);
Closegraph; end; end.
