Алгоритм Бентлі — Оттманна в обчислювальній геометрії використовує метод замітання прямою для пошуку всіх точок перетину прямолінійних відрізків на площині. Він узагальнює алгоритм Шеймоса-Нойї, який задану множину відрізків перевіряв на наявність будь-якого перетину. Для вхідних даних, які містять відрізків, що мають переринів, алгоритм Бентлі — Оттманна виконується за час . У випадку, коли , його можна розглядати як удосконалення алгоритму повного перебору, який виконується за час .
Алгоритм був розроблений Джоном Бентлі та Томасом Оттманном у 1979 році. Більш детально він описаний у книгах Preparata та Shamos, (1985), O'Rourke, (1998), та de Berg та ін., (2000). Хоча й відомі асимптотично більш швідкі алгоритми, алгоритм Бентлі — Оттманна залишається затребуваним завдяки простоті та використанню низького об'єму пам'яті[].
Загальний опис
В алгоритмі застосовується метод замітання прямою (замітальною прямою, що рухається прямо, скануючи лінії; англ. sweeping line). У методі використовується вертикальна замітальна пряма, що рухається зліва направо, при цьому відрізки, які вона перетинає при даній координаті , можна впорядкувати за координатою , тим самим їх можна порівнювати між собою (котрий вище, котрий нижче). Це порівняння можна здійснити, наприклад, використовуючи рівняння прямої, що проходить через дві точки (відрізки задано двома своїми кінцевими точками): , де , і , — координати, відповідно, першої та другої точок відрізка. Замітальна пряма переміщається по так званим точкам подіям (лівим і правим кінцям відрізків, а також точкам перетину відрізків). Після точки перетину відрізки варто міняти місцями, оскільки, наприклад, самий верхній із відрізків, які перетинаються після точки перетину стає самим нижнім. Наведений нижче алгоритм не розрахований на випадок, коли два відрізки перетинаються більше, ніж в одній точці.
NB Замітальну пряму можна також представити як горизонтальну, що рухається згори до низу за координатою , і порівнювати відрізки, що її перетинають за координатою .
Обробка вертикальних відрізків
Виникає проблема з вертикальним відрізком у тому розумінні як його порівнювати на вище/нижче з відрізками, що перетинають. Для цього можна, наприклад, вважати, що якщо точка перетину вертикального з не вертикальним відрізків знаходиться нижче поточної координати точки події, то вертикальний відрізок знаходиться вище, якщо точка перетину вище поточної координати точки події, то вертикальний відрізок вважається нижче відрізка, що перетинає його. Якщо поточна координата дорівнює координаті точки події, то при видаленні відрізка вважати, що вертикальний відрізок нижче, а при вставленні вважати, що він вище.
Квадрат пам'яті
У гіршому випадку, коли, наприклад, усі відрізки, перетинаючись між собою, утворюють прямокутну сітку, буде точок перетину, які потрібно буде зберігати. Щоб уникнути використання квадрата пам'яті в алгоритмі, можна видаляти точку перетину відрізків, котрі тимчасово перестають бути сусідніми при даному положенні замітальною прямою. Ці точки все рівно будуть знову знайдені при подальших кроках алгоритму, коли дані відрізки знову стануть сусідніми (Печ, Шерір 1991).
Алгоритм
У наведеному нижче псевдокоді використовуються:
- Q — динамічні структура даних без повторень з логарифмічним часом пошуку, вставки, видалення точок подій і пошуку мінімального елемента (наприклад, червоно-чорне дерево, ).
- T — динамічні структура даних без повторень з логарифмічним часом пошуку, вставки, видалення відрізків. У ній зберігаються всі відрізки, що перетинають замітальну пряму (наприклад, червоно-чорне дерево, 2-3-дерево).
- q — точка події.
- newq — щойно знайдена точка перетину відрізків, точка події.
- L(q) — безліч відрізків, лівий кінець яких — q (для вертикальних відрізків лівим вважається нижній кінець).
- R(q) — безліч відрізків, правим кінцем яких є q.
- I(q) — безліч відрізків, що перетинаються в q.
segmentsIntersections(points[]) 1) Ініціалізуються Q і T. До Q заносяться всі кінці відрізків, впорядковані за координатою x, при цьому, якщо дві точки збігаються, то ліва кінцева точка відрізка поміщається перед правою. Якщо збігаються лише x, то точка з меншим y є меншою. T ← ∅ 2) while Q != ∅ q ← min(Q); processPoint(q);
processPoint(q) 1) Знайти в Q всі відрізки, які містять q; // вони в Q будуть сусідніми, оскільки точки події, що містяться в цих відрізках, мають однакові координати; 2) if (|L(q)| + |R(q)| + |I(q)| > 1) АБО (|I(q)| > 0) then Видати у відповідь точку q; 3) if (|I(q)| = 0) І (|L(q)|+|R(q)| > 0) // у точці, яка розглядається, всі відрізки лише починаються або закінчуються; then I(q) ← I(q) ∪ L(q) ∪ R(q); // додати в I(q) L(q) і R(q) 4) Видалити з T R(q) і I(q); 5) Вставити в T I(q) і L(q); // із T були видалені всі відрізки з безліччю I(q), тепер же вставляються назад у зміненому порядку після точки перетину; 6) if (L(q)∪I(q) = ∅) АБО (|I(q)| = |R(q)| - 1) then Знайти в T верхнього та нижнього сусідів q su і sl; newq = findIntersect(su, sl); if newq != NULL then add(Q, newq); 7) else Нехай s′ — самий верхній відрізок із L(q)∪I(q); Нехай su — верхній сусід s′ в T; Нехай s′′ — самий нижній відрізок із L(q)∪ I(q); Нехай sl — нижній сусід s′′ в T; newq = findIntersect(su, s′); if newq != NULL then add(Q, newq); newq = findIntersect(sl, s′′); if newq != NULL then add(Q, newq); // далі прибираємо квадрат пам'яті; newq = findIntersect(sl, su); if newq != NULL then delete(Q, newq); newq = findIntersect(s′′, su); if newq != NULL then delete(Q, newq); newq = findIntersect(sl, s′); if newq != NULL then delete(Q, newq);
findIntersect(sl, su) if sl і su перетинаються праворуч від замітальної прямої (або на замітальній прямій вище поточної точки подій) then return newq; else return NULL;
Аналіз
Нехай — число відрізків, — число відрізків, що перетинають точку . Тоді час на ініціалізацію Q дорівнює , на ініціалізацію T — . На пошук усіх відрізків, що проходять через точку і оновлення Q, потрібно часу. На оновлення T також часу. Сумарно: , де — число точок перетину . .
Пам'ять , завдяки тому, що віддаляються точки перетину відрізків, котрі перестали бути сусідніми, інакше було б , де .
Примітки
- Прапарата Ф., Шеймос М. Обчислювальна геометрія: Вступ = Computational Geometry An introduction. — М. : Мир, 1989. — 478 с.
- Ласло М. Обчислювальна геометрія та комп'ютерна графіка на C++. — М. : БИНОМ, 1997. — 304 с.
Література
- Берг М., Чеонг О., Кревельд М., Овермарс М. Вычислительная геометрия. Алгоритмы и приложения = Computational Geometry: Algorithms and Applications. — М. : ДМК-Пресс, 2016. — 438 с. — .
- Mark de Berg, Marc van Kreveld, Mark Overmars, Otfried Schwarzkopf. Computational Geometry: Algorithms and Applications. — Springer, 2000. — 368 с.
- Прапарата Ф., Шеймос М. Вычислительная геометрия: Введение = Computational Geometry An introduction. — М. : Мир, 1989. — 478 с.
- Ласло М. Вычислительная геометрия и компьютерная графика на C++. — М. : БИНОМ, 1997. — 304 с.
- Т. Кормен, Ч. Лейзерсон, Р. Рівест, К. Штайн. Алгоритми. Побудова й аналіз = Introduction to Algorithms. — 2-e вид. — “Вільямс”, 2005. — 1296 с.
- Balaban, I. J. (1995), An optimal algorithm for finding segments intersections, Proc. 11th ACM Symp. Computational Geometry, с. 211—219, doi:10.1145/220279.220302.
- Bartuschka, U.; Mehlhorn, K.; Näher, S. (1997), , у ; Orlando, S. (ред.), Proc. Worksh. Algorithm Engineering, архів оригіналу за 6 червня 2017, процитовано 23 листопада 2018.
- ; Ottmann, T. A. (1979), Algorithms for reporting and counting geometric intersections, IEEE Transactions on Computers, C-28 (9): 643—647, doi:10.1109/TC.1979.1675432.
- de Berg, Mark; van Kreveld, Marc; Overmars, Mark; Schwarzkopf, Otfried (2000), Chapter 2: Line segment intersection, Computational Geometry (вид. 2nd), Springer-Verlag, с. 19–44, ISBN .
- Boissonat, J.-D.; (2000), (PDF), SIAM Journal on Computing, 29 (5): 1401—1421, doi:10.1137/S0097539797329373, архів оригіналу (PDF) за 29 серпня 2008, процитовано 23 листопада 2018.
- Brown, K. Q. (1981), Comments on "Algorithms for Reporting and Counting Geometric Intersections", IEEE Transactions on Computers, C-30 (2): 147, doi:10.1109/tc.1981.6312179.
- ; (1992), An optimal algorithm for intersecting line segments in the plane, , 39 (1): 1—54, doi:10.1145/147508.147511.
- Chen, E. Y.; (2003), A space-efficient algorithm for segment intersection, (PDF), архів оригіналу (PDF) за 23 липня 2007, процитовано 23 листопада 2018.
- (1988), Applications of random sampling in computational geometry, II, Proc. 4th ACM Symp. Computational Geometry, с. 1—11, doi:10.1145/73393.73394.
- ; Cole, R.; Tarjan, R. E. (1992), Randomized parallel algorithms for trapezoidal diagrams, , 2 (2): 117—133, doi:10.1142/S0218195992000081. Corrigendum, 2 (3): 341–343.
- Eppstein, D.; ; Strash, D. (2009), Linear-time algorithms for geometric graphs with sublinearly many crossings, Proc. 20th ACM-SIAM Symp. Discrete Algorithms (SODA 2009), с. 150—159, arXiv:0812.0893, Bibcode:2008arXiv0812.0893E.
- (1988), A fast planar partition algorithm, I, , с. 580—589, doi:10.1109/SFCS.1988.21974.
- (1998), Section 7.7: Intersection of segments, Computational Geometry in C (вид. 2nd), Cambridge University Press, с. 263—265, ISBN .
- ; (1985), Section 7.2.3: Intersection of line segments, Computational Geometry: An Introduction, Springer-Verlag, с. 278—287.
- ; (1991), On vertical visibility in arrangements of segments and the queue size in the Bentley–Ottmann line sweeping algorithm, SIAM Journal on Computing, 20 (3): 460—470, doi:10.1137/0220029, MR 1094525.
- ; Hoey, Dan (1976), Geometric intersection problems, , с. 208—215, doi:10.1109/SFCS.1976.16.
Посилання
- — окремий випадок (алгоритм Шеймоса — Гоя, 1976 (Визначення наявності відрізків, що перетинаються)).
- Smid, Michiel (2003), (PDF), архів оригіналу (PDF) за 21 червня 2006, процитовано 23 листопада 2018
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Algoritm Bentli Ottmanna v obchislyuvalnij geometriyi vikoristovuye metod zamitannya pryamoyu dlya poshuku vsih tochok peretinu pryamolinijnih vidrizkiv na ploshini Vin uzagalnyuye algoritm Shejmosa Nojyi yakij zadanu mnozhinu vidrizkiv pereviryav na nayavnist bud yakogo peretinu Dlya vhidnih danih yaki mistyat n displaystyle n vidrizkiv sho mayut k displaystyle k pereriniv algoritm Bentli Ottmanna vikonuyetsya za chas O n k log n displaystyle mathcal O n k log n U vipadku koli k o n 2 log n displaystyle k mathcal o left frac n 2 log n right jogo mozhna rozglyadati yak udoskonalennya algoritmu povnogo pereboru yakij vikonuyetsya za chas 8 n 2 displaystyle Theta n 2 Peretin vidrizkiv O n k log n displaystyle O left left n k right log n right Algoritm buv rozroblenij Dzhonom Bentli ta Tomasom Ottmannom u 1979 roci Bilsh detalno vin opisanij u knigah Preparata ta Shamos 1985 O Rourke 1998 ta de Berg ta in 2000 Hocha j vidomi asimptotichno bilsh shvidki algoritmi algoritm Bentli Ottmanna zalishayetsya zatrebuvanim zavdyaki prostoti ta vikoristannyu nizkogo ob yemu pam yati dzherelo Zagalnij opisV algoritmi zastosovuyetsya metod zamitannya pryamoyu zamitalnoyu pryamoyu sho ruhayetsya pryamo skanuyuchi liniyi angl sweeping line U metodi vikoristovuyetsya vertikalna zamitalna pryama sho ruhayetsya zliva napravo pri comu vidrizki yaki vona peretinaye pri danij koordinati x displaystyle x mozhna vporyadkuvati za koordinatoyu y displaystyle y tim samim yih mozhna porivnyuvati mizh soboyu kotrij vishe kotrij nizhche Ce porivnyannya mozhna zdijsniti napriklad vikoristovuyuchi rivnyannya pryamoyi sho prohodit cherez dvi tochki vidrizki zadano dvoma svoyimi kincevimi tochkami x x 1 x 2 x 1 y y 1 y 2 y 1 displaystyle left x x 1 right left x 2 x 1 right left y y 1 right left y 2 y 1 right de x 1 displaystyle x 1 y 1 displaystyle y 1 i x 2 displaystyle x 2 y 2 displaystyle y 2 koordinati vidpovidno pershoyi ta drugoyi tochok vidrizka Zamitalna pryama peremishayetsya po tak zvanim tochkam podiyam livim i pravim kincyam vidrizkiv a takozh tochkam peretinu vidrizkiv Pislya tochki peretinu vidrizki varto minyati miscyami oskilki napriklad samij verhnij iz vidrizkiv yaki peretinayutsya pislya tochki peretinu staye samim nizhnim Navedenij nizhche algoritm ne rozrahovanij na vipadok koli dva vidrizki peretinayutsya bilshe nizh v odnij tochci NB Zamitalnu pryamu mozhna takozh predstaviti yak gorizontalnu sho ruhayetsya zgori do nizu za koordinatoyu y displaystyle y i porivnyuvati vidrizki sho yiyi peretinayut za koordinatoyu x displaystyle x Obrobka vertikalnih vidrizkivVinikaye problema z vertikalnim vidrizkom u tomu rozuminni yak jogo porivnyuvati na vishe nizhche z vidrizkami sho peretinayut Dlya cogo mozhna napriklad vvazhati sho yaksho tochka peretinu vertikalnogo z ne vertikalnim vidrizkiv znahoditsya nizhche potochnoyi koordinati y displaystyle y tochki podiyi to vertikalnij vidrizok znahoditsya vishe yaksho tochka peretinu vishe potochnoyi koordinati y displaystyle y tochki podiyi to vertikalnij vidrizok vvazhayetsya nizhche vidrizka sho peretinaye jogo Yaksho potochna koordinata y displaystyle y dorivnyuye koordinati y displaystyle y tochki podiyi to pri vidalenni vidrizka vvazhati sho vertikalnij vidrizok nizhche a pri vstavlenni vvazhati sho vin vishe Kvadrat pam yatiU girshomu vipadku koli napriklad usi vidrizki peretinayuchis mizh soboyu utvoryuyut pryamokutnu sitku bude O n 2 displaystyle O left n 2 right tochok peretinu yaki potribno bude zberigati Shob uniknuti vikoristannya kvadrata pam yati v algoritmi mozhna vidalyati tochku peretinu vidrizkiv kotri timchasovo perestayut buti susidnimi pri danomu polozhenni zamitalnoyu pryamoyu Ci tochki vse rivno budut znovu znajdeni pri podalshih krokah algoritmu koli dani vidrizki znovu stanut susidnimi Pech Sherir 1991 AlgoritmU navedenomu nizhche psevdokodi vikoristovuyutsya Q dinamichni struktura danih bez povtoren z logarifmichnim chasom poshuku vstavki vidalennya tochok podij i poshuku minimalnogo elementa napriklad chervono chorne derevo T dinamichni struktura danih bez povtoren z logarifmichnim chasom poshuku vstavki vidalennya vidrizkiv U nij zberigayutsya vsi vidrizki sho peretinayut zamitalnu pryamu napriklad chervono chorne derevo 2 3 derevo q tochka podiyi newq shojno znajdena tochka peretinu vidrizkiv tochka podiyi L q bezlich vidrizkiv livij kinec yakih q dlya vertikalnih vidrizkiv livim vvazhayetsya nizhnij kinec R q bezlich vidrizkiv pravim kincem yakih ye q I q bezlich vidrizkiv sho peretinayutsya v q segmentsIntersections points 1 Inicializuyutsya Q i T Do Q zanosyatsya vsi kinci vidrizkiv vporyadkovani za koordinatoyu x pri comu yaksho dvi tochki zbigayutsya to liva kinceva tochka vidrizka pomishayetsya pered pravoyu Yaksho zbigayutsya lishe x to tochka z menshim y ye menshoyu T 2 while Q q min Q processPoint q processPoint q 1 Znajti v Q vsi vidrizki yaki mistyat q voni v Q budut susidnimi oskilki tochki podiyi sho mistyatsya v cih vidrizkah mayut odnakovi koordinati 2 if L q R q I q gt 1 ABO I q gt 0 then Vidati u vidpovid tochku q 3 if I q 0 I L q R q gt 0 u tochci yaka rozglyadayetsya vsi vidrizki lishe pochinayutsya abo zakinchuyutsya then I q I q L q R q dodati v I q L q i R q 4 Vidaliti z T R q i I q 5 Vstaviti v T I q i L q iz T buli vidaleni vsi vidrizki z bezlichchyu I q teper zhe vstavlyayutsya nazad u zminenomu poryadku pislya tochki peretinu 6 if L q I q ABO I q R q 1 then Znajti v T verhnogo ta nizhnogo susidiv q su i sl newq findIntersect su sl if newq NULL then add Q newq 7 else Nehaj s samij verhnij vidrizok iz L q I q Nehaj su verhnij susid s v T Nehaj s samij nizhnij vidrizok iz L q I q Nehaj sl nizhnij susid s v T newq findIntersect su s if newq NULL then add Q newq newq findIntersect sl s if newq NULL then add Q newq dali pribirayemo kvadrat pam yati newq findIntersect sl su if newq NULL then delete Q newq newq findIntersect s su if newq NULL then delete Q newq newq findIntersect sl s if newq NULL then delete Q newq findIntersect sl su if sl i su peretinayutsya pravoruch vid zamitalnoyi pryamoyi abo na zamitalnij pryamij vishe potochnoyi tochki podij then return newq else return NULL AnalizNehaj n displaystyle n chislo vidrizkiv m q displaystyle m left q right chislo vidrizkiv sho peretinayut tochku q displaystyle q Todi chas na inicializaciyu Q dorivnyuye O n log n displaystyle O left n log n right na inicializaciyu T O 1 displaystyle O left 1 right Na poshuk usih vidrizkiv sho prohodyat cherez tochku q displaystyle q i onovlennya Q potribno O m q log n displaystyle O left m left q right log n right chasu Na onovlennya T takozh O m q log n displaystyle O left m left q right log n right chasu Sumarno O n log n m q log n O n log n log n m q O n k log n displaystyle O left n log n sum m left q right log n right O left n log n log n sum m left q right right O left left n k right log n right de k displaystyle k chislo tochok peretinu m q O n k displaystyle left sum m left q right O left n k right right k O n 2 displaystyle k O left n 2 right Pam yat O n displaystyle O left n right zavdyaki tomu sho viddalyayutsya tochki peretinu vidrizkiv kotri perestali buti susidnimi inakshe bulo b O n k displaystyle O left n k right de k O n 2 displaystyle k O left n 2 right PrimitkiPraparata F Shejmos M Obchislyuvalna geometriya Vstup Computational Geometry An introduction M Mir 1989 478 s Laslo M Obchislyuvalna geometriya ta komp yuterna grafika na C M BINOM 1997 304 s LiteraturaBerg M Cheong O Kreveld M Overmars M Vychislitelnaya geometriya Algoritmy i prilozheniya Computational Geometry Algorithms and Applications M DMK Press 2016 438 s ISBN 978 5 97060 406 9 Mark de Berg Marc van Kreveld Mark Overmars Otfried Schwarzkopf Computational Geometry Algorithms and Applications Springer 2000 368 s Praparata F Shejmos M Vychislitelnaya geometriya Vvedenie Computational Geometry An introduction M Mir 1989 478 s Laslo M Vychislitelnaya geometriya i kompyuternaya grafika na C M BINOM 1997 304 s T Kormen Ch Lejzerson R Rivest K Shtajn Algoritmi Pobudova j analiz Introduction to Algorithms 2 e vid Vilyams 2005 1296 s Balaban I J 1995 An optimal algorithm for finding segments intersections Proc 11th ACM Symp Computational Geometry s 211 219 doi 10 1145 220279 220302 Bartuschka U Mehlhorn K Naher S 1997 u Orlando S red Proc Worksh Algorithm Engineering arhiv originalu za 6 chervnya 2017 procitovano 23 listopada 2018 Ottmann T A 1979 Algorithms for reporting and counting geometric intersections IEEE Transactions on Computers C 28 9 643 647 doi 10 1109 TC 1979 1675432 de Berg Mark van Kreveld Marc Overmars Mark Schwarzkopf Otfried 2000 Chapter 2 Line segment intersection Computational Geometry vid 2nd Springer Verlag s 19 44 ISBN 978 3 540 65620 3 Boissonat J D 2000 PDF SIAM Journal on Computing 29 5 1401 1421 doi 10 1137 S0097539797329373 arhiv originalu PDF za 29 serpnya 2008 procitovano 23 listopada 2018 Brown K Q 1981 Comments on Algorithms for Reporting and Counting Geometric Intersections IEEE Transactions on Computers C 30 2 147 doi 10 1109 tc 1981 6312179 1992 An optimal algorithm for intersecting line segments in the plane 39 1 1 54 doi 10 1145 147508 147511 Chen E Y 2003 A space efficient algorithm for segment intersection PDF arhiv originalu PDF za 23 lipnya 2007 procitovano 23 listopada 2018 1988 Applications of random sampling in computational geometry II Proc 4th ACM Symp Computational Geometry s 1 11 doi 10 1145 73393 73394 Cole R Tarjan R E 1992 Randomized parallel algorithms for trapezoidal diagrams 2 2 117 133 doi 10 1142 S0218195992000081 Corrigendum 2 3 341 343 Eppstein D Strash D 2009 Linear time algorithms for geometric graphs with sublinearly many crossings Proc 20th ACM SIAM Symp Discrete Algorithms SODA 2009 s 150 159 arXiv 0812 0893 Bibcode 2008arXiv0812 0893E 1988 A fast planar partition algorithm I s 580 589 doi 10 1109 SFCS 1988 21974 1998 Section 7 7 Intersection of segments Computational Geometry in C vid 2nd Cambridge University Press s 263 265 ISBN 978 0 521 64976 6 1985 Section 7 2 3 Intersection of line segments Computational Geometry An Introduction Springer Verlag s 278 287 1991 On vertical visibility in arrangements of segments and the queue size in the Bentley Ottmann line sweeping algorithm SIAM Journal on Computing 20 3 460 470 doi 10 1137 0220029 MR 1094525 Hoey Dan 1976 Geometric intersection problems s 208 215 doi 10 1109 SFCS 1976 16 Posilannya okremij vipadok algoritm Shejmosa Goya 1976 Viznachennya nayavnosti vidrizkiv sho peretinayutsya Smid Michiel 2003 PDF arhiv originalu PDF za 21 chervnya 2006 procitovano 23 listopada 2018