Скачиваний:
51
Добавлен:
30.05.2020
Размер:
2.41 Mб
Скачать

Враховуючи обидва кроки, пояснення об'єднання яких ви­ ходить за межі даного посібника, загальне перетворення систе­ ми координат xyz у систему x'y'z' задається таким записом:

coscp

- sin ф sin у

sincpcosy

А= sincp

coscpsin\(i

-coscpcosy

0

cosy

siny

Це означає, що точка (х; у; z) із заданої поверхні переходить у точку (х'; у') на картинній площині, де

х' = х coscp + у snup, у' = -х sincp sin\|/ + у coscp simp + z cosy. Можна визначити і зворотне перетворення, яке описується

такими співвідношеннями:

х = х' coscp - у' sincp sinij/ + z' cos\|/ sincp; у = x' sincp + y' sinv|/ coscp - z' cosy coscp; z = y' cosi|/ + z' siny.

Останнє представлення значень x, у, z через x'y'z' дає змо­ гу виконати заміну змінних і отримати рівняння поверхні F(x', у', z') = 0 у новій системі координат x'y'z', в якій уже на­ прям проектування паралельний осі Oz' і проектування ведеть­ ся на площину х'Оу'. Надалі координати х', у', z' будемо позна­ чати через х, у, z. Отримане перетворене рівняння поверхні можна представити у вигляді z = f(x, у).

Тепер переходимо до другої, основної частини побудови про­ екції заданої поверхні на площину. Для кращого подальшого розуміння алгоритму уявимо собі, як можна цю поверхню на­ малювати на аркуші паперу. Нехай глибина малюнка спрямо­ вана уздовж осі Oz. Якщо уявити собі, що ми малюємо поверх­ ню, просуваючись з певним кроком по осі Oz від найближчої частини малюнка до найдальшої, то це будуть зображення його перерізів, для яких значення z буде сталим. Малювання логічно почати із найближчого перерізу: фрагмент поверхні, що належить йому, буде зображено повністю. Далі у решти пе­ рерізів малюватимемо лише ті частини фрагментів поверхні, що «виглядатимуть» із-за тих, що вже намальовані.

Тепер перейдемо на мову математики. Розглянемо побудову графіків функцій, що відповідають сталим значенням z. Це оз­ начає, що для кожного z, що змінюється у циклі від zx до z2 (zt < z2), перебираються значення х із деякого діапазону і таким чином підраховуються точки (х; у; z), що лежать на поверхні.

Описана послідовність дій дає змогу побудувати графік функції двох змінних без усунення невидимих ліній, однак таке зображення поверхні буде не зовсім зрозумілим. У зв'язку з цим постає задача про таку побудову поверхні, при якій би усувались невидимі лінії.

Зведемо тривимірну задачу до двовимірної: вся задана по­ верхня може бути представлена у вигляді послідовності ліній

312

у = f(x, z), які лежать у паралель­

У

 

 

 

 

 

 

 

 

них площинах 2 = 2; і не перетина­

 

 

 

 

ються (мал. 176).

 

 

 

 

— -

 

Отже, маємо такий алгоритм по­

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

будови графіка функції у = f(x, z):

 

 

У S

 

 

 

для кожної площини z =ziy поряд­

 

 

 

ку зростання г,

починаючи

з най­

 

 

 

 

 

 

 

 

 

 

 

 

[y=f(X,2)

ближчої

точки

спостереження,

 

zt

/

^—>¥

 

 

 

 

 

 

 

 

 

виводяться лінії і при зображенні

 

 

 

 

 

поточної

лінії

виводиться

лише

 

 

 

 

 

о

 

 

X

та її частина, яка не закриваєть­

 

Мал. 176

ся раніше

виведеними лініями.

 

 

 

Якщо у деякій площині z = const

 

 

 

 

 

при деякому х одержується точка у, більша за всі попередні у, то дана точка видима, у протилежному випадку - невидима. Для визначення тих частин лінії у = f(x, z), які не закривають­ ся попередньо намальованими лініями, вводяться до розгляду дві лінії горизонту - верхня та нижня.

Визначимо поетапне виконання алгоритму плаваючого го­ ризонту.

На першому кроці виконання алгоритму лінії горизонту не розглядаються, оскільки перший розріз поверхні для z1 розміщений ближче до спостерігача, ніж інші, нічим не закри­ вається і тому він виводиться повністю. На цьому самому кроці визначаються перші значення ліній горизонту, які будуть ви­ користані на наступному кроці: для кожного значення х визна­ чається максимальне та мінімальне значення у.

Друга лінія теж повністю виводиться, а лінії горизонту ко­ регуються так: нижня лінія горизонту в усіх своїх точках х дорівнює мінімуму серед значень у для двох уже виведених ліній, а верхня лінія - максимуму.

Розглянемо область екрана між верхньою та нижньою лінією горизонту - вона є проекцією частини графіка функції

у = f(x, z) у смузі z1<z < z2. Для інших ліній у = f(x, z) при і > 2

ті частини ліній, які при проектуванні потрапляють в область між двома лініями горизонту, стають невидимими. Кожна нас­ тупна лінія буде виводитися лише для тих значень х, для яких її проекція лежить поза межами області, що задається двома лініями горизонту.

Роботу цього алгоритму на конкретному прикладі можна на­ очно пояснити так. Нехай необхідно зобразити панораму па­ горбів, що розміщені один за одним. Якщо на передньому плані знаходитиметься найвищий пагорб, то визначене на цьому кроці максимальне і мінімальне значення ліній горизонту буде залишатися і на наступних кроках найбільшим, а тому на ек­ рані монітора за першим пагорбом сховаються всі решта. Якщо

313

ж пагорби будуть упорядковані за зростанням їх висоти, тобто на першому плані знаходитиметься найнижчий з них, потім наступний за висотою і т. д., а останнім - найвищий, то на кож­ ному кроці виконання алгоритму значення максимальної та мінімальної ліній горизонту будуть корегуватися - максималь­ на збільшуватиметься, а мінімальна зменшуватиметься. Та­ ким чином, у результаті на екрані монітора можна буде побачи­ ти, як за кожним із пагорбів виглядає наступний.

Таким чином, тепер алгоритм виглядає так: якщо при деяко­ му значенні х значення у на поточній кривій більше за відповідне значення з верхнього горизонту або менше за зна­ чення нижнього горизонту, то точка у видима, у протилежно­ му випадку - невидима.

Пояснимо математично основні моменти, на яких базується описаний алгоритм. Нехай проекцією лінії у = f(x, zt) на кар­ тинну площину є лінія у = yt(x), де (х; у) - координати точки на картинній площині. Тоді контурні лінії у™"* (х) і у™п (х) визнача­ ються такими співвідношеннями:

уГх(х)=тахуі(х), у™п(х)= тіп Уі(х).

На екран виводяться тільки ті частини лінії у = yh{x), які знаходяться вище від лінії у™ах(х) або нижче від лінії у™т(х).

Є різні способи представлення ліній горизонту, але однією з найпростіших і найефективніших реалізацій цього методу є ре­ алізація, при якій кожна лінія горизонту задається набором значень з кроком 1 піксель, тобто для кожного цілого значення змінної х (хтіп < х < хтах) обчислюються відповідні значення

уГ(х)іуГ(х).

Перейдемо до представлення алгоритму, що реалізує метод плаваючого горизонту, мовою програмування.

Для зручнішого оперування значеннями ліній горизонту введемо масиви h_max[x] та h_min[x], елементами яких будуть відповідно поточні максимальне та мінімальне значення для кожного х.

За основу тієї частини алгоритму, яка визначає екранні ко­ ординати видимої точки поверхні, візьмемо розглянутий вище алгоритм Брезенхема для відображення відрізка прямої. Однак при цьому врахуємо, що координати кінців цих відрізків

(Xj;

г/х) та 2; у2) по осі абсцис відрізняються на 1 2

- х1 = 1), а

відповідні значення

ух та у2 обчислюються за формулами:

у1 =

f(zt, хг), у2 = f(zt,

х2).

 

Окрім цього, слід звернути увагу на те, що суттєвим фактором для визначення видимих точок поверхні є значення кутового

коефіцієнта k = — -. Якщо воно менше від 1, то із збільшенням

2 _ * 1

314

значення х збільшуватиметься і

 

 

 

 

 

 

 

 

 

 

значення у, а це означає, що

 

~щ~щ

 

 

 

 

•__•

максимальне значення лінії го­

• •

_•

 

 

ризонту для кожного х буде ви­

 

 

 

 

 

 

 

 

 

• •

значене коректно (мал. 177, а).

 

 

 

 

 

 

 

 

 

 

А от у разі вертикального розта-

,.

 

 

0,

 

 

 

 

шування точок (мал. 177, б), се-

 

 

 

Мал. 177

 

 

 

 

 

 

ред яких усі є видимими, може

 

 

 

 

 

 

 

 

 

 

статися так, що першою буде розглянута точка з більшим зна­ ченням у і саме воно стане поточним значенням верхньої лінії горизонту для точки Ї. А це означатиме для алгоритму, що решта точок цієї вертикалі є невидимими, що суперечить ре­ альності.

Тому у реалізації алгоритму присутні дві окремі процедури, які передбачають розгляд двох варіантів значень кутового ко­ ефіцієнта k.

Можна запропонувати такий варіант основної частини про­ грами:

for Z := z1 to z2 do

{Цикл побудови перерізів заданої поверхні по осі Oz.)

for X := x m i n to x m a x - 1 do

{Перегляд усіх значень x з кроком 1.}

begin

 

 

 

х1 := х; х2 := х + 1;

{Початкові значення кінців відрізка у поточному перерізі.}

у1 : = f ( z , x 1 ) ; y 2 : = f ( z , x 2 ) ;

 

 

n := abs(x2 - х1); m := abs(y2 - у1);

{Ініціалізація початкових значень}

sx := sign(x2 - х1); sy := sign(y2 - у1);

{для побудови відрізка}

х_р := х 1 ; у_р := у 1 ; s := 0; є := 0;

{за алгоритмом Брезенхема.}

{Визначення процедури залежно від значення кутового коефіцієнта.}

if m < n then k_less_1 else k_more_1

 

 

end;

 

 

 

Тепер розглянемо процедуру, що реалізує випадок к <

1:

procedure k_less_1;

 

 

 

begin

 

 

 

n2 := 2 * n; m2 := 2 * m;

{Ініціалізація початкових значень.}

while S < n - 1 do

{Цикл для побудови всіх точок поточної лінії.}

begin

{Лічильник точок, крок по осі Ох, обчислення відхилення.}

s := s + 1; х := х + sx; є := є + т 2 ;

 

 

{Якщо відхилення більше ніж 1, то зміщення по осі Оу і перерахунок}

if є > n then begin у := у + sy; є := є - n2 end;

{відхилення.}

if у < h_min[x]

{Якщо значення ординати поточної точки менше}

 

{від лінії нижнього горизонту, то виведення точки}

 

{і перевизначення значення лінії нижнього горизонту,}

then begin PutPixel(x, у, d ) ; h_min[x] := у end

{якщо значення ординати поточної точки більше від лінії} else if у > h_max[x] {верхнього горизонту, ТО}

{виведення точки і перевизначення значення лінії верхнього горизонту.}

then begin PutPixel(x, у, с2); h max[x] := у end;

end;

end;

315

Для вертикального розташування точок процедура може бу­ ти такою:

procedure k_more_1; begin

С := m; m := n; n := c;

 

{Ініціалізація початкових значень.}

n2 := 2 * n; m2 := 2 * m;

 

 

u := x; v := y; xO := x; yO := y;

 

 

while s < n - 1 do

{Цикл для побудови всіх точок поточної лінії.}

begin

 

{Лічильник точок, крок по осі Оу,}

s : = s + 1;v:=v + sy; є := є + m2;

{обчислення відхилення.}

{Якщо відхилення більше ніж 1, то зміщення по осі Оу і перерахунок}

if є > n then begin u := u + sx; є := є - n2 end;

{відхилення.}

 

{Якщо значення ординати поточної точки менше лінії}

if у < h_min[x]

 

{нижнього горизонту, то}

then begin

 

 

 

PutPixel(x, у, с1);

 

{виведення точки.}

if U <> х

{Перевизначення значення лінії нижнього горизонту.}

then

 

 

 

begin

 

 

 

if sy > 0 then h_min[xO] := yO else h_min[x] := y;

xO := u; yO := v

 

 

end

 

 

 

end

 

 

 

 

{Якщо значення ординати поточної точки більше лінії}

else if у > h_max[x]

{верхнього горизонту, то}

then

 

 

 

begin

 

 

 

PutPixel(x, у, с1);

 

{виведення точки.}

if U О х {Перевизначення значення лінії верхнього горизонту.} then

begin

if sy > 0 then h_max[xO] := yO else h_max[x] := y; xO:=u;yO:=v

end; end

else if u <> x then begin xO u; yO := vend x := u; у := v

end;

end;

Варто звернути увагу на деякі недоліки описаного методу плаваючого горизонту.

1.Може статися так, що при деякому значенні х значення у(х) невідоме. У такому разі можна запропонувати взяти у якості цього значення середнє між двома сусідніми значеннями.

2.Якщо функція задана малою кількістю точок і має досить гострі піки, то наведений алгоритм може дати некоректні ре­ зультати.

316

Завдання

1.Розробити та реалізувати у вигляді програми алгоритм Брезенхема для побудови відрізка.

2.Виконати завдання 1 для відрізка, паралельного осі абсцис. Результат виконання програми вивести на екран монітора.

3.Виконати завдання 1 для відрізка, паралельного осі орди­ нат. Результат виконання програми вивести на екран моні­ тора.

4.Виконати завдання 1 для довільного відрізка. Результат ви­ конання програми вивести на екран монітора.

5.Розробити та реалізувати у вигляді програми алгоритм Брезенхема для побудови кола.

6.Виконати завдання 5 для кола з радіусом, меншим за 1. Ре­ зультат виконання програми вивести на екран монітора.

7.Виконати завдання 5 для кола з довільним радіусом. Резуль­ тат виконання програми вивести на екран монітора.

8.Розробити та реалізувати у вигляді програми метод плаваю­ чого горизонту для реалістичної побудови поверхні.

9.Виконати завдання 8 для поверхні, що не має невидимих то­ чок. Результат виконання програми вивести на екран моні­ тора.

10.Виконати завдання 8 для поверхні, що має невидимі точки. Результат виконання програми вивести на екран монітора.

11.Виконати завдання 8 для поверхні, що має невидимі точки. Результат виконання програми вивести на екран монітора.

/Запитання для самоконтролю

1.У чому полягає проблема виведення зображення відрізка на ек­ ран монітора?

2.Як можна вирішити проблему виведення зображення відрізка на екран монітора?

3.Опишіть алгоритм побудови чотиризв'язної розгортки відрізка. Наведіть фрагмент програми, що реалізує цей алгоритм.

4.Опишіть алгоритм побудови восьмизв'язної розгортки відрізка. Наведіть фрагмент програми, що реалізує цей алгоритм.

5.Який алгоритм носить назву цілочислового алгоритму Брезенхема для восьмизв'язної розгортки відрізка у першому квад­ ранті?

6.Опишіть особливості цілочислового алгоритму Брезенхема. На­ ведіть фрагмент програми, що реалізує цей алгоритм.

7.У чому полягає ідея алгоритму Брезенхема для екранної побу­ дови кола?

8.Які рекурентні формули використовуються для екранної побудо­ ви кола за допомогою алгоритму Брезенхема?

9.Як визначається вибір точок, що належать колу, яке будується? 10. У чому полягає проблема виведення на екран монітора реаліс­

тичного зображення поверхні?

317

11.На які два класи можна поділити всі відомі алгоритми для побу­ дови реалістичного зображення поверхні?

12.Яка площина називається картинною?

13.Як виконується проектування поверхні на картинну площину? Запишіть необхідні для цього перетворення.

14.Запишіть формули для переведення точки поверхні (х; у; z) у точ­ ку (х'; у').

15.Які співвідношення описують зворотне перетворення точки (х'; у') у точку (х; у; z)?

16.Як відбувається побудова видимих ліній поверхні? Сформулюй­ те алгоритм побудови графіка функції у = f(x, z).

17.На якій математичній платформі базується алгоритм, що ре­ алізує метод плаваючого горизонту?

18.Запишіть фрагмент реалізації метода плаваючого горизонту мо­ вою програмування. Обґрунтуйте окремі його моменти.

19.Які недоліки має метод плаваючого горизонту?

-

318

 

0

 

1 0

1 0

1 8 1

 

0 110

.110 10

ШМ Шк Як Як

 

1

1

1 1 0 0 1

1

АЛГЕБРАЇЧНІ МЕТОДИ

 

10 0 1

0 111

0 0 1 1 0 1 1 0 1 0

 

10 1

1 1 0 0

оі

РОЗВ'ЯЗУВАННЯ

 

іоіоо, 101

00 8

 

 

0 110 1

АЛГОРИТМІЧНИХ ЗАДАЧ

0

0 1

 

 

10 10 0 1

0

0

1 1 1 0 11

 

10 11

 

0

0

1

 

0

0

0

 

1

 

1

0

 

 

 

1

 

Ознайомлення з оптимізаційними методами розв'язування задач із різних розділів математики та алгоритмізації буде не­ повним, якщо ми не розглянемо ще один тип задач. На перший погляд для знаходження найкращого оптимального розв'язку необхідно застосувати повний перебір. Однак виявляється, що існує дещо штучний метод пошуку отпимального розв'язку, на який наштовхує знання одного з методів визначення коренів системи п лінійних рівнянь з п невідомими. Тому почнемо роз­ гляд алгоритмічного методу з попереднього ознайомлення з відомим в алгебрі методом виключення.

Розв 'язування системи лінійних рівнянь методом виключення

Для розв'язування системи п лінійних рівнянь з п невідоми­ ми розроблений метод Гауса, який базується на покроковому перетворенні рівнянь заданої системи з поступовим виключен­ ням невідомих.

Розглянемо систему п лінійних рівнянь з п невідомими:

" 2 1 ^ 1 + ^22*^2 , * + а2пХп=Ь2>

Л А + а * 2 * 2 + - - + annXn=K-

Будемо розглядати лише такі перетворення системи, які не змінюють значень її розв'язків:

-якщо будь-яке рівняння системи помножити на деяке чис­ ло А, то це ніяк не вплине на значення розв'язків системи;

-якщо додати ліві та праві частини двох рівнянь і звести подібні члени, то це так само не змінить значень розв'язків сис­ теми.

Саме на цих міркуваннях і будуть ґрунтуватися наступні пе­

ретворення.

1

Помножимо перше рівняння на — і отримаємо такий його перетворений вигляд: а п

319

*Лґ1

a

1 2

aln

-I

I

*Vo 1 • • • І * ^ и

 

« 1 1

« 1 1

Якщо отримане рівняння помножити на - а 2 1 і додати його до другого рівняння системи, то друге рівняння буде мати та­ кий вигляд:

0 * ^ + " а 2 і а і 2 + а„ х2+...+

ола,, • + а,

+ь,

V

«її

°и

Підсумком цих перетворень є фактично виключення із дру­ гого рівняння першого невідомого. Якщо такі самі дії виконати покроково над рештою рівнянь, то початковий вигляд системи зведеться до такого:

••+аІА=ьі;

х2+.

*»**£•

Процес перетворення заданої системи лінійних рівнянь до «трикутного» вигляду називають прямим ходом. Після такого перетворення зовсім нескладно знайти розв'язки системи. Для цього із останнього рівняння визначається хп, це значення підставляється у передостаннє рівняння, звідси знаходиться значення хп_х і т. д. Процес знаходження розв'язків системи називають зворотним ходом.

Застосування методу виключення для розв 'язування алгоритмічних задач

Після короткого екскурсу в розділ алгебри перейдемо до пи­ тань алгоритмізації. Розглянемо наступну задачу.

Нехай є деякий пристрій, що складається з послідовності п елементів, кожний з яких може знаходитися лише у стані 0 або 1. Є також п пристроїв керування, що мають можливість одночасно змінювати стан будь-яких k (1% k < п) елементів послідовності на протилежний. Вхідною інформацією є така: п - кількість еле­ ментів пристрою, для якого відомий початковий та кінцевий стан його елементів, та п пристроїв керування з вказівкою, на які еле­ менти вони можуть впливати. Визначити, якою мінімальною кількістю пристроїв керування можна перевести всі елементи за­ даного пристрою із початкового стану у кінцевий.

Наприклад, нехай задано пристрій, елементи якого у почат­ ковому стані мають такі значення: 0,1,1,0,1. Існують пристрої керування з такими значеннями: 0,1,1,0,1; 0,1,1,1,0; 1,0,0,1,1; 0,1,1,1,1; 1,0,1,1,0. Застосувавши існуючі пристрої

320

керування, необхідно заданий пристрій перевести у стан 0,0ДЛ,0.

Якщо застосувати п'ятий пристрій керування до стартового стану заданого пристрою, то отримаємо такий результат:

\0 1 1 0 1 - ^ 1 ^ 1 1 0 1 1 .

Основна ідея застосування методу виключення для розв'я­ зання поставленої задачі полягає у тому, що:

-при застосуванні на заданий пристрій деякого пристрою керування, що впливає на і-й елемент, значення цього елемен­ та переходить у протилежний стан;

-парна кількість застосування пристрою керування, що впливає на і-й елемент, до і-го елемента заданого пристрою по­ вертає його у початковий стан;

-непарна кількість застосування пристрою керування, що впливає на і-й елемент, до і-го елемента заданого пристрою пе­ реводить його у протилежний стан.

Виходячи з вищезазначеного, можна зробити висновок, що для оптимізації алгоритму необхідно:

-виключити всі зайві застосування пристроїв керування щодо елементів заданого пристрою;

-працювати лише з тими елементами, що змінюють свої значення.

Перш ніж сформулювати алгоритм розв'язку задачі, розгляне­ мо і-й та у'-й пристрої керування. Позначимо відповідно а\ - fe-й елемент і-го пристрою, a a'k - k-й елемент j-то пристрою. Про­ аналізуємо, що відбуватиметься з fe-м елементом заданого пристрою, якщо застосувати до нього обидва зазначені при­ строї керування. Якщо а\ = a'k=l або а\ = а{ = 0, то стан k-то еле­ мента заданого пристрою залишиться незмінним. Якщо а\ = 0, a'k = 1 або а\ = 1, а{ = 0, стан /г-го елемента заданого пристрою зміниться на протилежний. Але можна поставити запитання: навіщо виконувати дві операції, застосовуючи до заданого пристрою обидва пристрої керування, якщо лише у другому ви­ падку стануться зміни? А чи не можна замінити два пристрої керування одним, у якому на fe-й позиції знаходитиметься 0, якщо значення а\ і а{ збігаються, і 1, якщо вони різні? При цьому таку саму заміну необхідно зробити і щодо інших відповідних елементів обох пристроїв керування. Після таких перетворень отриманий пристрій керування впливатиме на елементи заданого пристрою так само, як і два попередніх.

Наступний крок міркувань наводить на думку, що, застосо­ вуючи один із пристроїв керування до інших, можна змінювати стан їх елементів і при цьому результат їх впливу на послідов­ ність елементів заданого пристрою дасть правильний результат.

321