Изменения

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

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

23 816 байт добавлено, 19:26, 4 сентября 2022
м
rollbackEdits.php mass rollback
{{В разработке}}== Определения ====Обозначения и определения= Совсем неформальное определение ==='''Сайт''' (''site'') {{[[Файл:voronoi---}} общее название diagram.png|200px|thumb|right|Пример диаграммы Вороного]]Пусть есть карта города, на которой точками обозначены почтовые отделения. Человек хочет отправить письмо, и он пойдёт на ближайшую почту. Ему интересно знать, какое отделение ближе, для любой точки <tex>p</tex> или замкнутого отрезка <tex>t</tex>города — необходимость отправить письмо может наступить неожиданно. Для этого он может взять карту и расчертить её на ячейки так, чтобы внутри каждой ячейки находилось только одно отделение, а для всех остальных точек ячейки именно эта почта была ближайшей. Полученная картинка и будет диаграммой Вороного для точек-почт.
=== Неформальное определение ===Есть множество точек <tex>t^\circP</tex> {{---}} внутренняя часть отрезкана плоскости. Внутренность Кусочек плоскости из точек <tex>q</tex> такой, что для всех <tex>q</tex> ближайшей точкой из множества <tex>P</tex> является одна и та же точка <tex>p</tex>, называется ячейкой Вороного точки {{---}} пустое множество<tex>p</tex>. Разбиение плоскости на такие ячейки для всех точек <tex>p_i \in P</tex> называется диаграммой Вороного для множества <tex>P</tex>.
Два замкнутых пересекающихся сайта '''слабо пересекаются''' (''weakly intersect'')=== Формальное определение ===<tex>P = \{ p_1, если точка их пересечения не принадлежит их внутренностямp_2, то есть они касаются концами..., p_n\}</tex> — множество точек на плоскости.
Два {{Определение|definition=<tex>p_i \in P</tex> называется '''сайтом''' (''site'').}} {{Определение|definition='''Ячейка Вороного''' (''Voronoi cell'', <tex>\mathcal{V}(p_i)</tex>) — множество точек плоскости <tex>q</tex> таких, что для фиксированного сайта <tex>p_i</tex> и любых других сайтов <tex>p_j \in P, \ j \neq i</tex> верно неравенство <tex>\rho(q, p_i) < \rho(q, p_j)</tex>.}} {{Определение|definition='''сильно пересекаютсяДиаграмма Вороного''' (''strongly intersectVoronoi 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) = \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(P)</tex> представляет собой <tex>n - 1</tex> параллельную прямую. Иначе <tex>Vor(P)</tex> связная и все её рёбра — либо отрезки, либо лучи.|proof=[[Файл:voronoi-not-lines.png|200px|right]] В случае, если все сайты лежат на одной прямой, каждая пара соседних сайтов порождает серединный перпендикуляр к отрезку, содержащему их, и, соответственно, к прямой, которая содержит все сайты. Так получаются <tex>n - 1</tex> прямая, каждая из которых перпендикулярна прямой, содержащей сайты, а значит, эти прямые параллельны. Рассмотрим теперь случай, когда сайты не лежат на одной прямой. Покажем, что рёбра — это отрезки или лучи, от противного. Предположим, что есть ребро <tex>e</tex>, являющееся прямой. Пусть оно — граница ячеек <tex>\mathcal{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>. Пришли к противоречию. Докажем теперь, что диаграмма связна. Предположим, что это не так. Тогда на её рёбрах найдутся две точки <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>, несвязная. Это возможно, только если она представляет собой полосу, ограниченную двумя параллельными прямыми. Но в нашем случае в диаграмме не может быть прямых, пришли к противоречию. [[Файл:voronoi-connected.png|500px]]}} === Размер структуры ==={{Теорема|statement=Для <tex>n \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_\infty</tex>, и все полубесконечные рёбра мы превратим в рёбра, инцидентные ей. Таким образом мы увеличили число вершин на одну, а число рёбер не изменилось. Число граней равно <tex>n</tex> по определению диаграммы Вороного. Тогда по формуле Эйлера получаем <tex>(v + 1) - e + n = 2</tex>.Сумма степеней всех вершин полученного графа равна <tex>2e</tex>, так как у каждого ребра есть ровно два конца (нет петель). Также из каждой вершины исходят как минимум три ребра. Отсюда получаем <tex>2e \geqslant 3 (v + 1)</tex>.Домножим равенство на два и вычтем из него полученную нижнюю границу для <tex>2 \cdot e</tex>, в результате получим <tex> v \leqslant 2n - 5</tex>. Далее подставим этот результат в равенство и получим <tex>e \leqslant 3n - 6</tex>, что и требовалось доказать.}} === Связь с триангуляцией Делоне ==={{Определение|definition='''Наибольшая пустая окружность''' точки <tex>q</tex> по отношению к <tex>P</tex> (''largest empty circle of ''<tex>q</tex>'' with respect to ''<tex>P</tex>, <tex>C_P(q)</tex>) — наибольшая окружность с центром в <tex>q</tex> такая, что во внутренности хотя бы соответствующего ей круга не лежит ни одного сайта из данных <tex>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}(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(q)</tex> содержит на своей границе только сайты <tex>x p_i, \in \mathbb{E}^2p_j</tex>.|proof=[[Файл:voronoi-circles.png|200px|right]]Предположим, что <tex>q</tex> до замкнутого сайта существует. Тогда, так как <tex>S_iC_P(q)</tex>: не содержит в себе сайтов и содержит <tex>p_i, \ p_j</tex> на границе, <tex>\deltarho(xq, S_ip_i) = \min{rho(q, p_j) \leqslant \rho(q, p_k), \{||x - y|| : y 1 \in S_ileqslant k \}}leqslant n</tex>. Отсюда выходит, что <tex>q</tex> — вершина <tex>Vor(P)</tex> или лежит на ребре диаграммы. Но по предыдущей лемме выходит, что <tex>q</tex> не может быть вершиной диаграммы. Значит, она лежит на ребре, заданном серединным перпендикуляром к <tex>p_i p_j</tex>.
Пусть Докажем в другую сторону: пусть серединный перпендикуляр к <tex>H_{ij} = \{x \in \mathbb{E}^2 : \delta(x, S_i) \le \delta(x, S_j)\}p_i p_j</tex>задаёт ребро диаграммы. '''Ячейка Вороного''' Наибольшая пустая окружность любой точки <tex>q</tex> на этом ребре должна содержать на границе <tex>p_i</tex> и <tex>p_j</tex> (''Voronoi cell'') так как <tex>V(S_i, \Sigma)q</tex> {{---}} множество точек, которые находятся ближе к равноудалена от <tex>S_ip_i</tex>, чем к любому другому сайту, то есть и <tex>V(S_i, \Sigma) = \cap_{i \ne j}H_{ij}p_j</tex>). Ячейки Вороного односвязныТакже эта окружность не должна содержать никаких других сайтов на границе, так как тогда она не является вершиной.}}
'''Ребро Вороного''' (''Voronoi edge'') {{---}} связное множество Теорема|statement=Если соединить все сайты, соответствующие смежным ячейкам диаграммы Вороного, получится [[триангуляция Делоне]] для этого множества точек.|proof=Если ячейки, соответствующие сайтам <tex>p_i, \ p_j</tex>, принадлежащих пересечению ровно двух ячеек смежны, то серединный перпендикуляр к отрезку <tex>p_i p_j</tex> образует ребро диаграммы Вороного, то есть к нему применима предыдущая лемма и можно построить окружность с <tex>p_i</tex> и <tex>p_j</tex> на границе, внутри которой не будет других сайтов. Триангуляции Делоне принадлежат [[Триангуляция Делоне#Критерий Делоне для рёбер|те и только те]] рёбра (с поправкой на точки, лежащие на одной окружности), на которых можно построить такую окружность, что внутри неё не будет лежать никаких точек. Тогда ребро <tex>p_i p_j</tex> является ребром триангуляции Делоне. За счёт равносильности в обеих используемых леммах мы добавим все рёбра и не построим лишних.}}
'''Вершина Вороного''' == Построение ===== Наивный алгоритм ===Будем [[Пересечение полуплоскостей, связь с выпуклыми оболочками|пересекать полуплоскости]] по [[#intersect|свойству ячейки диаграммы]]. Необходимо для каждого сайта пересечь <tex>n - 1</tex> плоскость, что суммарно делается за <tex>O(''Voronoi vertex''n^2 \log n) {{---}} точка, которая принадлежит хотя бы трём ячейкам Вороного</tex>.
'''Диаграмма Вороного''' === Инкрементальный алгоритм ===Храним диаграмму в [[ППЛГ и РСДС (''Voronoi diagram''PSLG и DCEL) : определение, построение РСДС множества прямых|РСДС]]. Пусть у нас уже есть диаграмма для точек <tex>p_1, p_2, ..., p_i</tex>. Добавим новый сайт <tex>p_{i+1}</tex>. Сначала найдём сайт <tex>p_j</tex>, в ячейку которого попадает <tex>p_{i+1}</tex>, перебором. После этого строим новую ячейку: сначала проведём серединный перпендикуляр для <tex>p_{i+1}p_j</tex>, он пересечёт границу ячейки <tex>\mathcal{V}(\Sigmap_j)</tex> множества сайтов с ячейкой <tex>\Sigmamathcal{V}(p_k)</tex> ; на следующем шаге будем строить серединный перпендикуляр для <tex>p_{{---i+1}} разбиение плоскости на вершины, рёбра p_k</tex> и ячейки Вороноготак далее.
'''В процессе построения перпендикуляров необходимо обновлять РСДС. Каждый раз, когда новое полуребро <tex>e</tex>, порождаемое <tex>p_{i+1-каркас}</tex> и <tex>p_j</tex>, пересекает существовавшее ранее полуребро <tex>e''' (''1-skeleton'') </tex>, создаётся новая вершина <tex>V_1(\Sigma)v</tex> {{---}} набор вершин и рёбер Вороногоначинается новое полуребро <tex>e+1</tex>.
В процессе работы алгоритма множество сайтов, которые подаются на вход, может измениться. Чтобы различать начальное и конечное множество сайтов, будем обозначать входное множество через <tex>\Sigma_I</tex>, а множество сайтов, которые присутствуют на результирующей диаграмме Вороного, через <tex>\Sigma</tex>. <tex>\Sigma_I</tex> всегда состоит из замкнутых сайтов, а <tex>\Sigma</tex> {{---}} из точек и открытых отрезков.Обновление РСДС происходит следующим образом:
Пусть сайты * создаём вершину <tex>S_iv</tex> и с полуребром <tex>e</tex>;* для полуребра <tex>e</tex> в РСДС второй конец в вершине <tex>S_jv</tex> слабо пересекаются. Тогда '''битангентная окружность Вороного'', следующее полуребро — <tex>e' </tex>, инцидентные грани — слева <tex>\mathcal{V}(''bitangent Voronoi circle''i+1) </tex>, справа — <tex>C_\mathcal{ijV}(j)</tex> {{---}} окружность, касающаяся одновременно ;* добавляем в РСДС полуребро <tex>S_ie + 1</tex> и с началом в <tex>S_jv</tex>. При рассмотрении трёх сайтов и предыдущим полуребром <tex>S_ie</tex>;* удаляем все полурёбра, лежащие между вершиной начала <tex>S_je</tex> и вершиной конца <tex>S_ke</tex>, окружностьпо часовой стрелке;* обновляем полуребро, касающаяся всех трёх сайтов, называется '''тритангентной окружностью Вороного''' соответствующее грани для <tex>\mathcal{V}(''tritangent Voronoi circle''p_j). Точки, принадлежащие рёбрам Вороного, являются центрами битангентных окружностей, а вершины {{---}} тритангентных</tex> — им становится <tex>e</tex>.
Рассмотрим Каждый шаг выполняется за <tex>S \notin \Sigma_I</tex>. Будем говорить, что <tex>S</tex> '''конфликтует''' с окружностью Вороного <tex>C</tex>, если <tex>S</tex> пересекается с кругом, ограниченным <tex>C</tex>. Также <tex>S</tex> конфликтует с ребром <tex>e \in VO(S, \Sigmai)</tex>, если он пересекается с кругомзначит, ограниченным одной суммарно диаграмма из окружностей Вороного с центром в точке, принадлежащей <tex>en</tex>. '''Область конфликтов''' (''conflict region'') сайтов с нуля создаётся за <tex>R_\SigmaO(Sn^2)</tex> {{---}} множество точек 1-каркаса <tex>V_1(\Sigma)</tex>, соответствующих окружностям Вороного, которые конфликтуют с <tex>S</tex>.
==Алгоритм=={|Рассмотрим сначала алгоритм для слабо пересекающихся сайтов, а потом обобщим его для случая сильно пересекающихся сайтов|[[Файл:voronoi-incremental-zero-step.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>\Sigman</tex>- число вершин). Рассмотрим процедуру вставки нового сайта Для каждого события вычисляется его время (позиция заметающей прямой), события кладутся в очередь с приоритетом (отсюда <tex>SO(\log n)</tex>по времени) и обрабатываются, пока очередь непуста. При обработке событий также записываются пары взаимодействующих вершин (у которых сайты имеют общую границу), это и является результатом работы алгоритма.
Алгоритм состоит из четырёх шагов:Сложность работы алгоритма - <tex>O(n \log n)</tex> по времени и <tex>O(n)</tex> по памяти.
'''1'''Более подробно:* [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. Найти первый конфликт сайта <tex>S<ca/tex> с каркасом <tex>V_1(\Sigma)<~binay/813.2011/tex>Fortune.pdf Презентация с описанием в деталях]
'''2'''. Найти всю область конфликтов сайта === Алгоритм Чана ===Вершины проецируются из двумерной плоскости на поверхность параболоида (<tex>x, y</tex> остаются те же, добавляется <tex>Sz = x^2 + y^2</tex> c каркасом ). Далее по ним строится нижняя [[Статические_выпуклые_оболочки:_Джарвис,_Грэхем,_Эндрю,_Чен,_QuickHull|выпуклая оболочка]]. Поскольку параболоид выпуклый, никакие вершины не будут удалены. На выходе получаются рёбра между вершинами, которые соответствуют триангуляции Делоне. Сложность работы - <tex>V_1O(n \Sigmalog n)</tex>.
== Диаграмма k-го порядка =={{Определение|definition='''Ячейка Вороного''' <tex>k</tex>'''3-го порядка'''. Построить диаграмму Вороного для (<tex>\Sigma \cup \mathcal{S\V} _k(p_1, p_2, ..., p_k)</tex>) — множество точек, имеющих в качестве ближайших <tex>k</tex> соседей множество сайтов <tex>p_1, p_2, ..., p_k</tex>.}}
'''4'''Чтобы построить диаграмму <tex>k</tex>-го порядка, возьмём диаграмму <tex>k - 1</tex>-го порядка. Обновить локализационную структуруКаждая ячейка построена для некоторого набора <tex>k-1</tex> сайтов. Обозначим множество этих сайтов за <tex>S</tex>. [[Пересечение выпуклых многоугольников|Пересечём]] каждую из этих ячеек с ячейками диаграммы первого порядка, построенной на множестве сайтов <tex>P \setminus S</tex>. Когда мы пересекаем ячейку <tex>k-1</tex>-го порядка для точек <tex>S</tex> с ячейкой первого порядка для точки <tex>p_i</tex>, получаем ячейку для множества <tex>S \cup \{p_i\}</tex>. После пересечения ячеек необходимо объединить те, которые отвечают за одинаковый набор сайтов (это могут быть только соседние по ребру ячейки).
Итого совершаем <tex>k</tex> шагов, на каждом строим <tex>O(n)</tex> диграмм Вороного за время <tex>O(n^3)</tex>, пересекаем <tex>O(n)</tex> ячеек с <tex>O(n)</tex> ячейками за <tex>O(n)</tex> времени, а потом объединяем ячейки за <tex>O(n)</tex> (линейное количество соседних рёбер ячейки, а объединение происходит за <tex>O(1)</tex> за счёт структуры РСДС). Итого <tex>O(k \cdot n^3)</tex>.
Пусть сайт <tex>S</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>pn - 1</tex>.-го порядка (она же farthest-point диаграмма) для данного набора сайтов]]|}
{|border="0" width="100%"Farthest-point диаграмма ==|{{ТеоремаОпределение|statementdefinition=Пусть Диаграмма <tex>\Sigma</tex> {{n ---}} множество слабо пересекающихся сайтов, <tex>p1</tex> {{-го порядка является '''farthest--}} точкаpoint диаграммой''', <tex>p \notin \Sigma</tex>т.е. Тогда <tex>R_\Sigma(p)</tex> {{в каждой её ячейке все точки являются наиболее удалёнными от какого---}} связная кривая, содержащая более одной точкито сайта.|proof=Пусть <tex>C = V(p, \Sigma \cup \{p\})</tex>, <tex>R_\Sigma(p) = \varepsilon</tex>. }
Заметим, что === Свойства ==={{Лемма|statement=Для любой точки <tex>\varepsilon = V_1(\Sigma) \cap Cq</tex>. Если бы область конфликтов плоскости самый удалённый от неё сайт из <tex>\varepsilonP</tex> была пустойдолжен лежать на [[Статические выпуклые оболочки: Джарвис, то было бы верно <tex>C \subset V(qГрэхем, Эндрю, Чен, \Sigma \cup \{p\})QuickHull|выпуклой оболочке]] </tex> для некоторого <tex>q \in \SigmaP</tex> и <tex>V(q.|proof=[[Файл:voronoi-farthest-inside.png|200px|right]]Сайт, \Sigma \cup p)</tex> не было бы односвязнымнаходящийся на выпуклой оболочке, лежит внутри неё по свойствам выпуклой оболочки.
Пусть самый удалённый от точки <tex>\varepsilon_1, \varepsilon_2, q</tex> сайт <tex>p_i</tex> не лежит на выпуклой оболочке (т.е.лежит внутри неё). , \varepsilon_kПроведём луч <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> лежит внутри выпуклой оболочки и отделяющий имеет ячейку в farthest-point диаграмме. Тогда внутри неё есть точка <tex>\varepsilon_1q</tex> от <tex>\varepsilon_2</tex>(см. рисунок). <tex>P \cap \varepsilon = \varnothing \Rightarrow P \cap V_1(\Sigma) = \varnothing \Rightarrow P \subseteq intV(s, \Sigma)</tex> Но по предыдущей лемме самый удалённый для некоторого <tex>s \in \Sigmaq</tex>. <tex>xсайт лежит на выпуклой оболочке, y \in P \Rightarrow</tex> все достаточно малые окрестности <tex>U(x)</tex>а значит, сайт <tex>U(y)</tex> полностью содержатся в <tex>V(s, \Sigma)</tex>. Значит, точки пересечения этих окрестностей с дополнением <tex>C</tex> лежат в <tex>V(s, \Sigma \cup p)</tex> и могут не может быть соединены путём самым удалённым для <tex>L \subseteq V(s, \Sigma \cup \{p\}) \subseteq V(s, \Sigma)q</tex>. Следовательно, цикл <tex>P \circ L</tex> полностью содержится в <tex>V(s, \Sigma)</tex> и содержит <tex>\varepsilon_1</tex> или <tex>\varepsilon_2</tex> в своей внутренней части. Это противоречит тому, что <tex>V(s, \Sigma)</tex> {{---}} односвязное множество, следовательно <tex>k = 1</tex>Пришли к противоречию.
}}
 {{Лемма|statement=Каждый сайт, который является вершиной выпуклой оболочки сайтов, имеет ячейку в farthest-point диаграмме.|proof=Докажем по индукции. База индукции: для двух сайтов они оба являются вершинами выпуклой оболочки и оба имеют ячейку в farthest-point диаграмме (дальняя от сайта полуплоскость). Переход: добавим сайт <tex>p</tex> так, что он станет новой вершиной выпуклой оболочки. Пусть он не имеет ячейку в farthest-point диаграмме, то есть уже имеющаяся перед его добавлением диаграмма не меняется. Для построения farthest-point диаграммы проводятся серединные перпендикуляры между всеми парами сайтов, и полученные полуплоскости пересекаются; раз новой ячейки не добавилось, то серединные перпендикуляры между <tex>p</tex> и остальными сайтами совпали с уже имеющимися перпендикулярами. Это возможно, только если <tex>p</tex> совпал с другим сайтом. Пришли к противоречию.}} {{Утверждение|statement=Сайт имеет ячейку в farthest-point диаграмме тогда и только тогда, когда он является вершиной выпуклой оболочки всех сайтов.|proof=Непосредственно следует из двух предыдущих лемм.}} {{Утверждение|statement=Все ячейки в farthest-point диаграмме неограничены.|proof=[[Файл:pathvoronoi-farthest-unbounded.png|250px200px|right]]Пусть <tex>p_i</tex> — сайт на выпуклой оболочке сайтов, а <tex>q</tex> — точка, для которой он является наиболее удалённым. Тогда для всех точек на луче, лежащем на <tex>p_i q</tex>, начинающемся в <tex>q</tex> и не проходящим через <tex>p_i</tex>, сайт <tex>p_i</tex> будет наиболее удалённым среди остальных сайтов. Значит, ячейка сайта <tex>p_i</tex> в farthest-point диаграмме включает в себя этот луч, а значит, неограничена.}} === Алгоритм ===Чтобы найти farthest-point диаграмму, сначала найдём выпуклую оболочку всех сайтов. Обозначим сайты, её образующие, через <tex>p_1, p_2, ..., p_m</tex>. Запомним порядки обхода для каждой вершины выпуклой оболочки по часовой стрелке (<tex>cw(p_i)</tex>) и против часовой (<tex>ccw(p_i)</tex>) и сделаем случайную перестановку точек. Далее удаляем из выпуклой оболочки все точки, кроме первых трёх (запоминая при этом их соседей в оболочке на момент удаления). После этого строим farthest-point диаграмму для первых трёх точек (пересекая полуплоскости) и последовательно добавляем остальные (удалённые) в порядке, обратном порядку удаления. {||[[Файл:voronoi-farthest-construct.png|600px|thumb|rightПостроение очередной ячейки farthest-point диаграммы]]
|}
Таким образом, для нахождения области конфликтов, можно найти одно конфликтующее ребро, а затем, при помощи DFS, найти все остальные.
Первый шаг алгоритма начинается с поиска ближайшего соседа Для точки <tex>p_i</tex> ячейка встанет «между» ячейками, соответствующими <tex>N_\Sigmacw(pp_i)</tex> точки p среди сайтов и <tex>\Sigmaccw(p_i)</tex> (если есть несколько ближайших, то подойдёт любой из них). Либо Перед добавлением <tex>N_\Sigma(p)p_i</tex> и <tex>pcw(p_i)</tex> {{---}} это одна и та же точка, и ничего делать не нужно, либо <tex>pccw(p_i)</tex> конфликтует хотя бы с одним ребром— соседи, принадлежащим границе ячейки поэтому между ними построен серединный перпендикуляр. Серединный перпендикуляр к <tex>V(N_\Sigmap_i ccw(p)p_i)</tex>. Тогда первый шаг завершается рассмотрением границы даст новое ребро, которое лежит в farthest-point ячейке <tex>V(N_\Sigmaccw(p)p_i)</tex> и возвращением одного из рёбер, конфликтующих с является частью границы ячейки <tex>pp_i</tex>. Как было сказано раньше, второй шаг {{---}} DFS по рёбрам Обойдём ячейку <tex>V_1ccw(\Sigmap_i)</tex> с целью найти все рёбрапо часовой стрелке, чтоб понять, конфликтующие с точкой какое ребро пересечёт перпендикуляр. С другой стороны этого ребра лежит ячейка какой-то точки <tex>pp_j</tex>. После того, как мы узнали и серединный перпендикуляр <tex>R_\Sigma(p)p_i p_j</tex> тоже даст ребро ячейке <tex>p_i</tex>, третий шаг . Аналогично совершим обход и так далее. Последний серединный перпендикуляр будет заключаться в создании новой ячейки Вороного, имеющей границу построен для <tex>R_\Sigmap_i cw(pp_i)</tex>.После этого удаляем рёбра, которые лежат внутри новой ячейки. == См. также ==* [[Трапецоидная карта]]* [[Триангуляция Делоне]]* [[Straight skeleton]] == Источники ==* de Berg, Cheong, van Kreveld, Overmars. Computational Geometry, Algorithms and Applicants, 2008. pp. 147-151, 164-166* [http://students.info.uaic.ro/~emilian.necula/vor2.pdf Algorithms for constructing Voronoi diagrams, Vera Sacrist´an {{---}} Incremental algorithm]* [http://en.wikipedia.org/wiki/Voronoi_diagram Wikipedia — Voronoi diagram]* [https://web.archive.org/web/20170329014016/http://www.cs.uu.nl/docs/vakken/ga/slides7b.pdf Computational Geometry {{---}} Lecture 13: More on Voronoi diagrams]
[[Категория: Вычислительная геометрия]]
[[Категория: Триангуляция Делоне и диаграмма Вороного]]
1632
правки

Навигация