Изменения

Перейти к: навигация, поиск

Диаграмма Вороного

13 648 байт добавлено, 19:26, 4 сентября 2022
м
rollbackEdits.php mass rollback
{{В разработке}}== Определения ===== Совсем неформальное определение ===[[Файл:voronoi-diagram.png|200px|thumb|right|Пример диаграммы Вороного]]Пусть есть карта города, на которой точками обозначены почтовые отделения. Человек хочет отправить письмо, и он пойдёт на ближайшую почту. Ему интересно знать, какое отделение ближе, для любой точки города — необходимость отправить письмо может наступить неожиданно. Для этого он может взять карту и расчертить её на ячейки так, чтобы внутри каждой ячейки находилось только одно отделение, а для всех остальных точек ячейки именно эта почта была ближайшей. Полученная картинка и будет диаграммой Вороного для точек-почт.
== Определения ==
=== Неформальное определение ===
[[Файл:voronoi-diagram.png|200px|thumb|right|Пример диаграмы Вороного]]Есть множество точек <tex>P</tex> на плоскости. Для всех Кусочек плоскости из точек <tex>q \notin P</tex> этой плоскости узнаем ближайшую к такой, что для всех <tex>q</tex> точку ближайшей точкой из множества <tex>P</tex>. Таким образом получим разбиение плоскости на кусочки, в каждом из которых содержится является одна и та же точка <tex>p_ip</tex> из <tex>P</tex> и все , называется ячейкой Вороного точки <tex>qp</tex>, . Разбиение плоскости на такие ячейки для которых всех точек <tex>p_i\in P</tex> — ближайшая среди точек из называется диаграммой Вороного для множества <tex>P</tex>.
=== Формальное определение ===
<tex>P = \{ p_1, p_2, ..., p_n\}</tex> — множество точек на плоскости. Назовём их  {{Определение|definition=<tex>p_i \in P</tex> называется '''сайтамисайтом''' (''site'').}}
{{Определение
|definition='''Диаграмма Ячейка Вороного''' (''Voronoi diagramcell'', <tex>Vor\mathcal{V}(Pp_i)</tex>) для сайтов — множество точек плоскости <tex>P = \{ p_1, p_2, ..., p_n\}q</tex> на плоскости — это разбиение плоскости на таких, что для фиксированного сайта <tex>np_i</tex> ячеек ('''ячейка Вороного''', ''Voronoi cell'', и любых других сайтов <tex>p_j \mathcal{V}(p_i)in P, \ j \neq i</tex>), по одной для каждого сайта, которые обладают свойством: верно неравенство <tex>\rho(q, p_i) < \rho(q, p_j)</tex> для всех <tex>p_j \in P, \ j \neq i</tex>.
}}
{{Определение
|definition='''Диаграмма Вороного''' (''Voronoi diagram'', <tex>Vor(P)</tex>) для сайтов <tex>P = \{ p_1, p_2, ..., p_n\}</tex> на плоскости — это разбиение плоскости на ячейки Вороного для каждого сайта из <tex>P</tex>.
}}
 
В зависимости от контекста будем называть диаграммой Вороного как разбиение на ячейки, так и [[Основные определения теории графов|граф]] из вершин и рёбер, составляющих эти ячейки.
== Свойства ==
=== Связь с пересечением полуплоскостей ===Возьмём две точки плоскости: <tex>p</tex> и <tex>q</tex>. Проведём серединный перпендикуляр к отрезку <tex>pq</tex>; полученную полуплоскость, которая содержит в себе <tex>p</tex>, обозначим <tex>h(p, q)</tex>, другую — <tex>h(q, p)</tex>. Заметим, что для точки <tex>r</tex> выполняется <tex>r \in h(p, q)</tex> тогда и только тогда, когда <tex>\rho(r, p) < \rho(r, q)</tex>. Отсюда вытекает следующее:
{{Утверждение
|id=intersect|statement=<tex>\mathcal{V}(p_i) = \cap_bigcap\limits_{1 \leqslant j \leqslant n, j \neq i} h(p_i, p_j)</tex>
}}
Отсюда получаем, что ячейка Вороного — это пересечение <tex>n - 1</tex> полуплоскостей, и поэтому представляет собой (возможно, неограниченную) открытую выпуклую область с не более чем <tex>n - 1</tex> вершинами и <tex>n - 1</tex> рёбрами.
==Обозначения и определения= Топология диаграммы Вороного ==='''Сайт''' {{Теорема|statement=Пусть <tex>P</tex> — множество из <tex>n</tex> сайтов. Если они все лежат на одной прямой, то <tex>Vor(''site''P) {{</tex> представляет собой <tex>n ---}} общее название для точки 1</tex> параллельную прямую. Иначе <tex>pVor(P)</tex> или замкнутого отрезка связная и все её рёбра — либо отрезки, либо лучи.|proof=[[Файл:voronoi-not-lines.png|200px|right]] В случае, если все сайты лежат на одной прямой, каждая пара соседних сайтов порождает серединный перпендикуляр к отрезку, содержащему их, и, соответственно, к прямой, которая содержит все сайты. Так получаются <tex>tn - 1</tex>прямая, каждая из которых перпендикулярна прямой, содержащей сайты, а значит, эти прямые параллельны.
Рассмотрим теперь случай, когда сайты не лежат на одной прямой. Покажем, что рёбра — это отрезки или лучи, от противного. Предположим, что есть ребро <tex>e</tex>, являющееся прямой. Пусть оно — граница ячеек <tex>t^\circmathcal{V}(p_i)</tex> и <tex>\mathcal{{---V}} внутренняя (p_j)</tex>. Пусть точка <tex>p_k \in P</tex> не лежит на прямой <tex>p_i p_j</tex> (по условию такая точка существует). Тогда серединный перпендикуляр к <tex>p_j p_k</tex> не параллелен <tex>e</tex>, и, значит, он его пересекает. Но тогда та часть отрезка. Внутренность точки {<tex>e</tex>, что лежит в <tex>h(p_k, p_j)</tex>, не может быть границей <tex>\mathcal{---V}} пустое множество(p_j)</tex>, потому что она ближе к <tex>p_k</tex>, чем к <tex>p_j</tex>. Пришли к противоречию.
Два замкнутых пересекающихся сайта '''слабо пересекаются''' (''weakly intersect'')Докажем теперь, что диаграмма связна. Предположим, что это не так. Тогда на её рёбрах найдутся две точки <tex>s</tex> и <tex>t</tex>, между которыми нет пути по рёбрам диаграммы. Рассмотрим отрезок <tex>st</tex>. Он пересекает некоторое количество ячеек диаграммы. Пусть он пересекает какую-то ячейку в точках <tex>a</tex> и <tex>b</tex>. От точки <tex>a</tex> до точки <tex>b</tex> можно добраться по рёбрам тогда и только тогда, когда ячейка связна. Раз пути из <tex>s</tex> в <tex>t</tex> нет, то какая-то из ячеек, пересекаемых отрезком <tex>st</tex>, несвязная. Это возможно, только если точка их пересечения она представляет собой полосу, ограниченную двумя параллельными прямыми. Но в нашем случае в диаграмме не принадлежит их внутренностямможет быть прямых, то есть они касаются концамипришли к противоречию.
Два сайта '''сильно пересекаются''' (''strongly intersect''), если точка их пересечения принадлежит внутренности хотя бы одного из данных сайтов[[Файл:voronoi-connected.png|500px]]}}
Расстояние от точки === Размер структуры ==={{Теорема|statement=Для <tex>x n \in geqslant 3</tex> сайтов диаграмма Вороного содержит не больше <tex>2n - 5</tex> вершин и <tex> 3n - 6</tex> рёбер.|proof=[[Файл:voronoi-infinite-vertex.png|200px|right]]Для случая сайтов, лежащих на одной прямой, утверждение напрямую следует из вида диаграммы для этого случая, поэтому рассмотрим общий случай. По [[Формула Эйлера|формуле Эйлера]] <tex>v - e + f = 2</tex>, где <tex>v</tex> — число вершин, <tex>e</tex> — число рёбер и <tex>f</tex> — число граней связного планарного графа. Мы не можем сразу применить эту формулу к <tex>Vor(P)</tex>, потому что в этом графе есть полубесконечные рёбра. Поэтому добавим вершину <tex>v_\mathbb{E}^infty</tex>, и все полубесконечные рёбра мы превратим в рёбра, инцидентные ей. Таким образом мы увеличили число вершин на одну, а число рёбер не изменилось. Число граней равно <tex>n</tex> по определению диаграммы Вороного. Тогда по формуле Эйлера получаем <tex>(v + 1) - e + n = 2</tex> до замкнутого сайта .Сумма степеней всех вершин полученного графа равна <tex>S_i2e</tex>: , так как у каждого ребра есть ровно два конца (нет петель). Также из каждой вершины исходят как минимум три ребра. Отсюда получаем <tex>2e \deltageqslant 3 (x, S_iv + 1) = </tex>.Домножим равенство на два и вычтем из него полученную нижнюю границу для <tex>2 \min{cdot e</tex>, в результате получим <tex> v \{||x leqslant 2n - y|| : y 5</tex>. Далее подставим этот результат в равенство и получим <tex>e \in S_i\}}leqslant 3n - 6</tex>, что и требовалось доказать.}}
Пусть === Связь с триангуляцией Делоне ==={{Определение|definition='''Наибольшая пустая окружность''' точки <tex>H_{ij} = \{x \in \mathbb{E}^2 : \delta(x, S_i) \le \delta(x, S_j)\}q</tex> по отношению к <tex>P</tex>. (''largest empty circle of 'Ячейка Вороного'<tex>q</tex>'' (with respect to ''Voronoi cell'') <tex>VP</tex>, <tex>C_P(S_i, \Sigmaq)</tex> {{---}} множество точек, которые находятся ближе к ) — наибольшая окружность с центром в <tex>S_iq</tex>такая, чем к любому другому сайту, то есть что во внутренности соответствующего ей круга не лежит ни одного сайта из <tex>V(S_i, \Sigma) = \cap_{i \ne j}H_{ij}P</tex>.}}
'''Ребро {{Лемма|statement=Точка <tex>q</tex> — вершина диаграммы Вороного''' в том и только в том случае, когда <tex>C_P(q)</tex> содержит три и более сайтов на своей границе.|proof=Предположим, что <tex>q</tex> существует, а <tex>p_i, \ p_j, \ p_k</tex> — соответствующие точки. Так как внутри <tex>C_P(q)</tex> нет других сайтов, а <tex>q</tex> равноудалена от точек <tex>p_i, \ p_j, \ p_k</tex>, <tex>q</tex> должна быть на границе <tex>\mathcal{V}(p_i), \ \mathcal{V}(p_j), \ \mathcal{V}(p_k)</tex> одновременно, то есть вершиной диаграммы.Докажем в другую сторону: каждая вершина <tex>q</tex> диаграммы инцидентна минимум трём рёбрам, и, поэтому, как минимум трём ячейкам <tex>\mathcal{V}(''Voronoi edge''p_i) , \ \mathcal{V}(p_j), \ \mathcal{---V}(p_k)</tex>. Тогда <tex>q</tex> лежит на равном расстоянии от <tex>p_i, \ p_j, \ p_k</tex> и не может быть другого сайта ближе к <tex>q</tex>, так как иначе <tex>\mathcal{V} связное множество точек(p_i), \ \mathcal{V}(p_j), \ \mathcal{V}(p_k)</tex> не сойдутся в <tex>q</tex>. Поэтому можно построить окружность с центром в <tex>q</tex> и <tex>p_i, \ p_j, \ p_k</tex> на границе так, принадлежащих пересечению ровно двух ячеек Вороногочто внутри не будет других сайтов.}}
'''Вершина {{Лемма|statement=Серединный перпендикуляр к отрезку <tex>p_i p_j</tex> образует ребро диаграммы Вороного''' в том и только в том случае, если на нём есть точка <tex>q</tex> такая, что <tex>C_P(''Voronoi vertex''q) {{</tex> содержит на своей границе только сайты <tex>p_i, \ p_j</tex>.|proof=[[Файл:voronoi---}} точкаcircles.png|200px|right]]Предположим, что <tex>q</tex> существует. Тогда, так как <tex>C_P(q)</tex> не содержит в себе сайтов и содержит <tex>p_i, \ p_j</tex> на границе, <tex> \rho(q, p_i) = \rho(q, p_j) \leqslant \rho(q, p_k), \ 1 \leqslant k \leqslant n</tex>. Отсюда выходит, что <tex>q</tex> — вершина <tex>Vor(P)</tex> или лежит на ребре диаграммы. Но по предыдущей лемме выходит, что <tex>q</tex> не может быть вершиной диаграммы. Значит, она лежит на ребре, которая принадлежит хотя бы трём ячейкам Вороногозаданном серединным перпендикуляром к <tex>p_i p_j</tex>.
'''Диаграмма Вороного''' Докажем в другую сторону: пусть серединный перпендикуляр к <tex>p_i p_j</tex> задаёт ребро диаграммы. Наибольшая пустая окружность любой точки <tex>q</tex> на этом ребре должна содержать на границе <tex>p_i</tex> и <tex>p_j</tex> (''Voronoi diagram'') так как <tex>q</tex> равноудалена от <tex>V(\Sigma)p_i</tex> множества сайтов и <tex>\Sigmap_j</tex> {{---}} разбиение плоскости ). Также эта окружность не должна содержать никаких других сайтов на вершиныгранице, рёбра и ячейки Вороноготак как тогда она не является вершиной.}}
'''1-каркас''' {{Теорема|statement=Если соединить все сайты, соответствующие смежным ячейкам диаграммы Вороного, получится [[триангуляция Делоне]] для этого множества точек.|proof=Если ячейки, соответствующие сайтам <tex>p_i, \ p_j</tex>, смежны, то серединный перпендикуляр к отрезку <tex>p_i p_j</tex> образует ребро диаграммы Вороного, то есть к нему применима предыдущая лемма и можно построить окружность с <tex>p_i</tex> и <tex>p_j</tex> на границе, внутри которой не будет других сайтов. Триангуляции Делоне принадлежат [[Триангуляция Делоне#Критерий Делоне для рёбер|те и только те]] рёбра (''1-skeleton''с поправкой на точки, лежащие на одной окружности) , на которых можно построить такую окружность, что внутри неё не будет лежать никаких точек. Тогда ребро <tex>V_1(\Sigma)p_i p_j</tex> {{---является ребром триангуляции Делоне. За счёт равносильности в обеих используемых леммах мы добавим все рёбра и не построим лишних.}} набор вершин и рёбер Вороного.
В процессе работы алгоритма множество сайтов== Построение ===== Наивный алгоритм ===Будем [[Пересечение полуплоскостей, которые подаются на вход, может изменитьсясвязь с выпуклыми оболочками|пересекать полуплоскости]] по [[#intersect|свойству ячейки диаграммы]]. Чтобы различать начальное и конечное множество сайтов, будем обозначать входное множество через Необходимо для каждого сайта пересечь <tex>\Sigma_In - 1</tex>плоскость, а множество сайтов, которые присутствуют на результирующей диаграмме Вороного, через что суммарно делается за <tex>O(n^2 \Sigmalog n)</tex>. <tex>\Sigma_I</tex> всегда состоит из замкнутых сайтов, а <tex>\Sigma</tex> {{---}} из точек и открытых отрезков.
=== Инкрементальный алгоритм ===Храним диаграмму в [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. Пусть сайты у нас уже есть диаграмма для точек <tex>S_ip_1, p_2, ..., p_i</tex> и . Добавим новый сайт <tex>S_jp_{i+1}</tex> слабо пересекаются. Тогда '''битангентная окружность Вороного''' (''bitangent Voronoi circle'') Сначала найдём сайт <tex>C_{ij}p_j</tex> {{---}} окружность, касающаяся одновременно в ячейку которого попадает <tex>S_ip_{i+1}</tex> и , перебором. После этого строим новую ячейку: сначала проведём серединный перпендикуляр для <tex>S_jp_{i+1}p_j</tex>. При рассмотрении трёх сайтов , он пересечёт границу ячейки <tex>S_i\mathcal{V}(p_j)</tex>, с ячейкой <tex>S_j\mathcal{V}(p_k)</tex> и ; на следующем шаге будем строить серединный перпендикуляр для <tex>S_kp_{i+1} p_k</tex>, окружность, касающаяся всех трёх сайтов, называется '''тритангентной окружностью Вороного''' (''tritangent Voronoi circle''). Точки, принадлежащие рёбрам Вороного, являются центрами битангентных окружностей, а вершины {{---}} тритангентныхи так далее.
Рассмотрим <tex>S \notin \Sigma_I</tex>В процессе построения перпендикуляров необходимо обновлять РСДС. Будем говоритьКаждый раз, что когда новое полуребро <tex>Se</tex> '''конфликтует''' с окружностью Вороного , порождаемое <tex>Cp_{i+1}</tex>, если и <tex>Sp_j</tex> пересекается с кругом, ограниченным <tex>C</tex>. Также <tex>S</tex> конфликтует с ребром пересекает существовавшее ранее полуребро <tex>e \in V(S, \Sigma)'</tex>, если он пересекается с кругом, ограниченным одной из окружностей Вороного с центром в точке, принадлежащей создаётся новая вершина <tex>ev</tex>. '''Область конфликтов''' (''conflict region'') и начинается новое полуребро <tex>R_\Sigma(S)</tex> {{---}} множество точек e+1-каркаса <tex>V_1(\Sigma)</tex>, соответствующих окружностям Вороного, которые конфликтуют с <tex>S</tex>.
==Алгоритм==Рассмотрим сначала алгоритм для слабо пересекающихся сайтов, а потом обобщим его для случая сильно пересекающихся сайтов.Обновление РСДС происходит следующим образом:
===Случай слабо пересекающихся сайтов===* создаём вершину <tex>v</tex> с полуребром <tex>e</tex>;* для полуребра <tex>e</tex> в РСДС второй конец в вершине <tex>v</tex>, следующее полуребро — <tex>e'</tex>, инцидентные грани — слева <tex>\mathcal{V}(i+1)</tex>, справа — <tex>\mathcal{V}(j)</tex>;* добавляем в РСДС полуребро <tex>e + 1</tex> с началом в <tex>v</tex> и предыдущим полуребром <tex>e</tex>;* удаляем все полурёбра, лежащие между вершиной начала <tex>e</tex> и вершиной конца <tex>e</tex>, по часовой стрелке;Пусть мы уже построили диаграмму Вороного * обновляем полуребро, соответствующее грани для некоторого множества <tex>\Sigmamathcal{V}(p_j)</tex>. Рассмотрим процедуру вставки нового сайта — им становится <tex>Se</tex>.
Алгоритм состоит Каждый шаг выполняется за <tex>O(i)</tex>, значит, суммарно диаграмма из четырёх шагов:<tex>n</tex> сайтов с нуля создаётся за <tex>O(n^2)</tex>.
'''1'''{||[[Файл:voronoi-incremental-zero-step. Найти первый конфликт сайта <tex>S</tex> с каркасом <tex>V_1(\Sigma)</tex>png|200px|thumb|Локализация]]|[[Файл:voronoi-incremental-first-step.png|200px|thumb|Добавление первого ребра]]|[[Файл:voronoi-incremental.png|200px|thumb|Добавление третьего ребра]]|[[Файл:voronoi-update-dcel.png|400px|thumb|Обновление структуры при добавлении ребра]]|}
'''=== Алгоритм Форчуна ===Построение производится при помощи заметающей прямой и парабол позади неё (параболы в данном случае - это множества точек, равноудалённых от вершины и прямой). Сама диаграмма "рисуется" местами соприкасания соседних парабол. Несмотря на то, что в теории движение прямой происходит непрерывно, сам алгоритм обрабатывает только крайние случаи, когда происходят события. Рассматривается 2'''типа событий - появление новой параболы, когда заметающая прямая касается вершины, и схлопывание параболы - когда две соседние параболы её полностью накрывают. Найти всю область конфликтов сайта Всего событий <tex>O(n)</tex> (<tex>Sn</tex> c каркасом - число вершин). Для каждого события вычисляется его время (позиция заметающей прямой), события кладутся в очередь с приоритетом (отсюда <tex>V_1O(\Sigmalog n)</tex>по времени) и обрабатываются, пока очередь непуста. При обработке событий также записываются пары взаимодействующих вершин (у которых сайты имеют общую границу), это и является результатом работы алгоритма.
'''3'''. Построить диаграмму Вороного для Сложность работы алгоритма - <tex>O(n \Sigma \cup \{S\} log n)</tex> по времени и <tex>O(n)</tex>по памяти.
'''4'''Более подробно:* [https://ru. Обновить локализационную структуруwikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%A4%D0%BE%D1%80%D1%87%D1%83%D0%BD%D0%B0 Описание алгоритма на Wikipedia]* [https://www2.cs.sfu.ca/~binay/813.2011/Fortune.pdf Презентация с описанием в деталях]
{{Лемма|statement=== Алгоритм Чана ===<tex>\Sigma</tex> {{---}} слабо пересекающееся между собой множество сайтов. Тогда <tex>\forall s \in \Sigma</tex> ячейки Вороного <tex>VВершины проецируются из двумерной плоскости на поверхность параболоида (s, \Sigma)</tex> {{---}} односвязные множества.|proof=Для начала докажемx, что ячейки связны. Пусть это не так и у ячейки <tex>V(s, \Sigma)y</tex> несколько компонент связности. Рассмотрим <tex>\varepsilon</tex> {{---}} одну из техостаются те же, которая не содержит в себе добавляется <tex>sz = x^2 + y^2</tex>). Начнём идти Далее по кратчайшему пути <tex>P</tex> от любой точки <tex>p \in \varepsilon</tex> до <tex>s</tex>. Так как <tex>p</tex> и <tex>s</tex> лежат в разных компонентах связностиним строится нижняя [[Статические_выпуклые_оболочки:_Джарвис,_Грэхем, найдётся <tex>s' \in \Sigma</tex>_Эндрю, такой что путь <tex>P</tex> проходит через <tex>V(s'_Чен, \Sigma)</tex>_QuickHull|выпуклая оболочка]]. Значит существует путь от <tex>p</tex> до <tex>s'</tex>Поскольку параболоид выпуклый, который короченикакие вершины не будут удалены. На выходе получаются рёбра между вершинами, чем которые соответствуют триангуляции Делоне. Сложность работы - <tex>P</tex>, следовательно и <tex>\deltaO(p, s') < n \delta(p, slog n) = |P|</tex>. Противоречие.
Теперь допустим, что == Диаграмма k-го порядка =={{Определение|definition='''Ячейка Вороного''' <tex>V(s, \Sigma)k</tex> содержит разрыв в виде другой ячейки <tex>V(s', \Sigma)</tex>. Проведём прямую, которая соответствует кратчайшему расстоянию между <tex>s</tex> и <tex>s'</tex> и рассмотрим точку <tex>p</tex>, которая лежит на её продолжении за <tex>s'</tex> и принадлежит -го порядка''' (<tex>\mathcal{V}_k(sp_1, p_2, \Sigma)</tex>. Такая точка будет существовать, т.к. <tex>V(s', \Sigmap_k)</tex> лежит внутри <tex>V(s, \Sigma)</tex>. Получаем— множество точек, что кратчайший путь от имеющих в качестве ближайших <tex>pk</tex> до соседей множество сайтов <tex>sp_1, p_2, ..., p_k</tex> проходит через <tex>s'</tex>. Опять противоречие.
}}
{|border="0" width="100%"|{{Теорема|statement=Пусть Чтобы построить диаграмму <tex>\Sigmak</tex> {{-го порядка, возьмём диаграмму <tex>k - 1</tex>-го порядка. Каждая ячейка построена для некоторого набора <tex>k-}} 1</tex> сайтов. Обозначим множество слабо пересекающихся этих сайтов, за <tex>sS</tex> {{---}} сайт. [[Пересечение выпуклых многоугольников|Пересечём]] каждую из этих ячеек с ячейками диаграммы первого порядка, построенной на множестве сайтов <tex>s P \notin \Sigmasetminus S</tex>. Тогда Когда мы пересекаем ячейку <tex>R_\Sigma(s)k-1</tex> {{---}} связное непустое множество.|proof=Пусть го порядка для точек <tex>S</tex> с ячейкой первого порядка для точки <tex>p_i</tex>C = V(s, \Sigma получаем ячейку для множества <tex>S \cup \{sp_i\})</tex>. После пересечения ячеек необходимо объединить те, <tex>R_\Sigmaкоторые отвечают за одинаковый набор сайтов (sэто могут быть только соседние по ребру ячейки) = \varepsilon</tex>.
ЗаметимИтого совершаем <tex>k</tex> шагов, что на каждом строим <tex>\varepsilon = V_1O(\Sigman) \cap C</tex>. Если бы область конфликтов диграмм Вороного за время <tex>\varepsilonO(n^3)</tex> была пустой, то было бы верно пересекаем <tex>O(n)</tex> ячеек с <tex>O(n)</tex> ячейками за <tex>C \subset VO(qn)</tex> времени, \Sigma \cup \{p\}а потом объединяем ячейки за <tex>O(n)</tex> для некоторого (линейное количество соседних рёбер ячейки, а объединение происходит за <tex>q \in \SigmaO(1)</tex> и за счёт структуры РСДС). Итого <tex>VO(q, \Sigma k \cup scdot n^3)</tex> не было бы односвязным.
Пусть {||[[Файл:voronoi-first-order.png|200px|thumb|Диаграмма первого порядка]]|[[Файл:voronoi-second-order.png|200px|thumb|Диаграмма второго порядка]]|[[Файл:voronoi-third-order.png|200px|thumb|Диаграмма третьего порядка]]|[[Файл:voronoi-tenth-order.png|200px|thumb|Диаграмма <tex>n - 1</tex>-го порядка (она же farthest-point диаграмма) для данного набора сайтов]]|} == Farthest-point диаграмма =={{Определение|definition=Диаграмма <tex>n - 1</tex>\varepsilon_1, \varepsilon_2-го порядка является '''farthest-point диаграммой''', т.е.в каждой её ячейке все точки являются наиболее удалёнными от какого-то сайта. }} === Свойства ==={{Лемма|statement=Для любой точки <tex>q</tex> плоскости самый удалённый от неё сайт из <tex>P</tex> должен лежать на [[Статические выпуклые оболочки: Джарвис, Грэхем, Эндрю, Чен, \varepsilon_kQuickHull|выпуклой оболочке]] <tex>P</tex> {{.|proof=[[Файл:voronoi-farthest--}} связные компоненты inside.png|200px|right]]Сайт, не находящийся на выпуклой оболочке, лежит внутри неё по свойствам выпуклой оболочки. Пусть самый удалённый от точки <tex>q</tex> сайт <tex>p_i</tex> не лежит на выпуклой оболочке (т.е. лежит внутри неё). Проведём луч <tex>q p_i</tex>. Он пересечёт ребро выпуклой оболочки <tex>\varepsilonp_j p_k</tex> для некоторого . Получатся два смежных угла, рассмотрим тот, который оказался прямым или тупым. Тогда в полученном треугольнике <tex>k\rho(q, p_j) > \rho(q, p_i)</tex>, так как напротив большего угла лежит большая сторона.Пришли к противоречию.}}
Предположим{{Лемма|statement=Сайт, который лежит внутри выпуклой оболочки сайтов, что <tex>k \ge 2</tex>не может иметь ячейку в farthest-point диаграмме. Тогда cуществует путь <tex>P \subseteq C \setminus \varepsilon</tex>, соединяющий две точки <tex>x</tex> |proof=Пусть это не так и сайт <tex>y</tex> на границе <tex>Cp</tex> лежит внутри выпуклой оболочки и отделяющий <tex>\varepsilon_1</tex> от <tex>\varepsilon_2</tex>(см. рисунок)имеет ячейку в farthest-point диаграмме. Тогда внутри неё есть точка <tex>P \cap \varepsilon = \varnothing \Rightarrow P \cap V_1(\Sigma) = \varnothing \Rightarrow P \subseteq intV(q, \Sigma)</tex> . Но по предыдущей лемме самый удалённый для некоторого <tex>q \in \Sigma</tex>. <tex>x, y \in P \Rightarrow</tex> все достаточно малые окрестности <tex>U(x)</tex>, <tex>U(y)</tex> полностью содержатся в <tex>V(qсайт лежит на выпуклой оболочке, \Sigma)</tex>. Значита значит, точки пересечения этих окрестностей с дополнением <tex>Cсайт </tex> лежат в <tex>V(q, \Sigma \cup s)p</tex> и могут не может быть соединены путём самым удалённым для <tex>L \subseteq V(q, \Sigma \cup \{s\}) \subseteq V(q, \Sigma)</tex>. Следовательно, цикл <tex>P \circ L</tex> полностью содержится в <tex>V(q, \Sigma)</tex> и содержит <tex>\varepsilon_1</tex> или <tex>\varepsilon_2</tex> в своей внутренней части. Это противоречит тому, что <tex>V(q, \Sigma)</tex> {{---}} односвязное множество, следовательно <tex>k = 1</tex>Пришли к противоречию.
}}
|[[Файл:path.png|250px|thumb|right]]
|}
Таким образом{{Лемма|statement=Каждый сайт, для нахождения области конфликтовкоторый является вершиной выпуклой оболочки сайтов, можно найти одно конфликтующее ребро, а затем, при помощи DFS, найти все остальныеимеет ячейку в farthest-point диаграмме.|proof=Докажем по индукции.
Пусть сайт <tex>S</tex> {{База индукции: для двух сайтов они оба являются вершинами выпуклой оболочки и оба имеют ячейку в farthest---}} это точка <tex>p</tex>point диаграмме (дальняя от сайта полуплоскость).
Первый шаг алгоритма начинается с поиска ближайшего соседа Переход: добавим сайт <tex>N_\Sigma(p)</tex> точки p среди сайтов <tex>\Sigma</tex> (если есть несколько ближайшихтак, то подойдёт любой из них)что он станет новой вершиной выпуклой оболочки. Будем хранить нашу диаграмму Пусть он не имеет ячейку в скипfarthest-листе для тогоpoint диаграмме, чтобы можно было быстро выполнять эти запросыто есть уже имеющаяся перед его добавлением диаграмма не меняется. Либо <tex>N_\Sigma(p)</tex> и <tex>p</tex> {{Для построения farthest---}} это одна и та же точкаpoint диаграммы проводятся серединные перпендикуляры между всеми парами сайтов, и ничего делать полученные полуплоскости пересекаются; раз новой ячейки не нужнодобавилось, либо то серединные перпендикуляры между <tex>p</tex> конфликтует хотя бы и остальными сайтами совпали с одним ребромуже имеющимися перпендикулярами. Это возможно, принадлежащим границе ячейки только если <tex>V(N_\Sigma(p))</tex>совпал с другим сайтом. Тогда первый шаг завершается рассмотрением границы <tex>V(N_\Sigma(p))</tex> и возвращением одного из рёбер, конфликтующих с <tex>p</tex>Пришли к противоречию. Как было сказано раньше, второй шаг {{---}} DFS по рёбрам <tex>V_1(\Sigma)</tex> с целью найти все рёбра, конфликтующие с точкой <tex>p</tex>. Теперь, зная <tex>R_\Sigma(p)</tex>, можно создать новую ячейку Вороного <tex>V(S, \Sigma \cup \{S\})</tex> (а как это сделать, я не очень понимаю).
Если же <tex>S</tex> {{Утверждение|statement=Сайт имеет ячейку в farthest---}} это замкнутый отрезок <tex>t</tex>, то сначала вставляем конечные точки <tex>p'_t</tex> point диаграмме тогда и <tex>p''_t</tex>, используя процедурутолько тогда, описанную вышекогда он является вершиной выпуклой оболочки всех сайтов. Остаётся вставить открытый отрезок <tex>t^\circ</tex>|proof=Непосредственно следует из двух предыдущих лемм. Так как <tex>p'_t</tex> и <tex>p''_t</tex> }} {{Утверждение|statement=Все ячейки в farthest-point диаграмме неограничены.|proof=[[Файл:voronoi-farthest-}} соседи unbounded.png|200px|right]]Пусть <tex>t^\circp_i</tex> в диаграмме — сайт на выпуклой оболочке сайтов, а <tex>V(\Sigma \cup \{p'_t, p''_t, t^\circ\})q</tex>— точка, для которой он является наиболее удалённым. Тогда для всех точек на луче, лежащем на <tex>t^\circp_i q</tex> обязан конфликтовать с каким-нибудь ребром ячейки, соответствующей начинающемся в <tex>p'_tq</tex> или и не проходящим через <tex>p''_tp_i</tex>. Таким образом, первый конфликт сайт <tex>t^\circp_i</tex> с будет наиболее удалённым среди остальных сайтов. Значит, ячейка сайта <tex>V_1(\Sigma \cup \{p'_t, p''_t\})p_i</tex> можно найти, просматривая рёбра ячейки <tex>V(p'_tв farthest-point диаграмме включает в себя этот луч, \Sigma \cup \{p'_tа значит, p''_t\неограничена.})</tex> или <tex>V(p''_t, \Sigma \cup \{p'_t, p''_t\})</tex>, то есть, можно опустить шаг поиска ближайшего соседа. Остаётся найти всю область конфликтов, как и в случае с точкой.
===Случай сильно пересекающихся сайтовАлгоритм ==={|border="0" width="100%"|Пусть <tex>p</tex> {{Чтобы найти farthest---}} точкаpoint диаграмму, сначала найдём выпуклую оболочку всех сайтов. Обозначим сайты, её образующие, которая сильно пересекается с отрезком через <tex>t_i</tex>p_1, p_2, т.е. <tex>p \in t^\circ</tex>. Понятно, что <tex>t^\circ</tex> будет ближайшим соседом <tex>p</tex> в <tex>\Sigmap_m</tex>. Пусть Запомним порядки обхода для каждой вершины выпуклой оболочки по часовой стрелке (<tex>e'_icw(pp_i)</tex> ) и против часовой (<tex>e''_iccw(pp_i)</tex> {{---}} два ребра <tex>V(t^\circ, \Sigma)</tex>, которые пересекаются с нормалями к <tex>t</tex>, проведёнными и сделаем случайную перестановку точек. Далее удаляем из выпуклой оболочки все точки <tex>p</tex> , кроме первых трёх (см. рисунокзапоминая при этом их соседей в оболочке на момент удаления). Пусть <tex>v'_i(p)</tex> и <tex>v''_i(p)</tex> {{После этого строим farthest---}} точки пересечения нормалей с рёбрами <tex>e'_ipoint диаграмму для первых трёх точек (pпересекая полуплоскости)</tex> и <tex>e''_iпоследовательно добавляем остальные (pудалённые)</tex> соответственнов порядке, обратном порядку удаления. Тогда алгоритм вставки точки <tex>p</tex> в диаграмму <tex>V(\Sigma)</tex> будет выглядеть следующим образом:
Начинаем с поиска ближайшего соседа <tex>N_\Sigma(p)</tex>. Если <tex>N_\Sigma(p) = p</tex>, то ничего не делаем. Если <tex>N_\Sigma(p)</tex> {{---}} точка, или отрезок, с которым <tex>p</tex> не пересекается, то запускается процедура вставки, которая была описана выше. Иначе <tex>N_\Sigma(p) = t_i^\circ</tex> {{---}} отрезок, пересекающийся с <tex>p</tex>. Сначала добавляем <tex>p</tex> в <tex>\Sigma</tex> и заменяем <tex>t_i^\circ</tex> двумя отрезками <tex>p'_ip</tex> и <tex>pp''_i</tex>, где <tex>p'_i</tex> и <tex>p''_i</tex> {{---}} конечные точки <tex>t_i</tex>. Затем ищем рёбра <tex>e'_i(p)</tex> и <tex>e''_i(p)</tex>, разбиваем их в точках <tex>v'_i(p)</tex> и <tex>v''_i(p)</tex> и добавляем отрезки <tex>v'_i(p)p</tex> и <tex>v''_i(p)p</tex> в диаграмму.|||[[Файл:strongly_intersectvoronoi-farthest-construct.png|300px600px|thumb|rightПостроение очередной ячейки farthest-point диаграммы]]
|}
Если же мы хотим вставить в диаграмму отрезок Для точки <tex>tp_i</tex>ячейка встанет «между» ячейками, то вставляем сначала его крайние точки соответствующими <tex>p'_tcw(p_i)</tex> и <tex>p''_tccw(p_i)</tex>. Затем, начиная с Перед добавлением <tex>p'_tp_i</tex>, ищем первый конфликт <tex>t^\circcw(p_i)</tex> с текущей диаграммой Вороного и ищем всю область конфликтов. Во время этого поиска, прежде чем тестировать ребро Вороного <tex>e</tex> существующей диаграммы на потенциальный конфликт, мы проверяем, не пересекается ли <tex>t^\circccw(p_i)</tex> с одним из сайтов— соседи, связанных с <tex>e</tex>поэтому между ними построен серединный перпендикуляр. Если такой сайт Серединный перпендикуляр к <tex>S_ip_i ccw(p_i)</tex> найдендаст новое ребро, то поиск останавливается. Если <tex>S_i</tex> {{--которое лежит в farthest-}} точка, point ячейке <tex>ccw(p_i</tex>, то вставляем отрезки <tex>p'_tp_i)</tex> и является частью границы ячейки <tex>p_ip''_tp_i</tex> рекурсивно. Если Обойдём ячейку <tex>S_iccw(p_i)</tex> {{-по часовой стрелке, чтоб понять, какое ребро пересечёт перпендикуляр. С другой стороны этого ребра лежит ячейка какой--}} отрезок <tex>t^\circ_i</tex>, то сначала проверяем, не принадлежит ли один из точки <tex>t^\circp_j</tex>, <tex>t^\circ_i</tex> другому. Если так и есть, то прекращаем работу, иначе вычисляем точку пересечения серединный перпендикуляр <tex>p_+p_i p_j</tex> отрезков тоже даст ребро ячейке <tex>t^\circp_i</tex> . Аналогично совершим обход и так далее. Последний серединный перпендикуляр будет построен для <tex>t^\circ_ip_i cw(p_i)</tex>. После этого удаляем рёбра, вставляем её в диаграмму, а затем рекурсивно вставляем отрезки <tex>p'_tp_+</tex> и <tex>p_+p''_t</tex>которые лежат внутри новой ячейки.
Время работы данного алгоритма составляет <tex>O((n + m)\log^2m)</tex>, где <tex>n</tex> {{---}} количество элементов во входном множестве <tex>\Sigma_I</tex>, а <tex>m</tex> {{---}} количество пар сильно пересекающихся сайтов== См.также ==* [[Трапецоидная карта]]* [[Триангуляция Делоне]]* [[Straight skeleton]]
==СсылкиИсточники ==* de Berg, Cheong, van Kreveld, Overmars. Computational Geometry, Algorithms and Applicants, 2008. pp. 147-151, 164-166* [http://citeseerxstudents.istinfo.psuuaic.eduro/viewdoc~emilian.necula/download?doi=10vor2.1pdf Algorithms for constructing Voronoi diagrams, Vera Sacrist´an {{---}} Incremental algorithm]* [http://en.1wikipedia.112.8990&rep=rep1&type=pdf ''Menalaos I. Karavelas'' A robust and efficient implementation for the segment org/wiki/Voronoi_diagram Wikipedia — Voronoi diagram.]* [https://web.archive.org/web/20170329014016/http://www.sciencedirectcs.comuu.nl/sciencedocs/articlevakken/pii/0925772193900333ga/slides7b.pdf?md5=ce44776db4922c6579a191a7c7ada933&pid=1Computational Geometry {{-s2.0-0925772193900333-main.pdf ''Rolf Klein'' Randomized incremental construction of abstract }} Lecture 13: More on Voronoi diagrams.]
[[Категория: Вычислительная геометрия]]
[[Категория: Триангуляция Делоне и диаграмма Вороного]]
1632
правки

Навигация