Материал: 252_337

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Визначення площі багатокутника

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

Площу трикутника, прямокутника, ромба можна визначити за відомими з математики формулами. А як бути, коли задано багатокутник на площині як опуклий, так і неопуклий? Коли опуклий, його можна розбити на трикутники, провівши діаго­ налі з будь-якої вершини до всіх решти, не суміжних з нею, визначити їхні площі, наприклад за формулою Герона, і знай­ ти їхню суму (мал. 143, а). А якщо він неопуклий, то такий підхід до розв'язання поставленої задачі не дасть позитивного результату (мал. 143, б). Спробуємо розв'язати задачу про ви­ значення площі багатокутника за допомогою тих ідей, які вже були розглянуті вище.

а)

б)

Мал. 143

Розглянемо довільний чотирикутник з вершинами у точках (Хі, ух), (х2; у2), (х3; у3), (*4; у4) (мал. 144). Якщо з кожної вер­ шини опустити вертикальні лінії на вісь Ох, то отримаємо точ­ ки (х\; 0), (х2; 0), (х3; 0), (х4; 0). Неважко помітити, що шукану площу заданого чотирикутника можна отримати так: від суми площ трапецій, зображених на малюнку 144, а, відняти суму площ трапецій, зображених на малюнку 144, б.

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

(и, +у9)(Хо-х,)

»

.

. . .

лою —J

 

—

 

***,

Аналогічно

представимо і площі інших

 

 

252

(x„; y2)

(x„; ya)

(0;0J

Мал. 144

трьох трапецій (мал. 144):

(Уа+УаУ(х8-хі) (Уя+У*)(х4-ха)

2

 

 

(У4+УІ)(ХІ-ХІ)

Варто обговорити принцип запису цих формул.

 

с

Як бачимо, у них використана певна послідовність розгляду вершин заданого чотирикутника: в порядку їх обходу за годин­ никовою стрілкою. Перші два вирази даватимуть у результаті обчислення додатні значення (х2 - хг > 0, х3 - х2 > 0), а другі два - від'ємні (х4 - х3 < 0, хг - х4 < 0). Отже, немає необхідності в інформації про те, площі яких трапецій необхідно додавати, а яких - віднімати. Всі їх треба лише додавати - це обумовлено порядком обходу вершин заданого багатокутника.

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

Виконавши алгебраїчні перетворення, отримаємо:

±((Уі+У2)(Х2-Хі) , (Уі+Уз)(Х3-Х2) J (У8 +У4)(*4-*з) , (У4+Уі)(хі-Х4)) =

= ± 2 К*гУі -*i%)+(хзУ2 - хгуг ) + (хіу3-х3у4) + (xty4 - хіу1 ))\

Чи не схожі доданки отриманої формули з виразами, що ви­ значають напрям повороту при обході багатокутника від кожної вершини {хі + j; г/. + -^ до його попередньої вершини (xt; yt)? Усі,

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

253

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

Отриману формулу можна представити у більш компактно­ му вигляді для я-кутника:

1 f"'1

л

& V 1=1

;

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

!/V.

S = ±2- І УМУІ + УіУп

Переходячи до мови програмування, представимо фрагмент Pascal-програми, що обчислює площу багатокутника, який за­ даний координатами своїх вершин у порядку їх обходу:

read(f _ in, п);

{Введення кількості вершин багатокутника.}

f o r і := 1 to П do

{Введення координат вершин багатокутника.}

read(f_in, х[і], у[і]);

s:=x[1]*y[n]-x[n]*y[1]; {Визначення початкового значення результату.}

for і := 1 to n - 1 do {Покрокове визначення площі багатокутника.}

s := s + (x[i + 1] * y[i] - x[i] * y[i + 1]);

writeln(f_OUt, abs(s)/2:0:5);

{Виведення остаточного результату.}

Оцінка роботи описаного алгоритму зрозуміла: для визна­ чення площі заданого багатокутника необхідно послідовно двічі розглянути всі його п вершин. Тому оцінка ефективності запропонованого алгоритму 0{п).

При тестуванні алгоритму обчислення площі багатокутни­ ка необхідно передбачити різні види багатокутників - опуклі, неопуклі, з невеликою кількістю вершин та з кількістю вер­ шин, близькою до 100. Для зручності перевірки правильності роботи алгоритму можна задати правильні багатокутники (мал. 145, в), починаючи з квадратів, площі яких неважко ви­ рахувати вручну (мал. 145, а, б). У якості неопуклого багато­ кутника можна дослідити багатокутник, сторони якого зуб­ часті (мал. 145, г), або подібні до такого.

 

у\

г/АЛЛ/И

 

 

W V W 1

х (0; 0)

х (0; 0)

х

в)

г)

 

Мал. 145

 

 

254

Цікавою є задача визначення напряму обходу опуклого багатокутника, заданого координатами своїх вершин. Відпо­ відь випливає із визначення напряму повороту при переході від точки (xt; yt) до точки (л;;.; і/;.).

А чи можна впорядкувати задані в довільному порядку вер­ шини опуклого багатокутника за певним напрямом його обхо­ ду? Так, можна, якщо підібрати таку їх послідовність, щоб знак виразу (xtyl+1 - xi+lyt) для будь-якої пари сусідніх вершин (xt; yt) і (хі+1; уі+і) не мінявся на протилежний.

Завдання

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

2.Розробити та реалізувати у вигляді програми алгоритм визна­ чення довжини відрізка, заданого двома точками (д:1; уг) і (х2; у2).

3.Розробити та реалізувати у вигляді програми алгоритм ви­ значення взаємного розміщення двох точок (Xj; у2) та (х2; у2).

4.Розробити та реалізувати у вигляді програми алгоритм ви­ значення взаємного розміщення двох прямих, кожна з яких задана координатами двох точок.

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

6.Розробити та реалізувати у вигляді програми алгоритм ви­ значення взаємного розміщення точки і відрізка.

7.Розробити та реалізувати у вигляді програми алгоритм ви­

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

8.Розробити та реалізувати у вигляді програми алгоритм ви­

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

9.Розробити та реалізувати у вигляді програми алгоритм ви­ значення площі багатокутника, заданого координатами вер­ шин у порядку їх обходу.

10.Виконати завдання 9 для опуклого багатокутника з кількістю вершин N < 10. Результат виконання програми вивести у файл.

11.Виконати завдання 9 для неопуклого багатокутника з кількістю вершин N ^ 10. Результат виконання програми вивести у файл.

12.Виконати завдання 9 для опуклого багатокутника з кіль­ кістю вершин N ^ 100. Результат виконання програми ви­ вести у файл.

255

13. Виконати завдання 9 для неопуклого багатокутника з кількістю вершин N < 100. Результат виконання програми вивести у файл.

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

І1. Які задачі розв'язує обчислювальна геометрія?

2.Як задається розміщення точки на площині і як вирішити питан­

ня точності такого задання?

3.Як можна однозначно задати пряму на площині?

4.Як задається відрізок прямої на площині і визначається його довжина?

5.Яким може бути взаємне розміщення двох точок на площині?

6.Як визначити взаємне розміщення двох прямих на площині?

7.Яким може бути взаємне розміщення точок і прямої на площині?

8.Яким є аналіз взаємного розміщення точки і відрізка?

9.Як визначити напрям повороту при переміщенні від однієї точки до іншої, якщо спостереження відбувається з початку координат (0; 0)? Обґрунтуйте свою відповідь.

10.Як визначити напрям повороту при переміщенні від однієї точки до іншої, якщо спостереження відбувається з будь-якої іншої довільної точки? Обґрунтуйте свою відповідь.

11.У чому полягає метод визначення площі багатокутника?

12.Якою є оцінка запропонованого методу визначення площі багатокутника?

13.Наведіть фрагмент реалізації алгоритму визначення площі багатокутника мовою програмування.

Перетин відрізків

Нехай на площині задані два відрізки відповідними коорди­

натами своїх кінців (Xp i/j), (х2; у2) і

(х3; у3 ), (х4; у4). їхнє

взаємне розміщення може бути різним.

Усі ці випадки зобра­

жено на малюнку 146, де для більшої наочності кінці заданих відрізків позначено відповідно рх, р2 ір3, р4. Розглянемо всі ці випадки і спробуємо визначити певну закономірність, яка буде слугувати ознакою перетину досліджуваних відрізків.

Проаналізувавши малюнок 146, а, можна зробити наступ­ ний висновок.

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

ку ps, то при цьому буде виконано поворот проти годинникової

стрілки.

Ознакою

такого повороту

буде

виконання умови

(Рг _ $і) х

(Рз ~ Pi) >

0- Якщо, дивлячись із точки рх у точку р2,

перевести погляд у точку р4, то при цьому буде виконано пово­

рот за годинниковою стрілкою: (р2 - рг) х (р4

- />1) < 0. Остаточ­

ний висновок буде таким: якщо кінцір3 \р4

відрізка лежать по

різні боки від

а з кінцями р1

і р2, то при цьому вико­

нується256 умова [(рвідрізк- ) х (р -/>!>] • [(р

~Рі) х (р ~Рі)] < °-

Источник: https://studfile.net/preview/14502490/