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

Розглянемо необхідні перетворення у тій послідовності, у якій їх необхідно виконувати.

1. Поворот точки М навколо осі абсцис:

А

у* = у coscp + г sin(p;

2* = Sin(p + 2 COSCp.

2. Поворот точки М навколо осі ординат: х* = х coscj) - 2 sincb;

*

2* = X Sin<|) + 2 COS(j).

3. Поворот точки M навколо осі аплікат: х* = х cosx + у sin/; у* = sinx + у cosx;

*

2=2.

4. Розтягування або стиснення вздовж координатних осей можна задати так:

х* = ах; у* = fiy; г* = yz.

5. Відображення відносно площини хОу задається формулами:

х* = х: у* = у;г* = -г.

6. Відображення відносно площини уОг задається формулами:

А

А

А

х

=-х:у =у;г

=г.

7. Відображення відносно площини гОх задається формулами:

 

 

 

ft ft ft

 

 

 

 

 

 

 

 

 

 

 

 

х

=х: у

= -у;

2=2.

 

 

 

 

 

 

 

Як і для випадку перетворення координат точки на площи­

ні,1 0запишемо0 coscjнаведені0 -sinc|перетворенняcosx s in X 0

 

 

 

 

 

 

прос­00

 

координатa 0 0 10

0точки-10 М0

у1

торі у

 

у вигляді:

 

 

o p 0

01

0

010

0

- 10

0

coscpкомпактномsincp 1

о

-sinx cosx 0

0

- s i m p coscp

0

coscl

0

0 1

0 0 у

0 0 - 1

0 0 1

0

01

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Завдання

1.Розробити та реалізувати у вигляді програми алгоритм пе­ ретворення точок на площині, задавши такі вхідні дані: ко­ ординати точки М(х; у), кут повороту ер, коефіцієнти розтя­ гування (стиснення) а, 8 та необхідність відображення відносно осі абсцис і ординат.

2.Розробити та реалізувати у вигляді програми алгоритм пе­ ретворення точок у просторі, задавши такі вхідні дані: коор­ динати точки М(х; у), кути повороту навколо осей абсцис ер, ординат ф, аплікат %; коефіцієнти розтягування (стиснення) a, р, у; необхідність відображення відносно осей абсцис, ор­ динат та аплікат.

3.Виконати завдання 1-2 для різних значень вхідних даних. Результат виконання програми вивести у файл.

302

z

 

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

1. З чим пов'язана необхідність перетворення координат точок на

 

 

площині та в просторі?

 

2.

Які існують два підходи для організації перетворення координат

 

 

точок на площині та у просторі? Поясніть їх на власних прикладах.

 

3.

Які послідовні кроки необхідно виконати для здійснення пере­

 

 

творення координат точки у площині?

 

4.

Як виглядає компактне представлення послідовності перетво­

 

 

рень координат заданої точки М для її переміщення в іншу сис­

 

 

тему координат на площині?

 

5.

Які послідовні кроки необхідно виконати для здійснення пере­

 

 

творення координат точки у просторі? Поясніть їх дію.

 

6.

Як виглядає компактне представлення послідовності пере­

 

 

творень координат заданої точки М для її переміщення в іншу

 

 

систему координат у просторі?

Алгоритм екранної побудови відрізка. Алгоритм Брєзєнхєма

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

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

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

Подальші пояснення базуватимуться на растровій графіці. Для того щоб лінія на екрані монітора виглядала неперерв­ ною, необхідно, щоб між її фрагментами не було «дірок». То­ му при побудові наступних алгоритмів враховуватиметься той факт, що для кожної точки растра наступною виведеною точкою має бути одна із восьми сусідніх для неї точок (мал. 172, а).

303

a)

б)

Мал. 172

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

Нехай кінці М1 і М2 відрізка мають відповідно координати (JCX; ух) та 2; у2). Тоді відрізок визначається рівнянням з кутовим

коефіцієнтом у = у1 + k(x - х

- У2 - У 1

 

х ), де k =

, ХІ X *& Хп»

Розглянемо два випадки розміщення відрізка прямої на ек­ ранній площині. Якщо кутовий коефіцієнт k невід'ємний і не перевищує 1, тобто kKl, тоді заданий відрізок виглядає так, як показано на малюнку 172, б. У цьому випадку схема роботи ал­ горитму, що виводить зображення відрізка на екран монітора, досить проста: на кожному кроці циклу збільшуємо значення по осі Ох на 1, а по осі Оу - на значення k. Умова k < 1 необхідна для того, щоб у процесі побудови відрізка не було пропущено жодної точки.

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

х :=х1; у :=у1; є :=0; dy:=(y2-y1)/(x2-x1); for і := 1 to n do

begin

x : = x + 1 ; e : = e + dy; {Крок по осі абсцис і обчислення відхилення.} {Якщо відхилення по осі ординат від поточного значення у перевищує 1/2,} {то необхідно збільшувати у на 1 і скоректувати відхилення є від нового значення у.}

304

if є > 0.5 then begin

|inc(y); e : = e - 1 end;

PutPixel(x, y, color) end;

Надалі необхідно буде врахувати, що у разі, коли h > 1 (мал. 172, в), обробку значень змінних х та у в алгоритмі треба поміняти ролями.

Продовжимо вдосконалення наведеного алгоритму. Неважко помітити, що в результаті його роботи отримається восьмизв'язне представлення відрізка, оскільки перехід до наступної точки відбувається на одну із восьми сусідніх клітин. Спробуємо сфор­ мулювати міркування, які дають змогу описати таке представ­ лення відрізка на площині: восьмизв'язна розгортка відрізка включає ті і тільки ті точки ґратки, бокові сторони квадрат­ них околів яких перетинаються з відрізком (мал. 172, б, в).

Якщо є < 0,5, то відрізок перети­ нається з боковою стороною квад­ ратного околу точки, що лежить справа від поточної точки, і необ­ хідно зміститися вправо на 1. Як­ що ж є > 0,5, то відрізок перети­ нається з нижньою межею квадрат­ ного околу, що лежить вище від точки, і необхідно зміститися на 1 вгору (мал. 173).

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

підвищення ефективності виконання алгоритму бажано відійти від виконання дійсної арифметики. З цією метою в алгоритмі, що наведений нижче, для одержання восьмизв'язної розгортки відрізка, множачи змінні dx і dy на число 2, можна позбутися дробових чисел. Змінивши «масштаб» і внісши коректування нерівності, що використовуються в операціях порівняння, от­ римаємо «цілочислову» версію алгоритму, який носить назву цілочислового алгоритму Брезенхема побудови відрізка прямої у вигляді процедури:

{Крок по осі абсцис і обчислення відхилення.} {Якщо відхилення по осі ординат від поточного значення у перевищує 1/2,}

{то необхідно збільшувати у на 1 і скоректувати відхилення є від нового значення у.}

procedure Ііпе_8(х1, х2, у1, у2: integer); var х, у, s1, s2, dx, dy, e, c: integer;

flag: boolean; begin

| x := x 1 ; у := y 1 ;

{Початкові значення координат точки.}

11 Інформатика, 9-10 кл.

305

 

{Абсолютні значення відхилень}

dx := abs(x2 - х1); dy := abs(y2 - у1);

{по осям координат.}

s1 := sign(x2 - х1); s2 := sign(y2 - у1 );{3наки відхилень по осям координат.}

if dy < dx

 

{Якщо кутовий коефіцієнт менший від 1, то}

then flag := false

 

{встановлюємо ознаку false,}

{у протилежному випадку міняємо ролями х та у; встановлюємо}

else begin с := dx; dx := dy; dy := c; flag := true end;

{ознаку true.}

Є := 2 * dy - dx;

{Обчислення відхилення з урахуванням масштабування.}

for І := 1 to dx do

 

{Цикл для виведення точок відрізка прямої.}

begin

 

 

 

PlltPixel(x, у, color);

{Виведення поточної точки відрізка прямої.}

while Є > 0 do

 

{Визначення відхилення наступної точки}

begin

 

{з урахуванням кутового коефіцієнта.}

if flag then х := Х + s1

{Якщо к > 1, то прирощення по осі Ох,}

else у := у + s2;

{якщо к ^ 1, то прирощення по осі Оу.)

Є := Є - 2 * dx;

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

end;

 

 

 

if flag then у := у + s2

{Якщо к > 1, то прирощення по осі Оу,)

else X := Х + s 1 ;

{якщо к^ 1, то прирощення по осі Ох.}

Є := Є + 2 * dy;

 

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

end;

 

 

 

PutPixel(x, у, color)

{Виведення останньої точки відрізка прямої.}

end;

 

 

 

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

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

Алгоритм екранної побудови кола

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

Розглянемо метод Брезенхема для побудови кола. Для спро­ щення розрахунків під час виконання алгоритму скористаємо­ ся тим фактом, що точки кола симетричні відносно координат­ них осей і прямих у = ±х. Згідно з цією властивістю можна по­ будувати лише 1/8 кола, а решту точок кола вивести на екран монітора, врахувавши симетрію цієї геометричної фігури: як­ що точка (х; у) належить колу, то цьому самому колу належать і точки (-х; у), (х; -у), (-х; -у), (у; х), (-у; х), (у; -х), (-у; -х).

306

Розглянемо фрагмент кола, що належить другому октанту

(1/8

частина кола), для точок якого виконується умова

х є

[0, iWI], у є [Ry2, R]. Далі для кожної точки pt, що розгля­

дається як кандидат на входження до точок кола, введемо змін­

ні dps

і d', які матимуть такий зміст: значення dps

= х2 + у2 - R2

ідентифікує точку р як зовнішню відносно кола, a dpt = R2 -

- (х2

+ у2) - як внутрішню.

 

Для того щоб на і-му кроці визначити, яка з двох точок - зовнішня чи внутрішня - найкраще підходить для зображення кола, необхідно порівняти обчислені значення dps і dpt, обчислив­ ши значення dt = d - dpt. Якщо dt < 0, то вибирається зовнішня точка dps, а якщо а-^ 0, то вибирається внутрішня точка dpt.

Виконаємо покроково алгоритм Брезенхема для екранної побудови кола.

На першому кроці алгоритму розглядається точка з коорди­ натами (0; і?). Зрозуміло, вона лежить на колі.

На другому кроці необхідно визначитися, яку точку брати: зовнішню з координатами (1; і?) чи внутрішню з координатами (1; R - 1) (мал. 174, а). Виконаємо деякі обчислення і знайдемо для цього крока відхилення між значеннями d і d t: dl = = 1 + R2-R2-(R2-(1 + (R- І)2 ) = 3 - 2R. Таким чином отри­ маємо умову для вибору між зовнішньою та внутрішньою точ­ ками: якщо 3 - 2R < 0, то вибираємо зовнішню точку (1; R), а якщо 3 - 2R ^ 0, то внутрішню (1; R - 1).

Перейдемо до (і + 1)-го кроку. На цьому кроці вибір точки залежить від того, яка саме точка - внутрішня чи зовнішня - була вибрана на попередньому і-му кроці.

Нехай на і-му кроці була вибрана зовнішня точка, тобто виконалася умова di < 0 (мал. 174,6). При цьому значення dt бу­ де обчислене за формулою dt = (х + І) 2 + у2 - R2 - (R2 - (х + І) 2 - - (у - І)2 ). Аналогічно обчислимо відхилення зовнішньої і

внутрішньої точок на (і + 1)-му кроці: di+1 = (х + 2)2 + у2 - R2 - - (R2 - (х + 2)2 - (у - І)2 ). Виконавши нескладні перетворення,

можна виразити значення di+1 через попередньо обчислене зна­ чення dt: di+1 = di + 4х + 6. Як бачимо, отримана рекурентна формула, яка задає залежність для вибору зовнішньої точки на (і + 1)-му кроці від виконання попереднього і-го кроку.

 

 

 

P_s,

PS»

 

 

 

P_s,

P_si+

 

 

 

 

 

 

 

 

 

 

 

 

 

'pj-

РЛ+

 

 

PJ\

' * J

'pjt.

 

 

 

 

 

e )

 

 

 

 

g)

x x+1 x+2

x x+1 x+2

 

 

Мал. 174

 

 

 

 

 

11*

307

Аналогічно проведемо дослідження для (і + 1)-го кроку в разі, якщо на і-му кроці була вибрана внутрішня точка (мал. 146, в).

Для цього випадку dl

> 0. Тоді отримається така рекурентна фор­

мула: di+1 = (х + 2)2

+ (у- І)2 - R2 - (R2 -(х + 2)2 - (у - 2)2) =

= dt + 4(х -у) + 10.

 

Отже, представимо описаний алгоритм Брезенхема для кола у вигляді фрагмента програми:

x:=0;y:=R;d :=3 - 2*R; while х <=у do

begin

{Процедура виведення точок кола з центром у (хс; ус) та кольором с.}

circle_8(x, у, хс, ус, с);

if d< 0 then d:=d + 4*x + 6

else begin d := d + 4 * (x - y) + 10; dec(y) end;

inc(x)

end;

Процедура circle_8, що виводить на екран симетричні точки кола, може мати такий вигляд:

procedure circle_8 (х, у, хс, ус, с: integer); begin

PutPixel(xc + х, ус + у, с); PutPixel(xc + у, ус + х, с); PutPixel(xc - х, ус + у, с); PutPixel(xc - у, ус + х, с); PutPixel(xc + х, ус - у, с); PutPixel(xc + у, ус - х, с); PutPixel(xc - х, ус - у, с); PutPixel(xc - у, ус - х, с); end;

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

Визначення невидимих точок поверхні

Загальний підхід до розв'язання проблеми та основні поняття

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

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

308

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

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

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

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

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

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

Усі існуючі алгоритми визначення невидимих точок поверх­ ні можна поділити на два класи:

309

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

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

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

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

Метод плаваючого горизонту

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

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

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

Надалі вважатимемо, що об'єкт - це деяка поверхня, яка описується рівнянням z = f(x, у). Навіть якщо цей об'єкт має складну структуру, то вважатимемо, що він розбитий на окремі фрагменти, які представляють собою поверхні.

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

310

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

Отже, для того щоб задати на­

Мал. 175

прям проектування, який збігаєть­

 

ся з перпендикуляром до картинної площини, необхідно задати два кути (р і ці. Кут ц/ утворюється між вектором нормалі і пло­ щиною хОу, а кут ф знаходиться між проекцією нормалі на пло­ щину хОу і віссю Оу (мал. 175). Враховуючи такі позначення, визначимо вектор, що задає напрям проектування:

п = (-snup cosy, -совф cosxj/, -suup), ф є [0; 2к], \\і є

71

 

2

 

 

;

Для того щоб виконати проектування поверхні на картинну площину, вісь г' нової системи координат x'y'z' повинна збіга­ тися з напрямом проектування (мал. 175).

Розглянемо перетворення системи координат хуг у систему x'y'z'. Це перетворення можна виконати за два кроки.

1. Перший поворот системи координат треба виконати відносно осі Ог на кут ф у напрямі від Оу до Ох (від'ємний на­ прям). Оскільки система координат хуг лівостороння, то цей поворот представляється таким записом:

совф -віпф 0

Д;(Ф)= ЗІПф СОвф 0

00

2.Другий поворот одержаної системи координат виконуєть ся відносно осі абсцис на кут — — v(/ | у напрямі від Ог до Оу.

Запис, що відповідає такому повороту, виглядає так:

к

 

 

 

 

 

 

1

0

0

--ч

0 cos

 

VI/

-sin

-\|/

0

sin\|/

-COSV)/

 

 

 

 

 

 

0

COSVJ/

sinvj/

 

 

 

 

 

 

 

0 sin я

COS •V

311