Скачиваний:
42
Добавлен:
30.05.2020
Размер:
689.54 Кб
Скачать

Розділ VIII

kur АЛГОРИТМИ і Р ОБЧИСЛЮВАЛЬНОЇ ГЕОМЕТРІЇ

 

1 0

1 0 0

1 0 1

1 0 1 1

0

0

1

0

0 в

 

1

 

1

0

 

 

1

 

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

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

Найпростіші геометричні фігури, їх представлення та властивості

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

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

242

Для типу real ця кількість становить 11-12 цифр. Виявляєть­ ся, що при виконанні арифметичних операцій можна втратити деяку суттєву інформацію.

Для прикладу розглянемо такі два числа: 0.123 та 0,00000000000123. У показниковій формі ці числа запишуться так: 1.23*10_1 та 1.23*10~12. При додаванні цих двох чисел у природній формі отримаємо 0.12300000000123. Однак через обмеження на кількість цифр мантиси останні три цифри бу­ дуть відкинуті, й машинний варіант обчислення буде таким: 1.23*10_1. Отже, незважаючи на те, що число 1.23*10_1 мало б бути збільшене на 1.23*10~12, насправді його значення не змінилося.

Другий приклад. Розглянемо число 0.20000000001. У по­ казниковій формі воно матиме вигляд 2.0000000001*10^. Як­ що це число поділити на 2, то в результаті машинного обчис­ лення отримаємо 1.0000000001*10_1, хоча реальний результат є таким: 0.100000000005. Тепер, якщо отримане в результаті машинного обчислення число 1.0000000001*10_1 помножити на 5, отримаємо 5.0000000003*10_1. Пояснити таку відповідь можна просто. Реальні обчислення дають такий результат:

0.100000000005*5 = 0.500000000025 « 0.50000000003.

Тобто в показниковій формі отримано результат, заокругле­ ний до можливої кількості цифр мантиси. Однак, з точки зору візуального представлення отриманого результату (1.0000000001*10_1), після його множення на 5 ми мали б отри­ мати число 5.0000000005П01 .

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

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

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

Як відомо з математики, пряму на площині можна задати у вигляді загального рівняння:

ах + by + с - 0.

У деяких задачах обчислювальної геометрії, які передбача­ ють обробку інформації у вигляді прямих на площині, вхідна інформація задається у вигляді трійок чисел (at, bt, с^) для і = 1, 2, 3, ..., п, що визначають коефіцієнти заданих п прямих.

Існує ще один спосіб представлення прямої на площині. Для цього достатньо вказати будь-які дві різні точки (х^, у1) і (х2; у2),

243

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

Як виглядатиме рівняння прямої, заданої двома точками?

Мал. 135 Для цього розглянемо задані дві точки (хг; yj і (х2; у2) і деяку довільну точку (X; Y), які лежать на одній прямій (мал. 135).

Відповідно до умови подібності можна записати таке відношення:

Х-х, : Y-Vl

Звідси рівняння прямої, що проходить через дві задані точ­ ки, виглядатиме так:

(X - х1)(у2 - у{) - (Y - Уі){х2 - хх) = 0.

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

а, = у2 — У]~, о = х^ х2; с = УуС2 — х^у2.

Відрізок прямої на площині задається координатами двох точок (Xjj г/1) і (х2; у2), що є кінцями цього відрізка. Маючи таку інформацію, можна знайти довжину відрізка за формулою:

d = yj(x1-x2)2+(y1-y2)2.

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

(*! - х2)2 + (у1 - у2)2 = (х3 - х4 )2 + 3 - у4 )2 .

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

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

244

Про взаємне розміщення двох точок х; уг) і 2; у2) можна говорити для таких випадків: якщо х1 = х21^ у2, то задані точки знаходяться на одній вертикалі на площині; якщо л^ ^ х2 іУх = у2, то задані точки знаходяться на одній горизонталі на площині; якщо хх = х2 і у1 = у2, то задані точки збігаються; як­ що х15й х2 і у1 я* і/2, то задані точки не збігаються на площині й не знаходяться на одній горизонталі або вертикалі.

Розглянемо взаємне розміщення двох прямих. Нас цікави­ тиме, чи перетинаються ці прямі, чи вони паралельні, чи обид­ ва ці рівняння представляють одну і ту саму пряму. Знаючи ко­ ефіцієнти загальних рівнянь двох заданих прямих (ах , bv сх) та 2, Ь2, с2), можна дати відповідь на всі поставлені запитання.

Якщо а1

= а2, bt

= b2, cl = с2, то це означає, що обидва рівнян­

ня описують одну і ту саму пряму.

а

а,

Ь.

с, ,

Якщо —±- = -±- = -±-?:і, то це свідчить про те, що задані прямі

 

а2

Ь2

с2

паралельні. Оскільки при діленні дійсних чисел можна втрати­

ти правильну відповідь на точності отриманих результатів, то краще перевірити одночасне виконання таких умов:

ахЬ2 = afiv bxc2 = b2c^, Cj * с2.

Мовою програмування ця умова виглядатиме так: (аі * Ь2 = а2 * &1) and (&1 * с2 = Ь2 * cl) and (сі <> с2).

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

іагх+Ь%у+с1=(Ц

2х + Ь2у + с2=0.

На першому кроці з першого рівняння визначимо змінну х

через у:

х = b - у L .

 

а1

^

Підставимо отриманий вираз у друге рівняння, визначивши значення у через коефіцієнти (av bv сх) і 2, Ь2, с2) двох зада­ них рівнянь прямих:

ахс22сх а$22Ьх'

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

х_с1Ь22Ь1

<hb2~a2bi

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

245

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

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

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

всі три задані прямі перетинаються в одній точці.

 

 

г/t

 

Взаємне розміщення

точок

і

, • . . ^

^ ^ ^

прямої. Нехай задана пряма загаль-

•"№р>*^

 

ним рівнянням ах + by + с = 0 та дві

^ ^ 0 ^ \

 

2; Уг) точки (jq; у J і 2; у2) (мал. 136).

 

 

 

 

Ознакою того, що точка 0; у0) ле­

^1

 

 

жить на прямій, є

 

 

 

 

х

 

ах0 + by0 + c = 0.

 

 

 

 

 

 

Якщо точка не лежить на прямій,

Мал. 136

 

.

. ,

, „

. п

 

 

 

то зрозуміло, що ах0

+ byQ

+ с ^ U.

А це означає, що значення ах0 + by0 + с або додатне, або від'ємне.

Оскільки пряма ах0 + Ьу0

+ с = 0 ділить координатну площину

на дві півплощини, то виявляється, що всі точки (xt; yt), які на­

лежать одній з них, дають однаковий знак виразу axt + byt

+ с.

Таким чином,

можна підбити підсумок наведених мірку­

вань. Якщо для двох заданих точок (д^; г/х) і 2; у2) має місце вираз (ах1 + Ьу1 + с)(ах2 + Ьу2 + с) > 0, то це означатиме, що ці дві точки лежать по один бік від заданої прямої ах + by + с - 0, а якщо (ахх + Ьух + с){ах2 + Ьу2 + с) < 0, то по різні. Зробити вис­ новок стосовно того, у якій саме півплощині лежать задані точ­ ки, неможливо, але таке завдання практично ніколи у задачах і не ставиться.

Взаємне розміщення точки і відрізка. Нехай задана деяка точка (X; Y) і відрізок прямої з координатами своїх кінців (ж1; у J

і 2; у2). Аналіз взаємного розміщення точки і відрізка полягає

246

в отриманні відповіді на запитання: чи належить точка задано­ му відрізку? Позитивну відповідь можна отримати лише за на­ явності виконання таких двох умов:

- задана точка (X; Y) належить прямій, що проходить через точки (л;^ у1 )і(х2 ; у2);

- координати точки (X; Y) належать діапазону, що визна­ чається відповідними координатами кінців заданого відрізка (достатньо перевірити, наприклад, хх < X ^ х2).

Мовою програмування ці умови можна записати так:

((х - хі) * (у2 - г/1) - (г/ - г/1) * (х2 - х2) = 0) and (abs(x - xl) + + abs(x2 - x) = abs(x2 - xl)).

Варто приділити увагу логіці другої частини наведеного ви­ разу abs(x - xl) + abs(x2 - х) = abs(x2 - xl), що відповідає умові належності координати X заданої точки діапазону, що визна­ чається відповідними координатами кінців заданого відрізка. Оскільки нам невідомо, де знаходиться координата X заданої точки по відношенню до відповідних координат кінців задано­ го відрізка Xj, х2, та ще й невідомо, яким чином задано його кінці, то найкращим виходом є порівняння довжин відрізків [хг Х], [Хх2], хх2] (мал. 137).

На малюнку 137 наведено три можливі варіанти розміщення координат X, xv х2, звідки видно, що тільки в разі, коли точка X знаходиться між точками х1 і х2 (мал. 137, а, б), сума довжин відрізків [XjX], [Хх2] дорівнює довжині відрізка [ х ^ ] .

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

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

247

Напрям повороту при переміщенні від однієї точки до іншої

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

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

J/

Лх22)

 

Дж*їйі)

 

*(ХіІ Уі)

 

'(х22)

(0; 0)1

х

(0;0)

*

 

а)

 

б)

 

Мал. 138

 

Почнемо подальші міркування з такої домовленості. Уявімо собі, що ми дивимося у точки (хг; уг) І (Х2 ; у2) з початку коор­ динат (0; 0). Для того щоб перевести погляд з точки (хр ух) на точку 2; у2), зображених на малюнку 138, а, необхідно повер­ нутися проти годинникової стрілки, а на малюнку 138, б - за годинниковою стрілкою. Як дізнатися про те, куди необхідно повертатися при переході від точки (жх; г/г) до точки 2; у2), знаючи при цьому лише їхні координати на площині, ми зараз і з'ясуємо.

Розглянемо два прямокутники, що утворюються такими вершинами: (0; 0), (0; yj, (х^, yj, (х^, 0) та (0; 0), (0; у2), (х2; у2), 2; 0) (мал. 139, а). Порівняємо їхні площі. Ці прямокутники мають спільну частину (0; 0), (0; уг), (х2; j/J, 2; 0). Тому їхні площі відрізняються лише площами прямокутників (0; J/J), (0; у2), (х2; у2), (х2; уг) та 2; 0), 2; yj, (х^, ух), {хх; 0). Як вид­ но навіть з малюнка 139, а, площа першого зазначеного прямо­ кутника більша за площу другого. З малюнка 139, б, де точки (»t ; і/г) і 2; у2) поміняно місцями, можна зробити висновок, що ситуація з площами відповідних прямокутників так само змінилася на протилежну.

Як довести, що наведене вище припущення вірне? Для цього проведемо такий додатковий аналіз. Розглянемо точки х; уг) і

248

f'(«i! Уі)

(x2; уг)

(0;0)

(x2; у2)7 що лежать на прямій, яка проходить через точку (0; 0) (мал. 140, а). Прямокутник, що утворюється вершинами (0; 0), (0; у2), (х2; у2), (х2; 0), ділиться діагоналлю, яка проходить через точки (0; 0), 2; у2), на два однакові прямокутні трикут­ ники, що відповідно мають і однакову площу.

За такою самою ознакою площі верхніх двох трикутників і відповідних до них нижніх, зображених на малюнку 140, а тем­ ним кольором, також однакові. Значить, однакові також і суми їхніх площ, а саме сумарна площа двох верхніх прямокутних трикутників, зафарбованих темним кольором, і сумарна площа двох нижніх прямокутних трикутників того самого кольору. Отже, якщо від рівних площ трикутників, що утворюються вер­ шинами (0; 0), (0; у2), (х2; у2) і (0; 0), 2; у2), (х2; 0), відняти рівновеликі частини, то залишаться так само рівновеликі фігу­ ри. А такими фігурами є прямокутники, що утворюються вер­ шинами (0; ух), (0; у2), (хг; у2), (хг; ух) і х; 0), (щ; ух), (х2; yj,

2; 0).

Зрозуміло, що якщо до рівновеликих фігур додати одну і ту саму фігуру, то їх площа не зміниться. Таким чином, при дода­ ванні до розглянутих вище прямокутників великого прямокут­ ника, зображеного на малюнку 140, а темним кольором, ми не змінимо співвідношення між сумарними площами двох прямо­ кутників, зафарбованих світлим кольором. Отже, площі прямо­ кутників, визначених вершинами (0; 0), (0; у2), (хг; у2), (Хр 0) і

Уі

Уг

 

 

W у2)

 

І*и Уд

 

 

 

Уг

 

 

 

^^ІСїпі/і)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

х2

х[

Т

(0; 6)

ХІ

Л •2

*

 

 

 

 

 

 

 

 

а)

 

 

 

 

 

 

249

(0; 0), (0; у J, (x2; yx), (x2; 0), будуть також однакові. їхні площі обчислюються відповідно за формулами: хг • у2 та х2 • ух.

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

Який висновок із усього сказаного вище можна зробити? А все попереднє пояснення зводилося до того, щоб констатувати факт: у разі, коли точки х; у^) і 2; у2) знаходяться на одній прямій, що проведена з початку координат, то виконується умова хху2 - х2ух = 0. Тобто для того щоб з точки (хх; г/j) побачи­ ти точку (х2; у2), ніякого повороту виконувати не треба.

А як буде змінюватися значення виразу хх у2 - х2г/1 у разі, ко­ ли точки (Ху, у±) і (х2; у2) не знаходитимуться на одній прямій, проведеній через початок координат? Розглянемо малюнок 141, а. На ньому зображена ситуація, коли точка (х2; у2) пе­ ремістилася вище від прямої, що проходить через точки (0; 0) і (хх; у у). При цьому значення координати х2 не змінилося, а зна­ чення координати у2 - збільшилося. Це означає, що відповідно і значення x2i/j не змінилося, а значення хху2 - збільшилося. Тому знак виразу хху2 - х2уг змінився - він став додатним!

Чи справедливий зроблений висновок для всіх точок, що знаходяться вище від прямої, яка проходить через точки (0; 0) і (хх; J/J)? Так, і це можна довести таким чином. Для будь-якої точки (х2; у2) півплощини, що знаходиться вище прямої, знай­ деться точка (х2; у'2), що лежить на цій прямій (мал. 141, а) і для якої виконується умова хху'2 - х2ух = 0. Але оскільки за по­

будовою у2 > у'2, то й хху2 - х2ух > 0.

Отже, підіб'ємо перший підсумок: коли при переході від точки (Xjj ух) до точки 2; у2) виконується поворот проти го­ динникової стрілки, то має місце умова хгу2 - х2ух > 0.

Тепер розглянемо випадок, коли точка (х2; у2) знаходиться нижче від прямої, утвореної точками (0; 0) і (агг; у J (мал. 141, б). У цьому разі значення виразу х1г/2 - х2ух стає від'ємним, оскільки з малюнка 141, а видно, що значення координати у2 зменшилося, а решти координат не змінилося. Зазначимо, що

t (*2; Уг)

_ j

 

:

 

^

(0;0)

б)

250

для будь-якої точки 2; у2), Щ° знаходиться нижче від прямої, проведеної через точки (0; 0) і (xt't уг), знайдеться єдина точка 2; у'2), що лежить на цій прямій (мал. 141, б) і для якої вико­ нується умова хху' 2 - х2у1 = 0. Оскільки за побудовою у2 < у'2, то і

х±У2 ~ хіУ\ < °- Другий висновок, який є результатом наведених міркувань:

коли при переході від точки х; г/х) до точки (х2, у2) виконуєть­

ся

поворот за годинниковою стрілкою, то

 

має

місце умова

хгУ2

~ х2ух < 0.

 

 

 

 

 

 

 

 

 

Отриманий вираз хху2

- х2у1

в математиці називається век­

торним добутком векторів Д і р2, які мають початком одну і ту

саму точку (0; 0), а кінцями відповідно точки (х

х; ух) і 2;

у2).

Записується векторний добуток так:

 

 

 

 

 

 

 

РіХР2

УІУІ

 

~ Х1У2 х2У\-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Отже, знак векторного добутку векторів р1

і р2 так само, як і

знак різниці площ відповідних прямокутників хху2

і x2yv ви­

значає напрям повороту від точки (хх; ух) до точки 2; у2).

 

А якщо дивитися у точки

 

 

 

 

 

 

 

 

2; z/j) і 2; у2) не з початку ко­

 

У

| J/>

 

 

 

 

 

 

 

 

 

Уг

 

 

 

 

 

 

ординат (0; 0), а з будь-якої ін­

 

//

*: /

> Уг)\

 

 

 

 

 

шої довільної точки (мал. 142),

 

 

 

 

/

 

 

 

то якою буде залежність? Ви­

 

Уі

 

/

 

(ХіІУд

значимося з відповіддю на це

 

і / — — '"""

 

 

 

 

 

 

запитання наступним чином.

 

Уо

 

 

 

 

 

 

 

 

 

Якщо перенести початок ко­

 

 

:(«,;

 

І/о)

і

г "

Х

ординат у точку 0; у0), то за­

(0;0)

••^п

 

 

* ^ 2

*"Л

* ^

 

 

 

 

 

 

дача зведеться до попередньої,

 

 

Мал. 142

 

 

тобто ми дивитимемося

у за­

 

 

 

 

 

 

 

 

 

 

 

 

дані точки з початку координат, а для цього випадку залежність уже визначена. Однак при такому перенесенні системи коорди­ нат у точку 0; у0) необхідно перерахувати і координати зада­ них точок, оскільки відстань до них по осі Ох зменшиться на

значення х0, а по осі Оу - на у0. Таким чином, у випадку, коли ми

визначаємо напрям повороту від точки (х^, уг) до точки (х2; у2),

спостерігаючи за цією дією з точки (х0; у0), то необхідно аналізу­

вати знак виразу 1 - х0)(у2 -

у0) - (х2 - х0)(у1 - у0).

У векторному представленні це виглядатиме так:

(Рі-Ро)х2-Ро) =

= (х10 )(у2 0)-(х2- х0 )(г/! - у0 )•

Уі'Уо У2~Уо

 

Ця дуже важлива закономірність лежить в основі більшості задач обчислювальної геометрії.

251

Соседние файлы в папке Методи побудови алгоритмів та їх аналіз