Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_7.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
383.49 Кб
Скачать

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]