Триангуляция Делоне — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Существование триангуляции Делоне)
м (rollbackEdits.php mass rollback)
 
(не показано 105 промежуточных версий 15 участников)
Строка 1: Строка 1:
{{ptready}}
+
== Определение ==
{{nohate}}
 
== Что такое триангуляция Делоне ==
 
 
{{Определение
 
{{Определение
 
|definition=
 
|definition=
'''Подразбиение Делоне''' — такое разбиение плоскости на множество выпуклых фигур, что в окружности, описанной вокруг любой из фигур, не  находится никаких точек.
+
'''Подразбиение Делоне множества точек''' — такое разбиение выпуклой оболочки множества точек на множество выпуклых фигур, что в окружности, описанной вокруг любой из фигур, не  находится никаких точек из множества.
 
}}
 
}}
 
{{Определение
 
{{Определение
 
|definition=
 
|definition=
'''Триангуляция Делоне''' — триангуляция, являющаяся подразбиением Делоне.
+
'''Триангуляция Делоне множества точек''' — триангуляция, являющаяся подразбиением Делоне.
 
}}
 
}}
 +
 
== Существование триангуляции Делоне ==
 
== Существование триангуляции Делоне ==
 
{{Лемма
 
{{Лемма
 +
|about=1
 
|statement=
 
|statement=
 
Окружность, спроецированная на параболоид, находится в одной плоскости. Все точки, лежащие внутри окружности, будут лежать под этой плоскостью. Точки, лежащие вне окружности, будут лежать над плоскостью.
 
Окружность, спроецированная на параболоид, находится в одной плоскости. Все точки, лежащие внутри окружности, будут лежать под этой плоскостью. Точки, лежащие вне окружности, будут лежать над плоскостью.
 
|proof=
 
|proof=
{{TODO|t=Тут будет какой-то определитель спроецированных на параболоид точек}}
+
Рассмотрим окружность с центром в точке <tex>(a, b)</tex> радиуса <tex>r</tex>, она описывается уравнением: <tex>(x - a)^2 + (y - b)^2 = r^2</tex>.
<tex>
+
 
\begin{vmatrix}
+
Раскрывая скобки в уравнении окружности, получим <tex>x^2 - 2ax + a^2 + y^2 - 2by + b^2 = r^2</tex>
x & y \\
+
 
z & v
+
Рассмотрим параболоид, пускай его уравнение имеет вид <tex>x^2 + y^2 = Cz</tex>.
\end{vmatrix}
+
 
</tex>
+
При проецировании, для проекции окружности на параболоид верны оба уравнения: и окружности, и параболоида, поэтому в уравнение окружности вместо <tex>x^2 + y^2</tex> можно подставить <tex>Cz</tex>, получится <tex>(-2a)x + (-2b)y + Cz + (a^2 + b^2 - r^2) = 0</tex>
 +
 
 +
Заметим, что получившееся уравнение является уравнением плоскости: <tex>Ax + By + Cz + D = 0</tex>, то есть, все точки проекции окружности будут лежать в одной плоскости.
 +
 
 +
Рассмотрим любую точку внутри данной окружности. Через нее можно провести окружность с центром в точке <tex>(a, b)</tex> и радиусом <tex>r' < r</tex>, тогда плоскость, проходящая через проекцию этой окружности на параболоид будет иметь уравнение <tex>Ax + By + Cz + D' = 0</tex>, то есть, обе плоскости будут параллельны и вторая плоскость будет лежать под плоскостью окружности (поскольку <tex>r' < r</tex>, то <tex>D' = (a^2 + b^2 - r'^2) > (a^2 + b^2 - r^2) = D</tex>).
 +
 
 +
Аналогично доказывается, что точки лежащие вне окружности лежат над плоскостью.
 +
 
 
}}
 
}}
 
{{Теорема
 
{{Теорема
Строка 27: Строка 34:
 
Подразбиение Делоне существует, причём для каждого набора точек оно единственно.
 
Подразбиение Делоне существует, причём для каждого набора точек оно единственно.
 
|proof=
 
|proof=
Спроецируем все точки на параболоид и построим выпуклую оболочку. По лемме очевидно, что внутри окружностей, описанных вокруг проекций граней выпуклой оболочки, не будет лежать никаких точек. Значит, проекции граней — фигуры подразбиения Делоне. Значит, такое подразбиение существует.  
+
Спроецируем все точки на параболоид и построим выпуклую оболочку.
 +
 
 +
Все грани выпуклой оболочки окажутся внутри параболоида из-за его выпуклости. При этом точки лежат на параболоиде. Поэтому не найдётся точек, которые будут лежать за гранями выпуклой оболочки. То есть все точки, спроецированные на параболоид, будут принадлежать выпуклой оболочке.
 +
 
 +
По лемме 1 очевидно, что внутри окружностей, описанных вокруг проекций граней выпуклой оболочки, не будет лежать никаких точек. Значит, проекции граней — фигуры подразбиения Делоне. Значит, такое подразбиение существует.  
  
 
Из единственности выпуклой оболочки следует, что такое подразбиение единственно.
 
Из единственности выпуклой оболочки следует, что такое подразбиение единственно.
 
}}
 
}}
  
== Некоторые упоительные факты ==
+
== Критерий Делоне для рёбер ==
 
{{Определение
 
{{Определение
|definition='''Критерий Делоне для ребра''' на ребре можно построить такую окружность, что внутри неё не будет лежать никаких точек.
+
|definition='''Критерий Делоне для ребра''': на ребре можно построить такую окружность, что внутри неё не будет лежать никаких точек.
 
}}
 
}}
 
{{Лемма
 
{{Лемма
|statement=Триангуляции Делоне принадлежат те и только те рёбра (с поправкой на точки, лежащие на одной окружности), которые удовлетворяют критерию Делоне
+
|about=2
 +
|statement=Триангуляции Делоне принадлежат те и только те рёбра (с поправкой на точки, лежащие на одной окружности), которые удовлетворяют критерию Делоне.
 
|proof=
 
|proof=
{{TODO|t=А как это вообще доказывается?}}
+
[[Файл:Good edges.png|400px|thumb|right|Для рёбер AB и CD выполняется критерий Делоне, на них построены окружности]]
 +
То, что для рёбер, принадлежащих триангуляции Делоне, выполняется критерий Делоне для рёбер, очевидно (вокруг каждого ребра можно описать окружность, проходящую через противолежащую ему точку в смежном треугольнике, причём в окружности не будет никаких точек по критерию Делоне).
 +
 
 +
Докажем, что если для ребра выполняется критерий Делоне, то оно принадлежит триангуляции Делоне.
 +
 
 +
Предположим, что это ребро (назовём его <tex>AB</tex>) не принадлежит триангуляции Делоне. Тогда существует пересекающее его ребро <tex>CD</tex>, принадлежащее триангуляции. Рассмотрим четырёхугольник <tex>ACBD</tex>. Точки <tex>C</tex> и <tex>D</tex> лежат вне окружности, построенной на <tex>AB</tex> как на хорде, поэтому сумма углов <tex>C</tex> и <tex>D</tex> меньше 180°. Аналогичным образом доказывается, что сумма углов <tex>A</tex> и <tex>B</tex> тоже меньше 180°. Значит, сумма углов четырёхугольника <tex>ACBD</tex> меньше 360°, что невозможно. Противоречие. Значит, ребро <tex>AB</tex> принадлежит триангуляции Делоне.
 
}}
 
}}
 +
 +
== Локальный критерий Делоне ==
 
{{Определение
 
{{Определение
|definition=Ребро назовём '''хорошим''', если для пары треугольников, которым принадлежит это ребро, выполняется критерий Делоне (то есть вершина, противолежащая ребру в одном треугольнике, не лежит в окружности, описанной вокруг другого, и наоборот)
+
|definition='''Локальный критерий Делоне для ребра''': для пары треугольников, которым принадлежит это ребро, выполняется критерий Делоне (то есть вершина, противолежащая ребру в одном треугольнике, не лежит в окружности, описанной вокруг другого, и наоборот).
 
}}
 
}}
 +
Будем называть '''хорошими''' те рёбра, для которых выполняется локальный критерий Делоне.
 
{{Лемма
 
{{Лемма
 +
|about=3
 +
|id=fliplemma
 
|statement=
 
|statement=
Из двух рёбер, которые можно провести для пары треугольников, как минимум одно хорошее
+
Из двух рёбер, которые можно провести для пары треугольников, как минимум одно хорошее.
 
|proof=
 
|proof=
Спроецируем четыре точки на параболоид. Очевидно, что по ним можно построить четырёхугольник {{Acronym|двумя способами: в первом случае он будет «вогнутым», во втором — «выпуклым»|Если все четыре точки лежат на одной окружности, то оба ребра будут хорошими, так как четырёхугольник можно будет построить только один}}. По доказанному выше факту про окружность, спроецированную на параболоид, выпуклое ребро будет хорошим.
+
[[Файл:Bad edges.png|400px|thumb|right|Рёбра AB и BC плохие]]
 +
Предположим, что это не так, то есть оба ребра (назовём их <tex>AB</tex> и <tex>CD</tex>) плохие. Рассмотрим четырёхугольник <tex>ACBD</tex> и окружность, описанную вокруг треугольника <tex>ABC</tex>. Точка <tex>D</tex> лежит внутри этой окружности, значит, сумма углов <tex>C</tex> и <tex>D</tex> больше 180°. Аналогично доказывается, что сумма углов <tex>A</tex> и <tex>B</tex> больше 180°. Значит, сумма углов четырёхугольника <tex>ACBD</tex> больше 360°, что невозможно.
 
}}
 
}}
 
{{Лемма
 
{{Лемма
 +
|about=4
 
|statement=
 
|statement=
Если все рёбра хорошие, то и триангуляция хорошая
+
Если для всех рёбер выполняется локальный критерий Делоне, то выполняется и глобальный критерий Делоне.
 
|proof=
 
|proof=
Ну предположим, что это не так, то есть все рёбра хорошие, но существует треугольник, описанная окружность которого содержит какие-либо точки триангуляции. Тогда очевидно, что одно из рёбер этого треугольника окажется плохим. Противоречие.
+
[[Файл:Bad triangle.png|400px|thumb|right|Все рёбра треугольника хорошие, но описанная окружность содержит точки]]
 +
Предположим, что это не так, то есть все рёбра хорошие, но существуют треугольники, описанная окружность которых содержат какие-либо точки триангуляции. Возьмём какую-либо конфликтную точку <tex>E</tex>. Рассмотрим такой треугольник <tex>ABC</tex> из тех, в описанную окружность которых попадает <tex>E</tex>, что угол <tex>BEC</tex> максимален, если <tex>BC</tex> — ближайшая к точке <tex>E</tex> сторона. Пусть треугольник <tex>BDC</tex> — смежный с <tex>ABC</tex>.
 +
 
 +
Докажем, что точка <tex>E</tex> лежит в окружности, описанной вокруг <tex>BDC</tex>. Предположим, что это не так. Посмотрим на окружность, описанную вокруг треугольника <tex>ABC</tex>: <tex>\angle BAC + \angle BEC > 180^\circ</tex> и <tex>\angle BAC + \angle BDC < 180^\circ</tex>. Если точка <tex>E</tex> не лежит в окружности, описанной вокруг треугольника <tex>BDC</tex>, то <tex>\angle BEC < \angle BDC</tex>, что противоречит предыдущим двум неравенствам.
 +
 
 +
Очевидно, что угол <tex>BED</tex> больше, чем угол <tex>BEC</tex>. При этом точка <tex>E</tex> лежит в окружности, описанной вокруг <tex>BDC</tex>. Значит, при выборе треугольника нужно было взять не <tex>ABC</tex>, а <tex>BDC</tex>. Противоречие.
 
}}
 
}}
 +
 +
== Динамическая триангуляция ==
 
{{Определение
 
{{Определение
 
|definition=
 
|definition=
Для пары смежных треугольников '''flip''' — убирание смежного ребра и проведение другого
+
Рассмотрим пару смежных треугольников. Рёбра этих треугольников образуют четырёхугольник с проведённой в нём диагональю. Операция замены этой диагонали на другую называется '''flip''' ('''флип''').
 +
}}
 +
[[Файл:Flip.png|400px|thumb|right|Красное ребро до флипа, синее — после]]
 +
Из [[#fliplemma|леммы 3]] следует, что если ребро плохое, то флип сделает его хорошим.
 +
{{Лемма
 +
|about=5
 +
|statement=Флип плохого ребра уменьшает разность объёмов параболоида и триангуляции, спроецированной на него.
 +
|id=volumelemma
 +
|proof=
 +
Рассмотрим два таких смежных треугольника, что ребро между ними является плохим. Спроецируем их на параболоид. Четыре точки, принадлежащие смежным треугольникам, при проекции на параболоид образуют тетраэдр.
 +
 
 +
Проведём через какой-нибудь из двух треугольников плоскость. Вершина, противолежащая основанию тетраэдра, являющегося этим треугольником, лежит ниже этой плоскости (так как не выполняется локальный критерий Делоне), то есть тетраэдр лежит ниже тела, образующегося при проекции всей триангуляции на параболоид.
 +
 
 +
После флипа станет выполняться локальный критерий Делоне, то есть тело станет включать в себя тетраэдр. Поэтому после флипа плохого ребра объём тела увеличится на объём этого тетраэдра.
 
}}
 
}}
Из первой леммы следует, что, если ребро плохое, то флип сделает его хорошим.
 
 
{{Лемма
 
{{Лемма
 +
|about=6
 
|statement=
 
|statement=
Флипами можно достичь хорошей триангуляции за конечное время
+
Флипами можно достичь хорошей триангуляции за конечное время.
 
|proof=
 
|proof=
Очевидно, потому что каждый флип уменьшает разность объёмов параболоида и триангуляции, спроецированной на него.
+
Всего триангуляций заданного множества точек конечное число, и среди них есть триангуляция Делоне. Последовательность флипов плохих рёбер триангуляции образует такую последовательность триангуляций, что разность объёмов параболоида и спроецированной на него триангуляции убывает ([[#volumelemma|по лемме 5]]). Эта последовательность конечна (при этом последней в последовательности является триангуляция Делоне), значит, число флипов, требуемых для достижения триангуляции Делоне, тоже конечно.
 
}}
 
}}
 +
{{Лемма
 +
|about=7
 +
|statement=
 +
Если в триангуляцию Делоне вставить точку в некоторый треугольник и соединить его вершины с этой точкой, то получившиеся рёбра будут хорошими.
 +
|id=newedgeslemma
 +
|proof=
 +
[[Файл:Good edge.png|400px|thumb|right|Точка V вставлена в треугольник ABC]]
 +
Предположим, точка была вставлена не на ребро. Рассмотрим любое из рёбер — пусть это будет ребро <tex>VC</tex>. Проведём окружность, описывающую треугольник <tex>ABC</tex>. По критерию Делоне в ней не будет никаких точек триангуляции. На ребре <tex>VC</tex> можно построить окружность, изнутри касающуюся окружности, описанной вокруг треугольника. В ней тоже нет никаких точек. Значит, для <tex>VC</tex> выполняется критерий Делоне для рёбер, то есть, оно хорошее.
  
== Динамическая триангуляция ==
+
Случай, когда точка вставляется на ребро, рассматривается аналогично.
 +
}}
 
=== Вставка точки ===
 
=== Вставка точки ===
 
==== Вставка точки, лежащей внутри триангуляции ====
 
==== Вставка точки, лежащей внутри триангуляции ====
{{TODO|t=Надо бы вставить сюда картинки}}
+
[[Файл:Insert in triangle.png|200px|thumb|left|Вставка в треугольник]]
 +
[[Файл:Insert on edge.png|200px|thumb|right|Вставка на ребро]]
  
Для начала локализуемся: поймём, в каком фейсе лежит точка (или на каком ребре). Вставляем. Итого у нас появилось несколько новых рёбер. Они все хорошие ({{TODO|t=Доказать, почему}}), плохими могут оказаться только рёбра, противолежащие вставленной точке. Флипаем рёбра, пока триангуляция не станет хорошей.
+
Для начала локализуемся: поймём, в каком фейсе лежит точка (или на каком ребре).
 +
 
 +
Если точка лежит внутри фейса, добавляем три ребра, сам фейс превращаем в один из новых смежных с вставляемой точкой и добавялем ещё два фейса.
 +
 
 +
Если же точка лежит на ребре, два смежных с ребром фейса превращаем в два новых, добавляем ещё два, а так же превращаем ребро, на которое вставляется точка, в ребро, которое заканчивается в этой точке, и вставляем три новых.
 +
 
 +
Итого у нас появилось несколько новых рёбер. Они все хорошие (по [[#newedgeslemma|лемме 7]]), плохими могут оказаться только рёбра, противолежащие вставленной точке. Флипаем рёбра, пока триангуляция не станет хорошей.
  
Среднее число флипов — <tex>O(1)</tex> ({{TODO|t=Доказать, почему}}). Поэтому время вставки целиком зависит от времени локализации.
 
 
==== Вставка точки, лежащей снаружи триангуляции ====
 
==== Вставка точки, лежащей снаружи триангуляции ====
 
Представим, что вне триангуляции — бесконечные треугольники, основания которых — рёбра выпуклой оболочки триангуляции, а противолежащая ребру вершина — это бесконечно удалённая точка. Тогда понятно, что вставка точки, не лежащей в триангуляции, сведётся к вставке точки внутрь триангуляции, если мы научимся обрабатывать бесконечные фейсы.
 
Представим, что вне триангуляции — бесконечные треугольники, основания которых — рёбра выпуклой оболочки триангуляции, а противолежащая ребру вершина — это бесконечно удалённая точка. Тогда понятно, что вставка точки, не лежащей в триангуляции, сведётся к вставке точки внутрь триангуляции, если мы научимся обрабатывать бесконечные фейсы.
  
{{TODO|t=Написать про бесконечно удалённую точку}}
+
Бесконечно удалённая точка имеет координаты <tex>(0,0,1,0)</tex> (последняя координата — однородная).
 +
 
 +
Тогда проверка на то, является ли хорошим ребро, инцидентное бесконечно удалённой точке, упрощается:
 +
<tex>
 +
\begin{vmatrix}
 +
a_x & a_y & a_x^2 + a_y^2 & 1 \\
 +
b_x & b_y & b_y^2 + b_y^2 & 1 \\
 +
c_x & c_y & c_x^2 + c_y^2 & 1 \\
 +
0  & 0  & 1            & 0
 +
\end{vmatrix} = \begin{vmatrix}
 +
a_x & a_y & 1 \\
 +
b_x & b_y & 1 \\
 +
c_x & c_y & 1
 +
\end{vmatrix}
 +
</tex>, то есть достаточно проверить поворот трёх остальных точек образованного двумя бесконечными треугольниками четырёхугольника.
 +
 
 +
Проверка, принадлежит ли точка бесконечному треугольнику, тоже проста: нужно, чтобы из точки было видно ребро, противолежащее бесконечно удалённой точке, в бесконечном треугольнике. Это проверяется предикатом поворота.
 +
 
 +
==== Время работы ====
 +
{{Лемма
 +
|about=8
 +
|statement=
 +
При вставке точки будут флипаться только рёбра, противолежащие вставленной точке.
 +
|proof=
 +
[[Файл:Flip edges.png|400px|thumb|right|V — вставленная точка, ребро AC — плохое]]
 +
Доказательство по индукции.
 +
 
 +
База. По [[#newedgeslemma|лемме 7]] изначально не будут флипаться новые рёбра, инцидентные точке, то есть плохими могут оказаться только рёбра, противолежащие точке.
 +
 
 +
Переход. Рассмотрим, что произойдёт с противолежащим точке <tex>V</tex> ребром <tex>AC</tex> после флипа, если оно плохое. До вставки точки <tex>V</tex> для триангуляции выполнялся глобальный критерий Делоне, поэтому в окружности, описанной вокруг треугольника <tex>ACD</tex>, не будет лежать никаких точек, кроме точки <tex>V</tex>. Можно построить окружность, касающуюся её изнутри в точке <tex>D</tex> и проходящую через точку <tex>V</tex>. В ней тоже не окажется никаких точек, так как она касается изнутри. Значит, для ребра <tex>VD</tex> выполняется критерий Делоне. Значит, после флипа ребро <tex>AC</tex> уже не будет флипаться. Так как для рёбер <tex>AV</tex> и <tex>CV</tex> выполняется критерий Делоне, то плохими после флипа могут стать только рёбра <tex>AD</tex> и <tex>CD</tex> — то есть рёбра, противолежащие точке <tex>V</tex>.
 +
}}
 +
{{Лемма
 +
|about=9
 +
|statement=
 +
Средняя степень вершины после вставки её в триангуляцию Делоне равна <tex>O(1)</tex>.
 +
|id=deglemma
 +
|proof=
 +
Предположим, что мы вставляем <tex>i+1</tex>-ую точку из последовательности из <tex>n</tex> точек. Рассмотрим все перестановки из этих <tex>i+1</tex> точек, означающие порядок вставки этих точек. Всего таких перестановок <tex>(i+1)!</tex>. Тогда средняя степень последней вершины среди перестановок равна:
 +
 
 +
<tex>E(\operatorname{deg}(v_{i+1}))=\frac {\sum_{p=perm(v_1, v_2, ..., v_{i+1})} \operatorname{deg} (p[i+1])} {(i+1)!}</tex>
 +
 
 +
Каждая из <tex>i+1</tex> вершин побывает последней ровно <tex>i!</tex> раз, поэтому:
 +
 
 +
<tex>E(\operatorname{deg} (v_{i+1}))=\frac {\sum_{k=0}^{i} i! \operatorname{deg} (v_k)} {(i+1)!} = \frac {\sum_{k=0}^i \operatorname{deg}(v_k)} {i+1} = \frac {O(i+1)} {i+1} = O(1)</tex>
 +
}}
 +
{{Теорема
 +
|statement=
 +
При вставке точки в триангуляцию Делоне в среднем придётся сделать <tex>O(1)</tex> флипов.
 +
|id=flipnumberlemma
 +
|proof=
 +
Все флипнутые рёбра окажутся инцидентными вставленной точке (по лемме 8), а [[#deglemma|степень вершины — <tex>O(1)</tex> (по лемме 9)]]. Поэтому будет сделано <tex>O(1)</tex> флипов.
 +
}}
 +
Так как среднее число флипов — <tex>O(1)</tex>, то время вставки целиком зависит от времени локализации.
  
 
=== Удаление точки ===
 
=== Удаление точки ===
При удалении точки получится {{Acronym|звёздный многоугольник, который можно затриангулировать за линию|Почему на эту тему нет конспекта? Я не собираюсь тут это доказывать}}. Дальше по традиции флипаем всё, что могло стать плохим, пока не получим хорошую триангуляцию.
+
==== Алгоритм ====
 +
При удалении точки получится {{Acronym|звёздный многоугольник, который можно затриангулировать за линию|Общеизвестный факт}}. При этом все рёбра, полученные в результате триангуляции звёздного многоугольника, могут оказаться плохими, поэтому необходимо пройтись по ним и пофлипать, если нужно.
 +
==== Время работы ====
 +
{{Acronym|Средняя степень вершины в триангуляции — <tex>O(1)</tex>|Общеизвестный факт}}, поэтому триангуляция звёздного многоугольника будет тоже за <tex>O(1)</tex>. Новых рёбер получится <tex>O(1)</tex>, проверить их на локальный критерий Делоне и пофлипать тоже можно за <tex>O(1)</tex>. Итого удаление точки работает за <tex>O(1)</tex>.
  
Средняя степень вершины в триангуляции — <tex>O(1)</tex> ({{TODO|t=Почему?}}), поэтому триангуляция звёздного многоугольника будет тоже за <tex>O(1)</tex>. С флипами всё тоже, в общем-то, хорошо. Итого удаление точки работает за <tex>O(1)</tex>.
+
== Локализационная структура ==
 +
=== Cтруктура ===
 +
Локализационная структура состоит из нескольких уровней, где каждый уровень — это триангуляция Делоне. На нижнем уровне содержатся все точки. Каждая точка с вероятностью <tex>p</tex> проходит на следующий уровень (причём если точка — единственная на последнем уровне, то дальше она не пройдёт).
  
== Локализационная структура ==
+
Уровни связаны между собой следующим образом: на уровне <tex>i</tex> каждая точка содержит указатель на себя же на уровне <tex>i-1</tex>.
=== Сама структура ===
+
=== Алгоритм локализации ===
В общем-то, довольно стандартная схема для рандомизированных структур: на нижнем уровне содержатся все точки; каждая точка с вероятностью p проходит на следующий уровень.
 
=== Локализация ===
 
 
Как происходит локализация: нам дают точку <tex>v_{i+1}</tex>, которая на предыдущем уровне была ближайшей к точке <tex>q</tex>, которую мы локализуем. Нужно получить следующую точку <tex>v_i</tex>, которая будет ближайшей уже на этом уровне. Делается это следующим образом:
 
Как происходит локализация: нам дают точку <tex>v_{i+1}</tex>, которая на предыдущем уровне была ближайшей к точке <tex>q</tex>, которую мы локализуем. Нужно получить следующую точку <tex>v_i</tex>, которая будет ближайшей уже на этом уровне. Делается это следующим образом:
 
* Находим, в каком из треугольников, смежных с <tex>v_{i+1}</tex>, лежит отрезок <tex>v_{i+1} q</tex>
 
* Находим, в каком из треугольников, смежных с <tex>v_{i+1}</tex>, лежит отрезок <tex>v_{i+1} q</tex>
 
* Находим, какие рёбра треугольников пересекает <tex>v_{i+1} q</tex>, в итоге находим треугольник, в котором лежит <tex>q</tex>
 
* Находим, какие рёбра треугольников пересекает <tex>v_{i+1} q</tex>, в итоге находим треугольник, в котором лежит <tex>q</tex>
 
* Находим ближайшую к <tex>q</tex> точку. Первым кандидатом на то, чтобы быть ближайшей точкой, становится ближайшая к <tex>q</tex> вершина найденного в предыдущем пункте треугольника. Для каждого кандидата нужно просмотреть смежные вершины в поиске точки, которая находится ближе к <tex>q</tex> — эта точка становится следующим кандидатом. Если же среди соседей точки не нашлось более близких, значит, эта точка и есть ближайшая.
 
* Находим ближайшую к <tex>q</tex> точку. Первым кандидатом на то, чтобы быть ближайшей точкой, становится ближайшая к <tex>q</tex> вершина найденного в предыдущем пункте треугольника. Для каждого кандидата нужно просмотреть смежные вершины в поиске точки, которая находится ближе к <tex>q</tex> — эта точка становится следующим кандидатом. Если же среди соседей точки не нашлось более близких, значит, эта точка и есть ближайшая.
 +
=== Корректность алгоритма ===
 +
{{Теорема
 +
|statement=Данный алгоритм найдёт ближайшую точку.
 +
|proof=
 +
[[Файл:Delaunay localization.png|400px|thumb|right|Ребро vv' должно принадлежать триангуляции]]
 +
Предположим, что это не так. Назовём локализуемую точку <tex>q</tex>, а последнего кандидата на то, чтобы быть ближайшей точкой — <tex>v</tex>. Раз эта точка на самом деле не ближайшая, то в окружности, проходящей через <tex>v</tex>, с центром в точке <tex>q</tex> найдутся ещё какие-то точки, не смежные с <tex>v</tex>. Проведём через каждую из них окружность, касающуюся изнутри в точке <tex>v</tex> изначальную окружность. Рассмотрим точку <tex>v'</tex>, через которую проходит наименьшая окружность из построенных. В этой окружности не будет лежать никаких точек, так как мы взяли наименьшую. Значит, ребро <tex>vv'</tex> удовлетворяет критерию Делоне и должно являться ребром триангуляции (по лемме 2), но по предположению этого ребра нет. Значит, предположение неверно.
 +
}}
 +
 +
=== Время работы, требуемая память ===
 +
==== Память ====
 +
{{Лемма
 +
|about=10
 +
|statement=
 +
Матожидание числа уровней в локализационной структуре — <tex>O(\log n)</tex>.
 +
|id=levelslemma
 +
|proof=
 +
Для оценки матожидания посчитаем вероятность того, что количество уровней <tex>h</tex> равно <tex>k</tex> при вероятности пройти на следующий уровень равной <tex>p</tex>.
 +
 +
<tex>p(h \leq k) = (1 - p^{k + 1})^n</tex>, потому что вероятность того, что точка дойдёт до уровня <tex>k + 1</tex>, равна <tex>p^{k + 1}</tex>.
 +
 +
<tex>p(h \geq k) = (1 - (1 - p^k)^n)</tex>, потому что вероятность того, что точка не дойдёт до уровня <tex>k</tex>, равна <tex>1 - p^k</tex>.
 +
 +
<tex>p(h = k) = 1 - p(h > k) - p(h < k) = 1 - (1 - (1 - p^{k + 1})^n) - (1 - p^{k})^n = (1 - p^{k + 1})^n - (1 - p^k)^n \leq 1 - (1 - p^k)^n \leq np^k</tex>
 +
 +
<tex>E(h) = \sum\limits_{k = 1}^{\infty} k \cdot p(h = k) = p(1) \cdot 1 + \dots + p(\log_{1/p} n) \cdot \log_{1/p} n + \sum\limits_{k = \log_{1/p} n + 1}^{\infty} k \cdot p(k)</tex>
 +
 +
Оценим первую сумму:
 +
 +
<tex>p(1) \cdot 1 + \dots + p(\log_{1/p} n) \cdot \log_{1/p} n \leq p(1) \cdot \log_{1/p} n + \dots + p(\log_{1/p} n) \cdot \log_{1/p} n = O(\log(n))</tex>, поскольку сумма этих вероятностей не превосходит единицу.
 +
 +
Оценим вторую сумму:
 +
 +
<tex>\sum\limits_{k = \log_{1/p} n + 1}^{\infty} k \cdot p(k) \leq \sum\limits_{k = \log_{1/p} n}^{\infty} k \cdot n p^k = n \cdot \sum\limits_{k = \log_{1/p} n}^{\infty} k \cdot p^k</tex>
 +
 +
Рассмотрим эту сумму:
 +
 +
<tex>\sum\limits_{k = \log_{1/p} n}^{\infty} k \cdot p^k = p^{\log_{1/p} n} \cdot \sum\limits_{k = 0}^{\infty} (k + \log_{1/p} n) \cdot p^k = p^{\log_{1/p} n} \cdot (\sum\limits_{k = 0}^{\infty} (k p^k) + \log_{1/p} n \cdot \sum\limits_{k = 0}^{\infty} (p^k)) =  p^{\log_{1/p} n} \cdot (O(1) + \log_{1/p} n \cdot O(1)) = 1/n \cdot O(\log(n))</tex>
  
 +
Суммируя всё вышесказанное, получаем, что <tex>O(\log(n))</tex>.
 +
}}
 
{{Теорема
 
{{Теорема
|statement=Данный алгоритм найдёт ближайшую точку.
+
|statement=
 +
Локализационная структура занимает <tex>O(n)</tex> памяти.
 +
|proof=
 +
Триангуляция для <tex>n</tex> точек занимает <tex>O(n)</tex> памяти. На нулевом уровне <tex>n</tex> точек. На уровне <tex>k</tex> точек <tex>m_k=p \cdot m_{k-1}</tex>. Получим геометрическую прогрессию, сумма которой равна <tex>O(n)</tex>.
 +
}}
 +
 
 +
==== Время работы ====
 +
{{Лемма
 +
|about=11
 +
|statement=Каждая точка на плоскости может являться ближайшей для не более чем шести точек.
 +
|id=closestlemma
 +
|proof=
 +
[[Файл:Closest deg.png|400px|thumb|right|Точка ''u'' является ближайшей для семи точек]]
 +
 
 +
Предположим, что это не так.
 +
 
 +
Пусть некоторая точка <tex>u</tex> является ближайшей для семи точек. Соединим эти семь точек с точкой <tex>u</tex> отрезками и рассмотрим минимальный из углов, который образуют проведённые отрезки <tex>vu</tex> и <tex>wu</tex>. Этот угол <tex>\alpha</tex> меньше 60° (иначе все семь углов больше либо равны 60° и их сумма больше 360°).
 +
 
 +
Так как точка <tex>u</tex> ближайшая для точек <tex>v</tex> и <tex>w</tex>, то <tex>vw</tex> — наибольшая сторона в треугольнике <tex>vwu</tex>. В треугольнике наибольшая сторона лежит напротив наибольшего угла. Но напротив стороны <tex>vw</tex> лежит угол меньше 60°, значит, сумма углов треугольника меньше 180°. Противоречие. Значит, предположение неверно.
 +
}}
 +
{{Лемма
 +
|about=12
 +
|statement=Для заданной точки <tex>q</tex> на <tex>k</tex>-ом уровне средняя степень ближайшей на <tex>k+1</tex>-ом уровне вершины равна <tex>O(1)</tex>.
 +
|id=nearestdegreelemma
 +
|proof=
 +
 
 +
''Функция <tex>nn</tex> принимает точку и множество и возвращает ближайшего соседа заданной точки из заданного множества.''
 +
 
 +
Рассмотрим некоторый уровень <tex>S_k</tex>. Определим множество <tex>R_k=S_k\cup\{q\}</tex>. Рассмотрим все возможные подмножества  <tex>R_k</tex>, равномощные <tex>R_{k+1}</tex>, тем самым рассмотрев все возможные уровни <tex>k+1</tex>. Для каждой точки из каждого подмножества <tex>R'_{k+1}</tex> рассмотрим степень ближайшей вершины и усредним всё, получив нужную нам оценку.
 +
 
 +
<tex>E(\operatorname{deg_{S_k}} (\operatorname{nn} (q, S_{k+1}))) = \frac {1} {C^{|R_{k+1}|}_{|R_k|}} \cdot \sum\limits_{R'_{k+1}\subset R_k} \frac {1} {|R_{k+1}|} \sum\limits_{a_i \in R'_{k+1}} \operatorname{deg_{R_k}} (\operatorname{nn}(a_i,R'_{k+1}\backslash\{a_i\})) </tex>
 +
 
 +
Назовём графом <tex>NN(\{a_i\})</tex> двудольный граф, в левой и правой долях содержащий точки <tex>\{a_i\}</tex>, рёбра <tex>uv</tex> которого означают, что точка <tex>v</tex> является ближайшей для точки <tex>u</tex> (точка <tex>u</tex> лежит в левой доли, точка <tex>v</tex> лежит в правой доли).
 +
 
 +
Понятно, что <tex>\sum\limits_{a_i \in R'_{k+1}} \operatorname {deg_{R_k}} (\operatorname{nn}(a_i, R'_{k+1}\backslash\{a_i\})) = \sum\limits_{a_i\in R'_{k+1}} \operatorname{deg_{R_k}}(a_i) \cdot \operatorname{deg_{NN(R'_{k+1})}}(a_i)</tex>, так как степень каждой вершины <tex>a_i</tex> учтётся ровно столько раз, сколько рёбер ей инцидентно в правой доли графа <tex>NN</tex>.
 +
 
 +
<tex>E(\operatorname{deg_{S_k}} (\operatorname{nn} (q, S_{k+1}))) = \frac {1} {C^{|R_{k+1}|}_{|R_k|}} \sum\limits_{R'_{k+1}\subset R_k} \frac {1} {|R_{k+1}|} \sum\limits_{a_i\in R'_{k+1}} \operatorname{deg_{R_k}}(a_i) \operatorname{deg_{NN(R'_{k+1})}}(a_i)</tex>
 +
 
 +
По [[#closestlemma|лемме 11]] степень вершины из правой доли графа <tex>NN</tex> не может быть больше шести.
 +
 
 +
<tex>E(\operatorname{deg_{S_k}} (\operatorname{nn} (q, S_{k+1}))) \le \frac {1} {C^{|R_{k+1}|}_{|R_k|}} \sum\limits_{R'_{k+1}\subset R_k} \frac {1} {|R_{k+1}|} \sum\limits_{a_i\in R'_{k+1}} \operatorname{deg_{R_k}}(a_i) \cdot 6 = \frac {6} {C^{|R_{k+1}|}_{|R_k|} \cdot |R_{k+1}|} \sum\limits_{R'_{k+1}\subset R_k} \sum\limits_{a_i\in R'_{k+1}} \operatorname{deg_{R_k}} (a_i) =
 +
6 \cdot \frac {\sum_{a_i\in R_k} \operatorname{deg}(a_i)} {|R_k|} = O(1)
 +
</tex>
 +
}}
 +
{{Лемма
 +
|about=13
 +
|statement=Среднее число точек, лежащих в окружности с центром в точке <tex>q</tex> и проходящей через <tex>v_{i+1}</tex>, равно <tex>O(1)</tex>.
 +
|id=diskvertexeslemma
 +
|proof=
 +
Рассмотрим точки триангуляции <tex>\{a_i\}</tex>. Для каждой точки <tex>a_i</tex> построим окружность с центром в точке <tex>a_i</tex>, проходящую через ближайшую к ней точку. Докажем, что заданная точка <tex>w</tex> попадёт в <tex>O(1)</tex> таких окружностей на предыдущем уровне. Разделим плоскость на шесть частей прямыми, проходящими через точку <tex>w</tex>. Рассмотрим одну из частей. Отсортируем все точки, попавшие в неё, по увеличению расстояния до <tex>w</tex>. Получим такую последовательность точек <tex>\{a_0, a_1, ...\}</tex>, что <tex>|wa_i|\le|wa_{i+1}|</tex>. Заметим, что если какая-нибудь точка <tex>a_i</tex> содержится на предыдущем уровне, то все точки, начиная с <tex>a_{i+1}</tex> уже не содержат в своей окружности точку <tex>w</tex>. Таким образом, среднее число точек <tex>k</tex>, в окружности которых содержится точка <tex>w</tex>:
 +
 
 +
<tex>E(k)\le6\cdot\sum_i i(1-p)^i p = O(1)</tex>
 +
 
 +
Таким образом, каждая точка содержится в <tex>O(1)</tex> окружностей, значит, каждая окружность содержит <tex>O(1)</tex> точек.
 +
}}
 +
{{Лемма
 +
|about=14
 +
|statement=Среднее число рёбер, пересечённое отрезком <tex>qv_{i+1}</tex> во втором этапе алгоритма локализации, равно <tex>O(1)</tex>.
 +
|id=edgeslemma
 +
|proof=
 +
Рассмотрим рёбра, пересекающие <tex>qv_{i+1}</tex>, для которых хотя бы одна из граничных точек окажется в окружности с центром в точке <tex>q</tex>, проходящей через <tex>v_{i+1}</tex>. Число таких рёбер не превосходит суммы степеней вершин, лежащих внутри окружности. А [[#diskvertexeslemma|по лемме 13]] число таких точек равно <tex>O(1)</tex>. При этом средняя степень вершины равна <tex>O(1)</tex>. Таким образом, число таких рёбер равно <tex>O(1)</tex>.
 +
 
 +
Докажем, что число рёбер, пересекающих <tex>qv_{i+1}</tex>, для которых обе граничные точки лежат вне окружности, тоже равно <tex>O(1)</tex>. При вставке точки <tex>q</tex> в триангуляцию для этих рёбер перестанет выполняться критерий Делоне: в любой окружности, построенной на ребре как на хорде, будет содержаться либо точка <tex>q</tex>, либо точка <tex>v_{i+1}</tex>. Поэтому эти рёбра придётся флипнуть. Число флипов при вставке точки [[#flipnumberlemma|равно <tex>O(1)</tex>]], поэтому число таких рёбер равно <tex>O(1)</tex>.
 +
 
 +
Итого число рёбер, пересекающих <tex>qv_{i+1}</tex>, равно <tex>O(1)</tex>.
 +
}}
 +
{{Лемма
 +
|about=15
 +
|statement=Среднее число треугольников, посещённых на третьем этапе алгоритма локализации, равно <tex>O(1)</tex>.
 +
|id=triangleslemma
 
|proof=
 
|proof=
{{TODO|t=Картинку для ясности}}
+
Каждый рассмотренный треугольник имеет хотя бы одну вершину внутри окружности, проведённой через <tex>v_{i+1}</tex>, с центром в точке <tex>q</tex>. То есть число таких треугольников не больше числа точек внутри этой окружности. Таких точек [[#diskvertexeslemma|по лемме 13]] <tex>O(1)</tex>, значит, число треугольников тоже равно <tex>O(1)</tex>.
Предположим, что это не так. Назовём локализуемую точку <tex>q</tex>, а последнего кандидата на то, чтобы быть ближайшей точкой — <tex>v</tex>. Раз эта точка на самом деле не ближайшая, то в окружности, проходящей через <tex>v</tex>, с центром в точке <tex>q</tex> найдутся ещё какие-то точки, не смежные с <tex>v</tex>. Рассмотрим ближайшую из них к <tex>v</tex>: точку <tex>v'</tex>. Построим на <tex>vv'</tex> окружность как на диаметре. В этой окружности не будет лежать никаких точек, так как мы взяли ближайшую. Значит, ребро <tex>vv'</tex> удовлетворяет критерию Делоне и должно являться ребром триангуляции, но по предположению этого ребра нет. Значит, предположение неверно.
 
 
}}
 
}}
 +
{{Лемма
 +
|about=16
 +
|statement=
 +
Локализация точки на каждом уровне происходит за <tex>O(1)</tex>.
 +
|id=onelevellemma
 +
|proof=
 +
Докажем, что каждый этап локализации происходит за <tex>O(1)</tex>.
 +
 +
'''1 этап''': [[#nearestdegreelemma|по лемме 12]] средняя степень вершины <tex>v_{i+1}</tex> равна <tex>O(1)</tex>, поэтому треугольников, в которых может лежать отрезок <tex>qv_{i+1}</tex> тоже <tex>O(1)</tex>. Просмотрев их все, за <tex>O(1)</tex> можно понять, в каком из них лежит отрезок <tex>qv_{i+1}</tex>.
  
=== Профит ===
+
'''2 этап''': число рёбер, пересечённых отрезком <tex>qv_{i+1}</tex>, равно <tex>O(1)</tex> ([[#edgeslemma|по лемме 14]]). Поэтому этот этап локализации тоже происходит за <tex>O(1)</tex>.
{{TODO|t=Время работы, требуемая память}}
+
 
 +
'''3 этап''': число треугольников, посещённых на третьем этапе локализации, равно <tex>O(1)</tex> ([[#triangleslemma|по лемме 15]]).
 +
}}
 +
{{Теорема
 +
|statement=
 +
Локализация точки в триангуляции происходит за <tex>O(\log n)</tex>.
 +
|proof=
 +
Очевидное следствие из [[#levelslemma|леммы 10]] и [[#onelevellemma|леммы 16]].
 +
}}
  
 
== Constraints ==
 
== Constraints ==
 
{{Определение
 
{{Определение
 
|definition=
 
|definition=
'''Констрейнты''' — рёбра, которые нельзя флипать
+
'''Констрейнты''' — рёбра, которые нельзя флипать.
 
}}
 
}}
 
{{Утверждение
 
{{Утверждение
 
|statement=
 
|statement=
Хорошая триангуляция с констрейнтом может быть хорошей с точностью до видимости через констрейнт
+
Хорошая триангуляция с констрейнтом может быть хорошей с точностью до видимости через констрейнт.
 
}}
 
}}
 
=== Вставка ===
 
=== Вставка ===
Смотрим на список рёбер, пересечённых ещё не вставленным констрейнтом ({{TODO|t=Картинку бы}}), и флипаем их. Последнее флипнутое ребро и будет констрейнтом {{Acronym|(по понятным причинам)|Рёбра, пересечённые констрейнтом, после флипа будут начинаться в той же точке, что и констрейнт, а заканчиваться в точке, в которой начинается ещё одно пересекающее ребро. Последнее же ребро будет начинаться и заканчиваться в начале и конце констрейнта}}, после флипа пометим его как констрейнт. Понятное дело, критерий «хорошести» ребра при таких фокусах немного изменится: туда добавится проверка на то, не является ли ребро констрейнтом. Затем флипаем всё, что могло стать плохим (кроме констрейнта), пока триангуляция вновь не станет условно хорошей.
+
[[Файл:Constraint.png|400px|thumb|right|Красным выделен вставляемый констрейнт]]
 
+
Смотрим на список рёбер, пересечённых ещё не вставленным констрейнтом, и флипаем их. Последнее флипнутое ребро и будет констрейнтом {{Acronym|(по понятным причинам)|Рёбра, пересечённые констрейнтом, после флипа будут начинаться в той же точке, что и констрейнт, а заканчиваться в точке, в которой начинается ещё одно пересекающее ребро. Последнее же ребро будет начинаться и заканчиваться в начале и конце констрейнта}}, после флипа пометим его как констрейнт. Затем флипаем всё, что могло стать плохим (кроме констрейнта), пока триангуляция вновь не станет хорошей.
{{TODO|t=Тут должно быть ещё несколько упоительных фактов про то, что вставка производится за <tex>O(k^2)</tex>, где <tex>k</tex> — число пересечённых рёбер, и про то, что, если флипать что попало, можно нарваться на флип в невыпуклом многоугольнике}}
 
 
 
 
=== Удаление ===
 
=== Удаление ===
Аналогично: помечаем ребро как не-констрейнт и начинаем флипать, пока не дойдём до хорошей (или условно хорошей) триангуляции.
+
Аналогично: помечаем ребро как не-констрейнт и флипаем, пока не дойдём до хорошей триангуляции.
 
 
Работает оно столько же, сколько и вставка, ибо всё, что мы нафлипали при вставке, нужно перефлипать обратно.
 
 
 
=== Констрейнты в локализационной структуре ===
 
В локализационную структуру констрейнты нужно вставлять только на нижний уровень, ибо выше они нафиг не нужны.
 

Текущая версия на 19:17, 4 сентября 2022

Определение

Определение:
Подразбиение Делоне множества точек — такое разбиение выпуклой оболочки множества точек на множество выпуклых фигур, что в окружности, описанной вокруг любой из фигур, не находится никаких точек из множества.


Определение:
Триангуляция Делоне множества точек — триангуляция, являющаяся подразбиением Делоне.


Существование триангуляции Делоне

Лемма (1):
Окружность, спроецированная на параболоид, находится в одной плоскости. Все точки, лежащие внутри окружности, будут лежать под этой плоскостью. Точки, лежащие вне окружности, будут лежать над плоскостью.
Доказательство:
[math]\triangleright[/math]

Рассмотрим окружность с центром в точке [math](a, b)[/math] радиуса [math]r[/math], она описывается уравнением: [math](x - a)^2 + (y - b)^2 = r^2[/math].

Раскрывая скобки в уравнении окружности, получим [math]x^2 - 2ax + a^2 + y^2 - 2by + b^2 = r^2[/math]

Рассмотрим параболоид, пускай его уравнение имеет вид [math]x^2 + y^2 = Cz[/math].

При проецировании, для проекции окружности на параболоид верны оба уравнения: и окружности, и параболоида, поэтому в уравнение окружности вместо [math]x^2 + y^2[/math] можно подставить [math]Cz[/math], получится [math](-2a)x + (-2b)y + Cz + (a^2 + b^2 - r^2) = 0[/math]

Заметим, что получившееся уравнение является уравнением плоскости: [math]Ax + By + Cz + D = 0[/math], то есть, все точки проекции окружности будут лежать в одной плоскости.

Рассмотрим любую точку внутри данной окружности. Через нее можно провести окружность с центром в точке [math](a, b)[/math] и радиусом [math]r' \lt r[/math], тогда плоскость, проходящая через проекцию этой окружности на параболоид будет иметь уравнение [math]Ax + By + Cz + D' = 0[/math], то есть, обе плоскости будут параллельны и вторая плоскость будет лежать под плоскостью окружности (поскольку [math]r' \lt r[/math], то [math]D' = (a^2 + b^2 - r'^2) \gt (a^2 + b^2 - r^2) = D[/math]).

Аналогично доказывается, что точки лежащие вне окружности лежат над плоскостью.
[math]\triangleleft[/math]
Теорема:
Подразбиение Делоне существует, причём для каждого набора точек оно единственно.
Доказательство:
[math]\triangleright[/math]

Спроецируем все точки на параболоид и построим выпуклую оболочку.

Все грани выпуклой оболочки окажутся внутри параболоида из-за его выпуклости. При этом точки лежат на параболоиде. Поэтому не найдётся точек, которые будут лежать за гранями выпуклой оболочки. То есть все точки, спроецированные на параболоид, будут принадлежать выпуклой оболочке.

По лемме 1 очевидно, что внутри окружностей, описанных вокруг проекций граней выпуклой оболочки, не будет лежать никаких точек. Значит, проекции граней — фигуры подразбиения Делоне. Значит, такое подразбиение существует.

Из единственности выпуклой оболочки следует, что такое подразбиение единственно.
[math]\triangleleft[/math]

Критерий Делоне для рёбер

Определение:
Критерий Делоне для ребра: на ребре можно построить такую окружность, что внутри неё не будет лежать никаких точек.
Лемма (2):
Триангуляции Делоне принадлежат те и только те рёбра (с поправкой на точки, лежащие на одной окружности), которые удовлетворяют критерию Делоне.
Доказательство:
[math]\triangleright[/math]
Для рёбер AB и CD выполняется критерий Делоне, на них построены окружности

То, что для рёбер, принадлежащих триангуляции Делоне, выполняется критерий Делоне для рёбер, очевидно (вокруг каждого ребра можно описать окружность, проходящую через противолежащую ему точку в смежном треугольнике, причём в окружности не будет никаких точек по критерию Делоне).

Докажем, что если для ребра выполняется критерий Делоне, то оно принадлежит триангуляции Делоне.

Предположим, что это ребро (назовём его [math]AB[/math]) не принадлежит триангуляции Делоне. Тогда существует пересекающее его ребро [math]CD[/math], принадлежащее триангуляции. Рассмотрим четырёхугольник [math]ACBD[/math]. Точки [math]C[/math] и [math]D[/math] лежат вне окружности, построенной на [math]AB[/math] как на хорде, поэтому сумма углов [math]C[/math] и [math]D[/math] меньше 180°. Аналогичным образом доказывается, что сумма углов [math]A[/math] и [math]B[/math] тоже меньше 180°. Значит, сумма углов четырёхугольника [math]ACBD[/math] меньше 360°, что невозможно. Противоречие. Значит, ребро [math]AB[/math] принадлежит триангуляции Делоне.
[math]\triangleleft[/math]

Локальный критерий Делоне

Определение:
Локальный критерий Делоне для ребра: для пары треугольников, которым принадлежит это ребро, выполняется критерий Делоне (то есть вершина, противолежащая ребру в одном треугольнике, не лежит в окружности, описанной вокруг другого, и наоборот).

Будем называть хорошими те рёбра, для которых выполняется локальный критерий Делоне.

Лемма (3):
Из двух рёбер, которые можно провести для пары треугольников, как минимум одно хорошее.
Доказательство:
[math]\triangleright[/math]
Рёбра AB и BC плохие
Предположим, что это не так, то есть оба ребра (назовём их [math]AB[/math] и [math]CD[/math]) плохие. Рассмотрим четырёхугольник [math]ACBD[/math] и окружность, описанную вокруг треугольника [math]ABC[/math]. Точка [math]D[/math] лежит внутри этой окружности, значит, сумма углов [math]C[/math] и [math]D[/math] больше 180°. Аналогично доказывается, что сумма углов [math]A[/math] и [math]B[/math] больше 180°. Значит, сумма углов четырёхугольника [math]ACBD[/math] больше 360°, что невозможно.
[math]\triangleleft[/math]
Лемма (4):
Если для всех рёбер выполняется локальный критерий Делоне, то выполняется и глобальный критерий Делоне.
Доказательство:
[math]\triangleright[/math]
Все рёбра треугольника хорошие, но описанная окружность содержит точки

Предположим, что это не так, то есть все рёбра хорошие, но существуют треугольники, описанная окружность которых содержат какие-либо точки триангуляции. Возьмём какую-либо конфликтную точку [math]E[/math]. Рассмотрим такой треугольник [math]ABC[/math] из тех, в описанную окружность которых попадает [math]E[/math], что угол [math]BEC[/math] максимален, если [math]BC[/math] — ближайшая к точке [math]E[/math] сторона. Пусть треугольник [math]BDC[/math] — смежный с [math]ABC[/math].

Докажем, что точка [math]E[/math] лежит в окружности, описанной вокруг [math]BDC[/math]. Предположим, что это не так. Посмотрим на окружность, описанную вокруг треугольника [math]ABC[/math]: [math]\angle BAC + \angle BEC \gt 180^\circ[/math] и [math]\angle BAC + \angle BDC \lt 180^\circ[/math]. Если точка [math]E[/math] не лежит в окружности, описанной вокруг треугольника [math]BDC[/math], то [math]\angle BEC \lt \angle BDC[/math], что противоречит предыдущим двум неравенствам.

Очевидно, что угол [math]BED[/math] больше, чем угол [math]BEC[/math]. При этом точка [math]E[/math] лежит в окружности, описанной вокруг [math]BDC[/math]. Значит, при выборе треугольника нужно было взять не [math]ABC[/math], а [math]BDC[/math]. Противоречие.
[math]\triangleleft[/math]

Динамическая триангуляция

Определение:
Рассмотрим пару смежных треугольников. Рёбра этих треугольников образуют четырёхугольник с проведённой в нём диагональю. Операция замены этой диагонали на другую называется flip (флип).
Красное ребро — до флипа, синее — после

Из леммы 3 следует, что если ребро плохое, то флип сделает его хорошим.

Лемма (5):
Флип плохого ребра уменьшает разность объёмов параболоида и триангуляции, спроецированной на него.
Доказательство:
[math]\triangleright[/math]

Рассмотрим два таких смежных треугольника, что ребро между ними является плохим. Спроецируем их на параболоид. Четыре точки, принадлежащие смежным треугольникам, при проекции на параболоид образуют тетраэдр.

Проведём через какой-нибудь из двух треугольников плоскость. Вершина, противолежащая основанию тетраэдра, являющегося этим треугольником, лежит ниже этой плоскости (так как не выполняется локальный критерий Делоне), то есть тетраэдр лежит ниже тела, образующегося при проекции всей триангуляции на параболоид.

После флипа станет выполняться локальный критерий Делоне, то есть тело станет включать в себя тетраэдр. Поэтому после флипа плохого ребра объём тела увеличится на объём этого тетраэдра.
[math]\triangleleft[/math]
Лемма (6):
Флипами можно достичь хорошей триангуляции за конечное время.
Доказательство:
[math]\triangleright[/math]
Всего триангуляций заданного множества точек конечное число, и среди них есть триангуляция Делоне. Последовательность флипов плохих рёбер триангуляции образует такую последовательность триангуляций, что разность объёмов параболоида и спроецированной на него триангуляции убывает (по лемме 5). Эта последовательность конечна (при этом последней в последовательности является триангуляция Делоне), значит, число флипов, требуемых для достижения триангуляции Делоне, тоже конечно.
[math]\triangleleft[/math]
Лемма (7):
Если в триангуляцию Делоне вставить точку в некоторый треугольник и соединить его вершины с этой точкой, то получившиеся рёбра будут хорошими.
Доказательство:
[math]\triangleright[/math]
Точка V вставлена в треугольник ABC

Предположим, точка была вставлена не на ребро. Рассмотрим любое из рёбер — пусть это будет ребро [math]VC[/math]. Проведём окружность, описывающую треугольник [math]ABC[/math]. По критерию Делоне в ней не будет никаких точек триангуляции. На ребре [math]VC[/math] можно построить окружность, изнутри касающуюся окружности, описанной вокруг треугольника. В ней тоже нет никаких точек. Значит, для [math]VC[/math] выполняется критерий Делоне для рёбер, то есть, оно хорошее.

Случай, когда точка вставляется на ребро, рассматривается аналогично.
[math]\triangleleft[/math]

Вставка точки

Вставка точки, лежащей внутри триангуляции

Вставка в треугольник
Вставка на ребро

Для начала локализуемся: поймём, в каком фейсе лежит точка (или на каком ребре).

Если точка лежит внутри фейса, добавляем три ребра, сам фейс превращаем в один из новых смежных с вставляемой точкой и добавялем ещё два фейса.

Если же точка лежит на ребре, два смежных с ребром фейса превращаем в два новых, добавляем ещё два, а так же превращаем ребро, на которое вставляется точка, в ребро, которое заканчивается в этой точке, и вставляем три новых.

Итого у нас появилось несколько новых рёбер. Они все хорошие (по лемме 7), плохими могут оказаться только рёбра, противолежащие вставленной точке. Флипаем рёбра, пока триангуляция не станет хорошей.

Вставка точки, лежащей снаружи триангуляции

Представим, что вне триангуляции — бесконечные треугольники, основания которых — рёбра выпуклой оболочки триангуляции, а противолежащая ребру вершина — это бесконечно удалённая точка. Тогда понятно, что вставка точки, не лежащей в триангуляции, сведётся к вставке точки внутрь триангуляции, если мы научимся обрабатывать бесконечные фейсы.

Бесконечно удалённая точка имеет координаты [math](0,0,1,0)[/math] (последняя координата — однородная).

Тогда проверка на то, является ли хорошим ребро, инцидентное бесконечно удалённой точке, упрощается: [math] \begin{vmatrix} a_x & a_y & a_x^2 + a_y^2 & 1 \\ b_x & b_y & b_y^2 + b_y^2 & 1 \\ c_x & c_y & c_x^2 + c_y^2 & 1 \\ 0 & 0 & 1 & 0 \end{vmatrix} = \begin{vmatrix} a_x & a_y & 1 \\ b_x & b_y & 1 \\ c_x & c_y & 1 \end{vmatrix} [/math], то есть достаточно проверить поворот трёх остальных точек образованного двумя бесконечными треугольниками четырёхугольника.

Проверка, принадлежит ли точка бесконечному треугольнику, тоже проста: нужно, чтобы из точки было видно ребро, противолежащее бесконечно удалённой точке, в бесконечном треугольнике. Это проверяется предикатом поворота.

Время работы

Лемма (8):
При вставке точки будут флипаться только рёбра, противолежащие вставленной точке.
Доказательство:
[math]\triangleright[/math]
V — вставленная точка, ребро AC — плохое

Доказательство по индукции.

База. По лемме 7 изначально не будут флипаться новые рёбра, инцидентные точке, то есть плохими могут оказаться только рёбра, противолежащие точке.

Переход. Рассмотрим, что произойдёт с противолежащим точке [math]V[/math] ребром [math]AC[/math] после флипа, если оно плохое. До вставки точки [math]V[/math] для триангуляции выполнялся глобальный критерий Делоне, поэтому в окружности, описанной вокруг треугольника [math]ACD[/math], не будет лежать никаких точек, кроме точки [math]V[/math]. Можно построить окружность, касающуюся её изнутри в точке [math]D[/math] и проходящую через точку [math]V[/math]. В ней тоже не окажется никаких точек, так как она касается изнутри. Значит, для ребра [math]VD[/math] выполняется критерий Делоне. Значит, после флипа ребро [math]AC[/math] уже не будет флипаться. Так как для рёбер [math]AV[/math] и [math]CV[/math] выполняется критерий Делоне, то плохими после флипа могут стать только рёбра [math]AD[/math] и [math]CD[/math] — то есть рёбра, противолежащие точке [math]V[/math].
[math]\triangleleft[/math]
Лемма (9):
Средняя степень вершины после вставки её в триангуляцию Делоне равна [math]O(1)[/math].
Доказательство:
[math]\triangleright[/math]

Предположим, что мы вставляем [math]i+1[/math]-ую точку из последовательности из [math]n[/math] точек. Рассмотрим все перестановки из этих [math]i+1[/math] точек, означающие порядок вставки этих точек. Всего таких перестановок [math](i+1)![/math]. Тогда средняя степень последней вершины среди перестановок равна:

[math]E(\operatorname{deg}(v_{i+1}))=\frac {\sum_{p=perm(v_1, v_2, ..., v_{i+1})} \operatorname{deg} (p[i+1])} {(i+1)!}[/math]

Каждая из [math]i+1[/math] вершин побывает последней ровно [math]i![/math] раз, поэтому:

[math]E(\operatorname{deg} (v_{i+1}))=\frac {\sum_{k=0}^{i} i! \operatorname{deg} (v_k)} {(i+1)!} = \frac {\sum_{k=0}^i \operatorname{deg}(v_k)} {i+1} = \frac {O(i+1)} {i+1} = O(1)[/math]
[math]\triangleleft[/math]
Теорема:
При вставке точки в триангуляцию Делоне в среднем придётся сделать [math]O(1)[/math] флипов.
Доказательство:
[math]\triangleright[/math]
Все флипнутые рёбра окажутся инцидентными вставленной точке (по лемме 8), а степень вершины — [math]O(1)[/math] (по лемме 9). Поэтому будет сделано [math]O(1)[/math] флипов.
[math]\triangleleft[/math]

Так как среднее число флипов — [math]O(1)[/math], то время вставки целиком зависит от времени локализации.

Удаление точки

Алгоритм

При удалении точки получится звёздный многоугольник, который можно затриангулировать за линию. При этом все рёбра, полученные в результате триангуляции звёздного многоугольника, могут оказаться плохими, поэтому необходимо пройтись по ним и пофлипать, если нужно.

Время работы

Средняя степень вершины в триангуляции — [math]O(1)[/math], поэтому триангуляция звёздного многоугольника будет тоже за [math]O(1)[/math]. Новых рёбер получится [math]O(1)[/math], проверить их на локальный критерий Делоне и пофлипать тоже можно за [math]O(1)[/math]. Итого удаление точки работает за [math]O(1)[/math].

Локализационная структура

Cтруктура

Локализационная структура состоит из нескольких уровней, где каждый уровень — это триангуляция Делоне. На нижнем уровне содержатся все точки. Каждая точка с вероятностью [math]p[/math] проходит на следующий уровень (причём если точка — единственная на последнем уровне, то дальше она не пройдёт).

Уровни связаны между собой следующим образом: на уровне [math]i[/math] каждая точка содержит указатель на себя же на уровне [math]i-1[/math].

Алгоритм локализации

Как происходит локализация: нам дают точку [math]v_{i+1}[/math], которая на предыдущем уровне была ближайшей к точке [math]q[/math], которую мы локализуем. Нужно получить следующую точку [math]v_i[/math], которая будет ближайшей уже на этом уровне. Делается это следующим образом:

  • Находим, в каком из треугольников, смежных с [math]v_{i+1}[/math], лежит отрезок [math]v_{i+1} q[/math]
  • Находим, какие рёбра треугольников пересекает [math]v_{i+1} q[/math], в итоге находим треугольник, в котором лежит [math]q[/math]
  • Находим ближайшую к [math]q[/math] точку. Первым кандидатом на то, чтобы быть ближайшей точкой, становится ближайшая к [math]q[/math] вершина найденного в предыдущем пункте треугольника. Для каждого кандидата нужно просмотреть смежные вершины в поиске точки, которая находится ближе к [math]q[/math] — эта точка становится следующим кандидатом. Если же среди соседей точки не нашлось более близких, значит, эта точка и есть ближайшая.

Корректность алгоритма

Теорема:
Данный алгоритм найдёт ближайшую точку.
Доказательство:
[math]\triangleright[/math]
Ребро vv' должно принадлежать триангуляции
Предположим, что это не так. Назовём локализуемую точку [math]q[/math], а последнего кандидата на то, чтобы быть ближайшей точкой — [math]v[/math]. Раз эта точка на самом деле не ближайшая, то в окружности, проходящей через [math]v[/math], с центром в точке [math]q[/math] найдутся ещё какие-то точки, не смежные с [math]v[/math]. Проведём через каждую из них окружность, касающуюся изнутри в точке [math]v[/math] изначальную окружность. Рассмотрим точку [math]v'[/math], через которую проходит наименьшая окружность из построенных. В этой окружности не будет лежать никаких точек, так как мы взяли наименьшую. Значит, ребро [math]vv'[/math] удовлетворяет критерию Делоне и должно являться ребром триангуляции (по лемме 2), но по предположению этого ребра нет. Значит, предположение неверно.
[math]\triangleleft[/math]

Время работы, требуемая память

Память

Лемма (10):
Матожидание числа уровней в локализационной структуре — [math]O(\log n)[/math].
Доказательство:
[math]\triangleright[/math]

Для оценки матожидания посчитаем вероятность того, что количество уровней [math]h[/math] равно [math]k[/math] при вероятности пройти на следующий уровень равной [math]p[/math].

[math]p(h \leq k) = (1 - p^{k + 1})^n[/math], потому что вероятность того, что точка дойдёт до уровня [math]k + 1[/math], равна [math]p^{k + 1}[/math].

[math]p(h \geq k) = (1 - (1 - p^k)^n)[/math], потому что вероятность того, что точка не дойдёт до уровня [math]k[/math], равна [math]1 - p^k[/math].

[math]p(h = k) = 1 - p(h \gt k) - p(h \lt k) = 1 - (1 - (1 - p^{k + 1})^n) - (1 - p^{k})^n = (1 - p^{k + 1})^n - (1 - p^k)^n \leq 1 - (1 - p^k)^n \leq np^k[/math]

[math]E(h) = \sum\limits_{k = 1}^{\infty} k \cdot p(h = k) = p(1) \cdot 1 + \dots + p(\log_{1/p} n) \cdot \log_{1/p} n + \sum\limits_{k = \log_{1/p} n + 1}^{\infty} k \cdot p(k)[/math]

Оценим первую сумму:

[math]p(1) \cdot 1 + \dots + p(\log_{1/p} n) \cdot \log_{1/p} n \leq p(1) \cdot \log_{1/p} n + \dots + p(\log_{1/p} n) \cdot \log_{1/p} n = O(\log(n))[/math], поскольку сумма этих вероятностей не превосходит единицу.

Оценим вторую сумму:

[math]\sum\limits_{k = \log_{1/p} n + 1}^{\infty} k \cdot p(k) \leq \sum\limits_{k = \log_{1/p} n}^{\infty} k \cdot n p^k = n \cdot \sum\limits_{k = \log_{1/p} n}^{\infty} k \cdot p^k[/math]

Рассмотрим эту сумму:

[math]\sum\limits_{k = \log_{1/p} n}^{\infty} k \cdot p^k = p^{\log_{1/p} n} \cdot \sum\limits_{k = 0}^{\infty} (k + \log_{1/p} n) \cdot p^k = p^{\log_{1/p} n} \cdot (\sum\limits_{k = 0}^{\infty} (k p^k) + \log_{1/p} n \cdot \sum\limits_{k = 0}^{\infty} (p^k)) = p^{\log_{1/p} n} \cdot (O(1) + \log_{1/p} n \cdot O(1)) = 1/n \cdot O(\log(n))[/math]

Суммируя всё вышесказанное, получаем, что [math]O(\log(n))[/math].
[math]\triangleleft[/math]
Теорема:
Локализационная структура занимает [math]O(n)[/math] памяти.
Доказательство:
[math]\triangleright[/math]
Триангуляция для [math]n[/math] точек занимает [math]O(n)[/math] памяти. На нулевом уровне [math]n[/math] точек. На уровне [math]k[/math] точек [math]m_k=p \cdot m_{k-1}[/math]. Получим геометрическую прогрессию, сумма которой равна [math]O(n)[/math].
[math]\triangleleft[/math]

Время работы

Лемма (11):
Каждая точка на плоскости может являться ближайшей для не более чем шести точек.
Доказательство:
[math]\triangleright[/math]
Точка u является ближайшей для семи точек

Предположим, что это не так.

Пусть некоторая точка [math]u[/math] является ближайшей для семи точек. Соединим эти семь точек с точкой [math]u[/math] отрезками и рассмотрим минимальный из углов, который образуют проведённые отрезки [math]vu[/math] и [math]wu[/math]. Этот угол [math]\alpha[/math] меньше 60° (иначе все семь углов больше либо равны 60° и их сумма больше 360°).

Так как точка [math]u[/math] ближайшая для точек [math]v[/math] и [math]w[/math], то [math]vw[/math] — наибольшая сторона в треугольнике [math]vwu[/math]. В треугольнике наибольшая сторона лежит напротив наибольшего угла. Но напротив стороны [math]vw[/math] лежит угол меньше 60°, значит, сумма углов треугольника меньше 180°. Противоречие. Значит, предположение неверно.
[math]\triangleleft[/math]
Лемма (12):
Для заданной точки [math]q[/math] на [math]k[/math]-ом уровне средняя степень ближайшей на [math]k+1[/math]-ом уровне вершины равна [math]O(1)[/math].
Доказательство:
[math]\triangleright[/math]

Функция [math]nn[/math] принимает точку и множество и возвращает ближайшего соседа заданной точки из заданного множества.

Рассмотрим некоторый уровень [math]S_k[/math]. Определим множество [math]R_k=S_k\cup\{q\}[/math]. Рассмотрим все возможные подмножества [math]R_k[/math], равномощные [math]R_{k+1}[/math], тем самым рассмотрев все возможные уровни [math]k+1[/math]. Для каждой точки из каждого подмножества [math]R'_{k+1}[/math] рассмотрим степень ближайшей вершины и усредним всё, получив нужную нам оценку.

[math]E(\operatorname{deg_{S_k}} (\operatorname{nn} (q, S_{k+1}))) = \frac {1} {C^{|R_{k+1}|}_{|R_k|}} \cdot \sum\limits_{R'_{k+1}\subset R_k} \frac {1} {|R_{k+1}|} \sum\limits_{a_i \in R'_{k+1}} \operatorname{deg_{R_k}} (\operatorname{nn}(a_i,R'_{k+1}\backslash\{a_i\})) [/math]

Назовём графом [math]NN(\{a_i\})[/math] двудольный граф, в левой и правой долях содержащий точки [math]\{a_i\}[/math], рёбра [math]uv[/math] которого означают, что точка [math]v[/math] является ближайшей для точки [math]u[/math] (точка [math]u[/math] лежит в левой доли, точка [math]v[/math] лежит в правой доли).

Понятно, что [math]\sum\limits_{a_i \in R'_{k+1}} \operatorname {deg_{R_k}} (\operatorname{nn}(a_i, R'_{k+1}\backslash\{a_i\})) = \sum\limits_{a_i\in R'_{k+1}} \operatorname{deg_{R_k}}(a_i) \cdot \operatorname{deg_{NN(R'_{k+1})}}(a_i)[/math], так как степень каждой вершины [math]a_i[/math] учтётся ровно столько раз, сколько рёбер ей инцидентно в правой доли графа [math]NN[/math].

[math]E(\operatorname{deg_{S_k}} (\operatorname{nn} (q, S_{k+1}))) = \frac {1} {C^{|R_{k+1}|}_{|R_k|}} \sum\limits_{R'_{k+1}\subset R_k} \frac {1} {|R_{k+1}|} \sum\limits_{a_i\in R'_{k+1}} \operatorname{deg_{R_k}}(a_i) \operatorname{deg_{NN(R'_{k+1})}}(a_i)[/math]

По лемме 11 степень вершины из правой доли графа [math]NN[/math] не может быть больше шести.

[math]E(\operatorname{deg_{S_k}} (\operatorname{nn} (q, S_{k+1}))) \le \frac {1} {C^{|R_{k+1}|}_{|R_k|}} \sum\limits_{R'_{k+1}\subset R_k} \frac {1} {|R_{k+1}|} \sum\limits_{a_i\in R'_{k+1}} \operatorname{deg_{R_k}}(a_i) \cdot 6 = \frac {6} {C^{|R_{k+1}|}_{|R_k|} \cdot |R_{k+1}|} \sum\limits_{R'_{k+1}\subset R_k} \sum\limits_{a_i\in R'_{k+1}} \operatorname{deg_{R_k}} (a_i) = 6 \cdot \frac {\sum_{a_i\in R_k} \operatorname{deg}(a_i)} {|R_k|} = O(1) [/math]
[math]\triangleleft[/math]
Лемма (13):
Среднее число точек, лежащих в окружности с центром в точке [math]q[/math] и проходящей через [math]v_{i+1}[/math], равно [math]O(1)[/math].
Доказательство:
[math]\triangleright[/math]

Рассмотрим точки триангуляции [math]\{a_i\}[/math]. Для каждой точки [math]a_i[/math] построим окружность с центром в точке [math]a_i[/math], проходящую через ближайшую к ней точку. Докажем, что заданная точка [math]w[/math] попадёт в [math]O(1)[/math] таких окружностей на предыдущем уровне. Разделим плоскость на шесть частей прямыми, проходящими через точку [math]w[/math]. Рассмотрим одну из частей. Отсортируем все точки, попавшие в неё, по увеличению расстояния до [math]w[/math]. Получим такую последовательность точек [math]\{a_0, a_1, ...\}[/math], что [math]|wa_i|\le|wa_{i+1}|[/math]. Заметим, что если какая-нибудь точка [math]a_i[/math] содержится на предыдущем уровне, то все точки, начиная с [math]a_{i+1}[/math] уже не содержат в своей окружности точку [math]w[/math]. Таким образом, среднее число точек [math]k[/math], в окружности которых содержится точка [math]w[/math]:

[math]E(k)\le6\cdot\sum_i i(1-p)^i p = O(1)[/math]

Таким образом, каждая точка содержится в [math]O(1)[/math] окружностей, значит, каждая окружность содержит [math]O(1)[/math] точек.
[math]\triangleleft[/math]
Лемма (14):
Среднее число рёбер, пересечённое отрезком [math]qv_{i+1}[/math] во втором этапе алгоритма локализации, равно [math]O(1)[/math].
Доказательство:
[math]\triangleright[/math]

Рассмотрим рёбра, пересекающие [math]qv_{i+1}[/math], для которых хотя бы одна из граничных точек окажется в окружности с центром в точке [math]q[/math], проходящей через [math]v_{i+1}[/math]. Число таких рёбер не превосходит суммы степеней вершин, лежащих внутри окружности. А по лемме 13 число таких точек равно [math]O(1)[/math]. При этом средняя степень вершины равна [math]O(1)[/math]. Таким образом, число таких рёбер равно [math]O(1)[/math].

Докажем, что число рёбер, пересекающих [math]qv_{i+1}[/math], для которых обе граничные точки лежат вне окружности, тоже равно [math]O(1)[/math]. При вставке точки [math]q[/math] в триангуляцию для этих рёбер перестанет выполняться критерий Делоне: в любой окружности, построенной на ребре как на хорде, будет содержаться либо точка [math]q[/math], либо точка [math]v_{i+1}[/math]. Поэтому эти рёбра придётся флипнуть. Число флипов при вставке точки равно [math]O(1)[/math], поэтому число таких рёбер равно [math]O(1)[/math].

Итого число рёбер, пересекающих [math]qv_{i+1}[/math], равно [math]O(1)[/math].
[math]\triangleleft[/math]
Лемма (15):
Среднее число треугольников, посещённых на третьем этапе алгоритма локализации, равно [math]O(1)[/math].
Доказательство:
[math]\triangleright[/math]
Каждый рассмотренный треугольник имеет хотя бы одну вершину внутри окружности, проведённой через [math]v_{i+1}[/math], с центром в точке [math]q[/math]. То есть число таких треугольников не больше числа точек внутри этой окружности. Таких точек по лемме 13 [math]O(1)[/math], значит, число треугольников тоже равно [math]O(1)[/math].
[math]\triangleleft[/math]
Лемма (16):
Локализация точки на каждом уровне происходит за [math]O(1)[/math].
Доказательство:
[math]\triangleright[/math]

Докажем, что каждый этап локализации происходит за [math]O(1)[/math].

1 этап: по лемме 12 средняя степень вершины [math]v_{i+1}[/math] равна [math]O(1)[/math], поэтому треугольников, в которых может лежать отрезок [math]qv_{i+1}[/math] тоже [math]O(1)[/math]. Просмотрев их все, за [math]O(1)[/math] можно понять, в каком из них лежит отрезок [math]qv_{i+1}[/math].

2 этап: число рёбер, пересечённых отрезком [math]qv_{i+1}[/math], равно [math]O(1)[/math] (по лемме 14). Поэтому этот этап локализации тоже происходит за [math]O(1)[/math].

3 этап: число треугольников, посещённых на третьем этапе локализации, равно [math]O(1)[/math] (по лемме 15).
[math]\triangleleft[/math]
Теорема:
Локализация точки в триангуляции происходит за [math]O(\log n)[/math].
Доказательство:
[math]\triangleright[/math]
Очевидное следствие из леммы 10 и леммы 16.
[math]\triangleleft[/math]

Constraints

Определение:
Констрейнты — рёбра, которые нельзя флипать.
Утверждение:
Хорошая триангуляция с констрейнтом может быть хорошей с точностью до видимости через констрейнт.

Вставка

Красным выделен вставляемый констрейнт

Смотрим на список рёбер, пересечённых ещё не вставленным констрейнтом, и флипаем их. Последнее флипнутое ребро и будет констрейнтом (по понятным причинам), после флипа пометим его как констрейнт. Затем флипаем всё, что могло стать плохим (кроме констрейнта), пока триангуляция вновь не станет хорошей.

Удаление

Аналогично: помечаем ребро как не-констрейнт и флипаем, пока не дойдём до хорошей триангуляции.