Тріангуляція многокутникаУ обчислювальної геометрії тріангуляція многокутника — це розкладання полігональної області (простого многокутника) P на множину трикутників[1], тобто знаходження множини трикутників, які попарно не перетинаються і об'єднання яких дорівнює P. Тріангуляцію можна розглядати як спеціальний випадок плоского прямолінійного графу. Коли немає дірок або доданих точок, тріангуляція утворює максимальний зовніпланарний граф. Тріангуляція многокутника без додаткових вершинЗгодом був запропонований ряд алгоритмів для тріангуляції многокутника. Особливі випадкиДуже просто тріангулювати будь-який опуклий многокутник за лінійний час на віяло трикутників, якщо послідовно проводити діагоналі з однієї фіксованої вершини до всіх інших вершин. Загальна кількість способів тріангулювати опуклий n-кутник діагоналями, які не перетинаються буде (n–2)-ге число Каталана, яке дорівнює . Розв'язок був знайдений Леонардом Ейлером[2]. Монотонний многокутник може бути тріангульований за лінійний час за допомогою алгоритму А. Фурньє[en] і Д. Я. Монтуно[3], або алгоритмом Годфріда Туссена[en][4]. Метод відтину вухОдин із способів тріангуляції простого многокутника заснований на теоремі про два вуха, яка стверджує, що будь-який простий многокутник з не менш ніж чотирма вершинами без дірок має принаймні два «вуха», які є трикутниками, що можна відтяти, бо діагональ розташована повністю всередині многокутника[5]. Алгоритм зводиться до знаходження такого вуха, яке потім видаляється (це призводить до появи нового многокутника, який все ще відповідає наведеним умовам) і операція повторюється до тих пір, поки не залишиться тільки один трикутник. Цей алгоритм простий в реалізації, але він виконується повільніше ніж деякі інші алгоритми і можливий тільки для многокутників без дірок. Реалізація, яка зберігає окремі списки опуклих і увігнутих вершин, буде виконуватися за O(n2) час. Цей метод відомий як відтинання або відсікання вух. Ефективний алгоритм відсікання вух був запропонований Хоссама Ельгінді, Хейзелем Евереттом і Годфрідом Туссеном[en][6]. Тріангуляція монотонного многокутникаЛанцюг C складений з відрізків називається монотонним щодо прямої L, якщо кожна пряма, ортогональна L, перетинає C не більше одного разу. Ми називаємо такі ланцюги монотонними ланцюгами. многокутник P буде монотонним відносно прямої L, якщо його межу можна розбити на два ланцюги, кожен з яких монотонний щодо L. Ми називаємо такі многокутники монотонними многокутниками. Ми говоримо, що многокутник P є горизонтально монотонним (або x-монотонним), якщо P монотонний відносно осі х. Ми можемо тріангулювати монотонний многокутник за час, де n — кількість вершин монотонного многокутника. Алгоритм описаний у розділі 3.3 книги М. Берг та інші, «Обчислювальна геометрія: алгоритми і програми» (2-е видання). Розкладання простого многокутника на монотонні частиниЯкщо простий многокутник не є монотонним, його можна зробити монотонним за час , якщо використати алгоритм замітаючої прямої. Більш детально про це можна прочитати у розділі 3.2 книги М. Берг та інші, «Обчислювальна геометрія: алгоритми і програми» (2-е видання). Двоїстий граф тріангуляціїКорисний граф, який часто асоціюється з тріангуляцією многокутника P, це двоїстий граф. Тріангуляція TP многокутника P, визначає граф G(TP), множина вершин якого є трикутниками TP, причому дві вершини (трикутники) суміжні тоді і тільки тоді, коли відповідні їм трикутники мають спільну сторону. Легко помітити, що G(TP) є деревом з вершинами максимальної степені 3. Метод Фройденталя (тріангуляція Куна)Тріангуляція є розбиттям на симплекси цілого простору Для побудови увесь простір спочатку розбивається на куби, а потім кожний куб — на симплекси. Для того, щоб перебір симплексів був організований належним чином, кожній вершині тріангуляції присвоюється деяка мітка. Мітки можуть бути або векторами (із дійсними координатами) або (скалярними) цілими числами й називаються відповідно векторними або цілочисельними. Векторні мітки частіше є векторами вигляду де — вершина тріангуляції. Чим більше точок або променів, уздовж яких алгоритм може покидати точку початку пошуку, тим вище його обчислювальна ефективність. Велика кількість міток має й зворотну сторону: чим більше міток, тим більше часу потрібно для їх обчислення. Для того, щоб симпліційний алгоритм був достатньо швидким, обчислення використовуваних ним міток повинні бути ефективними. Ефективність обчислення міток може бути забезпечена регулярністю розташування променів, уздовж яких алгоритм може покидати точку початку пошуку[7][8]. Обчислювальна складністьДо 1988 року відкритим залишалось питання про те, чи можлива тріангуляція простого многокутника за час швидший ніж O(n log n)[1]. Поки Tarjan та Van Wyk, (1988) не знайшли алгоритм тріангуляції, який виконувався за час O(n log log n)[9], згодом спрощений Kirkpatrick, Klawe та Tarjan, (1992)[10]. Потім було декілька поліпшених методів зі складністю O(n log* n) (на практиці не відрізнялись від лінійного часу)[11][12][13]. У 1991 році Бернард Шазель[en] показав, що будь-який простий многокутник може бути тріангульований за лінійний час, хоча запропонований алгоритм був дуже складним[14]. Відомий також більш простий увипадковлений алгоритм з очікуваним лінійним часом виконання[15]. Алгоритм декомпозиції Зейделя і метод тріангуляції Шазеля детально обговорюються в Li та Klette, (2011)[16]. Часова складність алгоритму тріангуляції n-вершинного многокутника з дірками має нижню межу Ω(n log n)[1]. Пов'язані проблеми
Див. такожПримітки
Додаткові джерела
|