Изменения

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

Триангуляция Делоне на сфере

12 960 байт добавлено, 19:19, 4 сентября 2022
м
rollbackEdits.php mass rollback
{{nohatewasted}}== Определение Определения ==
{{Определение
|definition=
'''Триангуляция''' — набор непересекающихся отрезков, соединениющий соединяющий заданный набор точек так, что добавление новых отрезков невозможно без пересечения уже имеющихся.}}{{Определение|definition='''Отрезок''' — кратчайшее расстояние от точки до точки на заданной поверхности.}}{{Определение|definition='''Симплекс'''(англ. ''simplex'') — геометрическая фигура, являющаяся n-мерным обобщением треугольника.}}{{Определение|definition='''Триангуляция''' — разбиение геометрической фигуры на симплексы.
}}
 
{{Определение
|definition=
'''Критерий Делоне(частный случай для сферы):''' при построении плоскости через три точки, образующие которые образуют треугольник, все остальные точки лежат ниже не выше этой плоскости.
}}
{{Лемма
|about=1
|id=1|statement= Сечение сферы плоскостью есть кругокружность, а основание перпендикуляра , проведенного из центра шара к пересекаемой плоскости , есть центр кругаокружности, полученного полученной в сечении.
|proof=
[[Файл:drawing.png|400px|thumb|right|]]
Пусть плоскость <tex>\alpha</tex> пересекает сферу. Из центра <tex>O</tex> опустим перпендикуляр <tex>OC</tex> на плоскость <tex>\alpha</tex>.
Соединим произвольную точку <tex>M</tex> линии пересения пересечения плоскости <tex>\alpha</tex> со сферой с точками <tex>O</tex> и <tex>C</tex>. Так как <tex>OC</tex> ⊥ <tex>\alpha</tex>, то <tex>OC</tex> ⊥ <tex>CM</tex>.
В прямоугольном треугольнике Рассмотрим треугольник △<tex>OCM CM2 </tex> : <tex> CM^2 = OM2 OM^2 - OC2OC^2</tex>. Т.к. <tex>OM</tex> и <tex>OC</tex> - величины постоянные, то и <tex>CM</tex> - величина постоянная. Таким образом все точки линии пересечения плоскости <tex>\alpha</tex> и сферы равноудалены от точки <tex>C</tex>, поэтому эта линия пересечения является окружностью с центром в точке <tex>C</tex> и радиусом <tex>r = CM</tex>.
}}
Поскольку никакие четыре точки не лежат на одной окружности в исходном наборе точек, а значит, гранями выпуклой оболочки будут треугольнички.
Значит, триангуляция существует.
А поскольку выпуклая оболочка единственна, можно сказать,что и триангуляция единственна.
}}
{{Лемма
|about=2
|id=2
|statement= Гранями выпуклой оболочки будут выпуклые многоугольники
|proof=
По определению, мноожество множество является выпуклым, если для любых двух точек, отрезок, соединяющий эти точки, тоже входит во множество. И наша оболочка является выпуклой.
Предположим, что грань выпуклой оболочки не выпуклый многоугольник. Тогда найдутся две точки, такие, что отрезок не лежит в грани. Тогда получается, что и вся оболочка не является выпуклой.
}}
|about=3
|id=trianpoly
|statement= Если гранью выпуклой оболочки оказался многоугольник, то его можно треангулировать любым способом, критерий любая триангуляция данного многоугольника - триангуляция Делоне всеравно будет выполняться.
|proof=
Грань могла оказаться многоугольником только в том случаеРассмотрим наш многоугольник и плоскость, если все построенную через любые три точки. Если существует точка выше нашей плоскости, образующие еёто мы могли бы расширить нашу выпуклую оболочку, лежат на одной окружностичто означает некорректность построенной выпуклой оболочки. Противоречие. В противном случае, через точкиЕсли существует точка ниже нашей плоскости, лежащие на окружности(таких как минимум три) можно было бы провести плоскость и все остальные точки этой грани лежали бы выше или ниже и противоречили бы тому фактуто "внутри" выпуклой оболочки содержится точка, что выпуклая оболочка строится корректнонекорректно. Противоречие.
Тогда получаетсяОтсюда, что все наши точки лежат на плоскости, что в нашем случае эквивалентно тому, что они лежат на одной плоскостиокружности, и как бы мы значит любая триангуляция нашего многоугольника не разбивали грань нарушит глобальный критерий Делоне(ни в одной окружности, построенной на треугольникипоявившихся в ходе триангуляции треугольников, критерий Делоне нарушаться не будетсодержаться точек).
}}
Отсюда видно, что если случилось так, что у нас есть четыре или более точек, лежащих на одной окружности, то у построенной выпуклой оболочкиВоспользовавшись фактом выше, возможно, будут грани, не являющиеся треугольниками. Понятно, что такие грани будут выпуклыми многоугольниками. Тогда каждую из них можно затриангулировать [[Триангуляция полигонов приходим к очевидному решению как за <tex>O(ушная + монотоннаяK)|методом отрезания "ушей"]]</tex> (где <tex> K </tex>- количество вершин в многоугольнике) триангулировать все многограники: берем любую точку в многогранике и соединяем её с остальными. Получившиеся треугольники будут лежать Так как в одной плоскости иконечной триангуляции мы имеем <tex>O(N)</tex> треугольников,следовательноа каждый шаг мы добавляем 1 треугольник, то суммарно для всех многоугольник мы совершим не будут нарушать критерий Делоне.В этом случае триангуляция может быть не единственнаболее <tex>O(N)</tex> операций.
==Статический алгоритм==
===Алгоритм===
Как следует из теоремыДополним множество наших точек, точкой <tex>O</tex>, являющейся центром сферы. Данная точка нам понадобится, для тогоесли все точки оказались в одной полусфере.(более быстрая проверка, чтобы построить триангуляцию Делоне на множестве точек на сфере нам необходимо:то какие треугольники надо исключить, чем подсчет предиката).# Построить Построим для данного множества выпуклую оболочку заданного набора точек# Пройтись Удалим все треугольники, которые содеражат вершину <tex>O</tex> (это обязательно будут треугольники и они будут существовать только в том случае, если точки лежат в одной полусфере)# Пройдемся по всем "выжившим" граням получившейся выпуклой оболочки и, если грань не является треугольником, то нужно затриангулировать ее как нибудьтриангулируем их. ===Корректность===Корректность следует из теорем выше.
===Время работы===
Мы можем построить выпуклую оболочку за <tex> \mathcal{O}(n N \log(nN)) </tex>, где <tex>nN</tex> {{---}} количество точек.Триангуляция выпуклого многоугольника требует времени Удалить треугольники мы можем за <tex> \mathcal{O}(kN) </tex>, где <tex>k</tex> {{---}} число вершин с многоугольнике. Следовательно, в худшем случае нам потребуется суммарно Триангулиравать грани мы можем за <tex> \mathcal{O}(nN) </tex> операции, чтоб перетриангулировать все грани, оказавшиеся многоугольниками после построения выпуклой оболочкикак было показано выше.Таким образом, время работы всего алгоритма будет В результате получаем <tex> \mathcal{O}(n N \log(nN)) </tex>, ==Локальный критерий Делоне==
== Критерий Делоне для ребер==
{{Определение
|definition=
'''Глобальный Локальный критерий Делоне для ребра:''' при построении плоскости через ребро можно провести плоскость тактри точки, что все точки будут лежать образующие треугольник, противолежащие сторонам треугольника вершины соседей лежат ниже этой плоскости.
}}
{{Утверждение
|id=krit_dol1
|statement=Пусть имеются два треугольника на сфере: <tex>ABC</tex> и <tex>ABD</tex> и точка <tex>E</tex>, находящаяся над плоскостью <tex>ABC</tex>. Точка <tex>D</tex> находится ниже плоскости <tex>ABC</tex>. Сечение построенной на ребре <tex>AB</tex> и точке <tex>O</tex> делит сферу на две полусферы. Если полусфера, не содержащяя треугольник <tex>ABC</tex>, содержит точки <tex>E</tex> и <tex>D</tex>, то точка <tex>E</tex> лежит надо плоскостью <tex>ABD</tex>.|proof=Факт очевиден.}}{{Утверждение|id=krit_dol1|statement=Глобальный и локальный критерии Делоне для треугольника равносильны.
|proof=
[[Файл:dol1.png|400px|thumb|right|]]
Предположим противноеИз глобального в локальный очевидно. Из локального в глобальный: Пусть выполняется локальный критерий, то есть для каждого треугольника мы можем провести плоскость, в секторе у ребра что соседние вершины для треугольника будут лежать не выше нашей плоскости.Но нашелся треугольник <tex>ABABC</tex> нашли множество точек из триангуляции, что для него не выполняется глобальный критерий, т. Треугольник е существует какая-то точка <tex>ADBE</tex> смежный, при том которая лежит выше плоскости <tex>ABC</tex>.В силу того, что локальный критерий выполняется, эта точка не принадлежит соседним треугольникам, в частности смежному треугольнику <tex>DABD</tex> по ребру <tex>AB</tex> За <tex>AB</tex> лежит под окружностью. Рассмотрим точку мы обозначили ребро, из которого видна точка <tex>E</tex> из того множества, т. Так как е такое ребро, что если провести сечение через точки <tex>ABA</tex> является пересечением плоскостей , <tex>ABCB</tex> и <tex>ADBO</tex>(центр окружности), то точка <tex>E</tex> содержится в полусфере, не содержащей треугольник <tex>ABC</tex>. Так как точка <tex>DE</tex> лежит под над плоскостью <tex>ABC</tex>, а точка <tex>ED</tex> над ней =под плоскостью <tex>ABC</tex> , то точка <tex>E</tex> лежит над плоскостью <tex>ADBABD</tex>. (с учетом того, что они лежат в одной полусфере, ребро AB общее и отделяет треугольник <tex>ABC</tex> от полусферы) (по утверждению выше) Посмотрим, существует ли у треугольника <tex>ABD</tex> смежный треугольник, содержащий вершину <tex>E</tex>:#Если треугольник он существует, то локальный критерий для треугольника <tex>AEDADE</tex> не выполняется. Противоречие.#Если он не существует, то повторим итерациюточка <tex>E</tex> так же будет лежать "над" каким-то смежным с <tex>ABD</tex> треугольником, иначе так как для треугольника <tex>ADBABD</tex> не будет будут выполняться те же условия, что и для <tex>ABC</tex>. Перейдем к такому треугольнику и повторим шаг. Заметим, что наш процесс есть локализация. Мы пустили луч (в ту сторону, где видим точку <tex>E</tex>) из исходного треугольника и идём вдоль него. В какой-то момент мы окажемся рядом с треугольником <tex>XYZ</tex>, для которого точка E выше плоскости, построенной на его трех точках, и в тоже время вершина E содержится в соседнем треугольнике, что нарушает локальный критерий. Противоречие. Значит глобальный критерий Делоне выполняется.
}}
==Локальный критерий Критерии Делонедля ребер==
{{Определение
|definition=
'''Локальный Глобальный критерий Делоне для ребра:''' через ребро можно провести плоскость так, что вершины, противолежащие этому ребру, все точки будут лежать ниже не выше этой плоскости.
}}
{{Определение
|definition=
'''Локальный критерий Делонедля ребра:''' при построении плоскости через три точкиребро можно провести плоскость так, образующие треугольникчто вершины, противолежащие сторонам треугольника вершины соседей лежат ниже этому ребру, будут лежать не выше этой плоскости.
}}
[[Файл:dol2.png|right]]
Из глобального в локальный очевидно, докажем обратно.
Предположим противное, то есть найдётся такая плоскость, что вершины треугольников при ребре <tex>AB</tex> лежат под ней, но существует какая-то вершина <tex>F</tex> над ней. Проведём окружность с центром в сфере через <tex>AB</tex> и выберем треугольник лежащий в одной полусфере с точкой <tex>F</tex>, назовём его <tex>ABC</tex>. Точка <tex>E</tex> лежит над плоскостью Для треугольника <tex>ABC</tex> => <tex>F</tex> лежит внутри окружности около <tex>ABC</tex>. Возьмем треугольника при ребрене выполняется глобальный критерий Делоне, в чьем сегменте оказалась точка <tex>F</tex> поэтому воспользуемся алгоритмом из утверждения "Глобальный и локальный критерии Делоне равносильны" и назовем его найдем треугольник для которого не будет выполняться локальный критерий Делоне <tex>ABC\Rightarrow</tex>для одного из ребер найденного треугольника не выполняется локальный критерий Делоне. Если не существует смежный с ним треугольник при вершине <tex>F</tex>, то повторим итерацию!!!Следовательно, иначе противоречие с локальным критерием глобальный критерий Делонедля ребра выполняется.
}}
{{Утверждение
[[Файл:dol3.png|400px|thumb|right|]]
Из треугольника в ребра: если для каждого треугольника выполнен критерий, то для каждого ребра можно рассматривать плоскость при любом треугольнике при ребре.
 Обратно: Рассмотрим треугольник <tex>ABC</tex>, для каждого из ребра можно провести плоскость и они , такую что все точки будут лежать не выше её. Три плоскости образуют трехмерный угол, снаружи которого нет точек(снаружи == выше каждой плоскости при ребре). В пересечении угла и плосокости плоскости <tex>ABC</tex> образуется тетраэдр. Если в нем нет точек, значит точек нет и над плоскостью треугольника (точек снаружи тетраэдра нету), значит глобальный критерий выполняется. Проверим это. Пусть в нем есть точки, то тогда эти точки есть оказались внутри треугольника, тогда это не триангуляция => точек в тетраэдре нет => плоскостью <tex>ABC</tex> можно отделить пространство с точками => выполняется глобальный критерий.
}}
 
Будем называть '''хорошими''' те рёбра, для которых выполняется локальный критерий Делоне.
{{Лемма
}}
Из [[#fliplemmasphere|леммы 4]] следует, что если ребро плохое, то флип сделает его хорошим.
[[Файл:file12345.png|400px|thumb|right|Красное ребро — до флипа, синее зеленое — после]]
{{Лемма
|about=5
{{Лемма
|about=6
|id=6
|statement=
Флипами можно достичь хорошей триангуляции за конечное время.
|proof=
[[Файл:Lemma7.jpg|right||Точка <tex>P</tex> вставлена в треугольник]]
Пусть мы вставляем точку <tex>P</tex>. Предположим, она была вставлена в треугольник <tex>ABC</tex> не на ребро. Рассмотрим любое из рёбер — пусть это будет ребро <tex>PC</tex>. Тогда проведем через точки <tex>A</tex>, <tex>B</tex>, <tex>C</tex> плоскость <tex>\alpha</tex>, а так же проведем касательную плоскость <tex>\beta</tex> к сфере через точку <tex>C</tex>. Начнем уменьшать между этими плоскостями угол, двигая вращая <tex>\alpha</tex> к <tex>\beta</tex>вокруг их линии пересечения. В какой-то момент <tex>\alpha</tex> пересечет точку <tex>P</tex>, а тогда мы предоставили плоскость, от которой все точки триангуляции находятся по одну сторону, так как изначально выше <tex>\alpha</tex> была только точка <tex>P</tex>, а значит, ребро <tex>PC</tex> удовлетворяет глобальному критерию Делоне. Аналогично для ребер <tex>PA</tex> и <tex>PB</tex>.
Случай, когда точка вставляется на ребро, рассматривается аналогично.
}}
 
{{Утверждение
|id=trianglepossession
|statement=Пусть даны точки <tex>P</tex>, <tex>A</tex>, <tex>B</tex>, <tex>C</tex> на сфере с центром <tex>O</tex>, тогда <tex>P</tex> принадлежит треугольнику <tex>ABC</tex>, тогда и только тогда, когда поворот <tex>P</tex> относительно плоскостей <tex>AOB</tex>, <tex>BOC</tex>, <tex>COA</tex> одинаковый.
}}
====Проверка местоположения точки относительно окружности описанной около треугольника====
[[Файл:1st pred dol ph.png|right]]
 
Рассмотрим <tex> \triangle ABC </tex> и некоторую точку <tex> D </tex>, все точки лежат на сфере. Задача состоит в том чтобы проверить, где лежит точка <tex> D </tex> относительно окружности описанной около <tex> \triangle ABC </tex>. Заметим, что 3 точки задают плоскость, которая пересекает сферу, образует окружность описанную около <tex> \triangle ABC </tex> и все точки на сфере, что лежат внутри окружности будут находится над плоскостью. Переформулируем задачу, мы будем искать положение точки <tex> D </tex> относительно плоскости <tex> \triangle ABС </tex>. Заметим, что если угол между нормалью <tex> \triangle ABC </tex> и вектором <tex> AD < 90 </tex>, то точка лежит над плоскостью, если <tex> = 90 </tex>, то на плоскости, а если <tex> > 90 </tex>, то снизу. Это означает, найдя скалярное произведение этих векторов мы определим положение точки относительно описанной окружности. Т к нам важен только знак скалярного произведения, то <tex> \vec{n}_{ABC} </tex> можно не нормировать.
 
<tex> \vec{n}_{ABC} = (B - A) \times (C - A) </tex>
 
<tex> k = \vec{n}_{ABC} \cdot (D - A) = ((B - A),(C - A),(D - A)) = \begin{vmatrix} B - A \\ C - A \\ D - A \end{vmatrix} </tex>
<tex> = \begin{vmatrix} B & 1 \\ C & 1 \\ D & 1 \\ A & 1 \end{vmatrix} = - \begin{vmatrix} A & 1 \\ B & 1 \\ C & 1 \\ D & 1 \end{vmatrix} </tex>
===Вставка точки===
В обоих случаях для удобства реализации сначала добавим к триангуляции центр сферы.
В самом начале для удобства реализации добавим к триангуляции центр сферы. Первую добавленную точку на сфере соединим с точкой <tex>O</tex>, вторую точку соединим с предыдущей точкой и центром сферы, третью - со всеми предыдущими. Получим выпуклое тело, далее точки вставляются либо на поверхность этого тела, либо за ее пределами. ==== Вставка точки, лежащей внутри триангуляции на поверхности сферы ====[[Файл:InsertAdd_into.jpg|left||Вставка внутрь треугольника]][[Файл:Add_on_edge.jpg|right||Вставка в треугольникна ребро треугольника]]
Пусть мы добавляем точку <tex>P'</tex>. Для начала локализуемся: поймём, в каком фейсе она лежит (или на каком ребре).
Если же точка лежит на ребре, два смежных с ребром фейса превращаем в два новых, добавляем ещё два, а так же превращаем ребро, на которое вставляется точка, в ребро, которое заканчивается в этой точке, и вставляем три новых.
Итого у нас появилось несколько новых рёбер. Они все хорошие (по [[#newedgeslemma| лемме 7]]), плохими могут оказаться только рёбра, противолежащие вставленной точке. Флипаем рёбра, пока триангуляция не станет хорошей. ====Вставка точки, лежащей снаружи триангуляции====[[Файл:Insert.jpg|right||Вставка в треугольник]] Пусть мы добавляем точку <tex>P''</tex>. Нам нужно научиться вставлять точку в треугольник, одной из вершин которого является центр сферы. На самом деле, это теперь получится сделать естественным образом. Так как для определения принадлежности точки треугольнику на поверхности сферы мы смотрим на предикат поворота относительно плоскости, проходящей через центр сферы и ребро, и вставляемой точки <tex>P''</tex>, то для проверки попадания в треугольник, содержащий центр сферы достаточно проверить, что точка <tex>O</tex> видна из точки <tex>P''</tex>, т.е. точка <tex>P''</tex> находится по определенную сторону от плоскости, проходящей через ребро и точку <tex>O</tex>, и противоположенная вершина для ребра является центром сферы.        
==== Вставка точки, лежащей снаружи триангуляции на поверхности сферы ====
Пусть мы добавляем точку <tex>P''</tex>. Нам нужно научиться вставлять точку в треугольник, одной из вершин которого является центр сферы. На самом деле это делается естественным образом. Так как для локализации в треугольнике на поверхности сферы мы использовали предикат поворота относительно плоскости, проходящей через центр сферы и ребро, и вставляемой точки <tex>P``</tex>, то для проверки попадания в треугольник, содержащий центр сферы достаточно проверить, что точка <tex>O</tex> видна из точки <tex>P</tex>, т.е. точка <tex>P</tex> находится по определенную сторону от плоскости, проходящей через ребро и точку <tex>O</tex>, и противоположенная вершина для ребра является центром сферы.
==== Время работы ====
{{Лемма
|about=8
|id=8
|statement=
При вставке точки будут флипаться только рёбра, противолежащие вставленной точке.
|id=opposingedgeslemma
|proof=Доказательство по индукции.
[[Файл:Opposit_flip_named.jpg|right|| Флип противолежащего ребра]]
База. По [[#newedgeslemma|лемме 7]] изначально не будут флипаться новые рёбра, инцидентные точке, то есть плохими могут оказаться только рёбра, противолежащие точке.
Переход. Пусть мы вставили точку <tex>P</tex>. Рассмотрим, что произойдёт с противолежащим ей ребром <tex>AC</tex> после флипа, если оно плохое. До вставки точки <tex>P</tex> для триангуляции выполнялся глобальный критерий Делоне, поэтому плоскость <tex>\alpha</tex>, проходящая через точки <tex>A</tex>, <tex>C</tex> и <tex>D</tex> содержала все точки по одну сторону от себя, теперь же по другую сторону еще будет только точка <tex>P</tex>. Проведем плоскость <tex>\beta</tex> через точки <tex>P</tex> и <tex>D</tex> так, что линия пересечения <tex>\alpha</tex> и <tex>\beta</tex> лежала бы в одной плоскости с касательной на сфере через точку <tex>D</tex> к окружности, проходящей через точки <tex>A</tex>, <tex>C</tex> и <tex>D</tex>. Тогда уменьшая угол между этими плоскостями, двигая вращая <tex>\alpha</tex> к <tex>\beta</tex>вокруг линии пересечения плоскостей, найдем момент, когда <tex>\alpha</tex> пересечет точку <tex>P</tex>, а значит, в окружности, отсекаемой в этот момент плоскостью <tex>\alpha</tex> не будет никаких точек. Значит, ребро <tex>PD</tex> хорошее. Значит, после своего флипа ребро <tex>AC</tex> уже не будет флипаться. Так как для рёбер <tex>AP</tex> и <tex>CP</tex> выполняется критерий Делоне, то плохими после флипа могут стать только рёбра <tex>AD</tex> и <tex>CD</tex> — то есть рёбра, противолежащие точке <tex>P</tex>.
}}
{{Лемма
|about=О степени вершины
|id=vertex_st|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=\operatorname{perm}(v_0, v_1, ..., v_i)} \operatorname{deg} (p[i+1])} {(i+1)!}</tex>
Каждая из <tex>i+1</tex> вершин побывает последней ровно <tex>i!</tex> раз, поэтому:
Из-за того, что у нас сфера, и задача триангуляции сведена к задаче построения выпуклой оболочки, то, следовательно, нам перестает быть важным критерий Делоне, нам просто нужно у звездного многоугольника на сфере как-то провести ребра так, чтобы было выпукло.
Представим себе, что вместо того, чтобы удалять точку, мы просто опускаем ее во внутрь до тех пор, покаона пока она не перестает быть видимой в построенном на триангуляции многоугольнике. Предположим, что мы находимся в удаляемой точке, движемся в центр сферы и смотрим только в направлении движения.
{{Лемма
|about=9
|id=9
|statement=
Изначально нам будут видны грани, которые образуются внутри звездного многоугольника.
* рассмотрим <tex>\varepsilon</tex>-окресности центров отрезков.
Если мы точку спустим к центру сферы еще немного, то этот треугольник виден не будет, но <tex>\varepsilon</tex>-окрестности будут видны две какие-то точки. Соединим их отрезком.
Этот отрезок будет виден. Он не будет лежать на плоскосиплоскости. Он не будет лежать под плоскостью. Тогла получается, что он лежит над плоскостью(ближе к краю сферы), значит, многогранник был невыпуклый.
Получается, что грань ушла и у нее только один видимый сосед. Мы можем выделить грань как ухо.
# Общий случай, когда четыре точки в звездном многоугольнике могут лежать на одной окружности рассматривается аналогично.
}}
====Алгоритм удаления точки====
# Уберем точку.
# Сделаем приоритетную очередь, в которой будем хранить пары отрезков, образующие ухо. Для этой очереди будем использовать TODO предикат, сортирующий уши в порядке, в котором они пересекают луч по направлению от удаляемой точки к центру сферы.
# На очередном шаге достаем ухо, отделяем его.
# Добавляем в очередь получившиеся новые уши.
 =====Предикат=====[[Файл:sphere_del.png|400px|thumb|right| <tex> ABC</tex> {{---}} грань, <tex> O </tex> {{---}} центр сферы, <tex> P </tex> {{---}} удаляемая точка ]]При удалении точки, луч, исходящий из центра окружности в точку, пересекает плоскость очередной грани в некоторй точке <tex> T</tex>.Эту точку можно записать как <tex> T = O + kP </tex>, где <tex> O </tex> {{---}} центр сферы, а <tex> p </tex> {{---}} удаляемая точка.Зпишем предикат при которм наша точка <tex>kP</tex> лежит на плоскости, проходящей через <tex>ABC</tex>:<tex>\begin{vmatrix} A & 1 \\ B & 1 \\ C & 1 \\ kP & 1 \end{vmatrix} = 0 </tex> Распишем и разложим по последней строке:<tex>\begin{vmatrix} A & 1 \\ B & 1 \\ C & 1 \\ kP & 1 \end{vmatrix} = \begin{vmatrix} a_x & a_y & a_z & 1 \\ b_x & b_y & b_z & 1 \\ c_x & c_y & c_z & 1 \\ kp_x & kp_y & kp_z & 1 \end{vmatrix} = k\begin{vmatrix} A & 1 \\ B & 1 \\ C & 1 \\ P & 0 \end{vmatrix} + \begin{vmatrix} A \\ B \\ C \end{vmatrix} = 0</tex> Тогда условие, по которому мы будем устанавливать порядок в приоритетной очереди будет::: <tex>k = - \frac{\begin{vmatrix} A & 1 \\ B & 1 \\ C & 1 \\ P & 0 \end{vmatrix}}{\begin{vmatrix} A \\ B \\ C \end{vmatrix}}</tex> ====Время работы====
Если наш звездный многоугольник состоит из <tex>k</tex> точек, то на один запрос приоритетной очереди будет уходить <tex> \mathcal{O}(\log(k)) </tex> операций. Значит общая ассимптотика будет <tex> \mathcal{O}(k \log(k)) </tex>.
===Алгоритм (?)===
Просто взять точки получившегося звездного многоугольника и построить для них выпуклую оболочку еще раз.
===Время работы (?)===
<tex> \mathcal{O}(k \log(k)) </tex>
===Локализация в триангуляции===
{{Лемма
|about=О количестве уровней
|id=10
|statement= Математическое ожидание уровней в локализационной структуре <tex> O(\log{n}) </tex>.
|proof= То же самое, что и для [[Триангуляция Делоне#levelslemma|плоскости]].
|proof= Опять же доказательство копируется с плоскости.
}}
 
====Принадлежность треугольнику====
Пусть даны точки <tex>P</tex>, <tex>A</tex>, <tex>B</tex>, <tex>C</tex> на сфере с центром <tex>O</tex>, тогда <tex>P</tex> принадлежит треугольнику <tex>ABC</tex>, тогда и только тогда, когда поворот <tex>P</tex> относительно плоскостей <tex>AOB</tex>, <tex>BOC</tex>, <tex>COA</tex> одинаковый.
====Алгоритм====
{{Лемма
|about=10
|id=111
|statement=Алгоритм найдет ближайшую точку
|proof=Допустим, что это не так. Это значит, что в внутри окружности с центром в точке <tex>Q</tex>, на которой лежит точка <tex>P</tex>, есть какие-то другие точки. То есть другими словами существует плоскость <tex>\alpha</tex> проходящая через точку <tex>P</tex>, выше которой находятся точка <tex>Q</tex>(так как она центр) и какие-то точки триангуляции.
{{Лемма
|about=11
|id=212
|statement=Среднее число точек, лежащих внутри окружности с центром в точке <tex>Q</tex> и проходящей через точку <tex>V_{i + 1}</tex> равно <tex>O(1)</tex>.
|proof=Рассмотрим точки триангуляции <tex>\{A_i\}</tex>. Для каждой точки <tex> A_i</tex> проведем окружность с центром в ней, проходящую через ближайшую к ней точку. Посчитаем во сколько окружностей в среднем попадет точка какая-то точка <tex>U</tex>.
Если на <tex>j</tex>-ой позиции находится черная точка, то точки с индексом <tex>j + 1</tex> и далее не будут содержать в окружности точку <tex>U</tex>(потому что <tex>j</tex> была ближайшей на предыдущем уровне из этой части пространства). Тогда если <tex> X </tex> {{---}} количество окружностей, которым принадлежит точка <tex>U</tex>, то так как точка проходит на следующий уровень с вероятностью <tex>p</tex>:
<tex dpi = 150>E(X) \leqslant \sum\limits_sum_{i = 1\dots}^{\infty}{i \cdot p(1 - p) ^ i} = </tex><tex dpi = 150>\sum\limits_sum_{i = 1\dots}^{\infty}{\sum\limits_sum_{j = i\dots}^{\infty}{p (1 - p) ^ j}} = </tex><tex dpi = 150>p\sum\limits_sum_{i = 1\dots}^{\infty}{(1-p)^i \cdot (\sum\limits_sum_{j = 0\dots}^{\infty}{(1 - p) ^ j})} = \sum\limits_sum_{i = 1\dots}^{\infty}{(1-p)^i} = \fracdfrac{1-p}{p} = O(1)</tex>
Получается, что каждая точка принадлежит <tex>O(1)</tex>, следовательно внутри каждой окружности содержит <tex>O(1)</tex> точек.
}}
{{Лемма
|about=12
|id=313|statement=Средняя степень точек на <tex>i</tex> уровне внутри окружности с центром в точке <tex>Q</tex> и проходящей через точку <tex>P_{i + 1}</tex>(ближайшая точка на <tex>i + 1</tex> уровне)равна <tex>O(1)</tex>
|proof=Пусть есть функция <tex>circle(q, p, i)</tex>, возвращающая <tex>1</tex>, если точка <tex>p</tex> принадлежит окружности с центром в точке <tex>q</tex>, проходящую через ближайшую к <tex>q</tex> на <tex>i</tex> уровне точку, а иначе <tex>0</tex>.
{{Лемма
|aboutid=15|statement=13Степень ближайшей вершины <tex>O(1)</tex>|proof=Доказательство копирует случай на [[Триангуляция Делоне#nearestdegreelemma|плоскости]].}} {{Лемма|id=416
|statement=Один уровень в среднем обрабатывается за <tex>O(1)</tex>
|proof=По [[#2|лемме 11]] алгоритм пройдет в среднем <tex>O(1)</tex> вершин, степень которых так же равна по [[#3|лемме 12]] <tex>O(1)</tex>, следовательно один уровень будет обработан за <tex>O(1)</tex>.
}}
 
 
{{Лемма
|id=17
|statement=На втором этапе алгоритма луч в среднем пересечет <tex>O(1)</tex> ребер.
|proof=Рассмотрим окружность с центром в точке <tex>Q</tex>, проходящую через ближайшую для неё точку триангуляции <tex>P_{i + 1}</tex>.
Количество таких ребер, хотя бы одна граница которых принадлежит окружности не превосходит суммы степеней вершин внутри окружности, следовательно их <tex>O(1)</tex>.
Осталось посчитать ребра, границы которых не лежат внутри окружности. При вставке точки <tex>Q</tex> в триангуляцию для таких ребер испортится критерий Делоне, так как внутри любой окружности построенной на этом ребре будет либо точка <tex>Q</tex>, либо точка <tex>P_{i + 1}</tex>. Значит, что эти ребра надо будет флипнуть, а так как при вставке в среднем флипается <tex>O(1)</tex> ребер, то луч пересечет <tex>O(1)</tex> ребер.
}}
|about=Следствие
|statement=Локализация в среднем работает за <tex>O(\log{n})</tex>
|proof=
}}
 
 
{{Лемма
|id=18
|statement=Точка на сфере может быть ближайшей для не более <tex>6</tex> точек.
|proof=Пусть это не так. Тогда некоторая точка <tex>P</tex> является ближайшей для <tex>7</tex> точек: <tex>A_1 \dots A_7</tex>. Проведем отрезки <tex>P A_i</tex>. Сумма углов между этими отрезками(дугами) равна <tex>2\pi</tex>
 
Рассмотрим треугольник <tex>A_i P A_{i + 1}</tex>, где угол <tex>A_i P A_{i + 1}</tex> минимальный. Он строго меньше <tex>\dfrac{\pi}{3}</tex> (иначе сумма углов была бы больше <tex>2\pi</tex>).
[[https://lurklurk.com/Британские_учёные |Британкие ученые доказали]}, что сумма углов в сферическом треугольнике строго больше <tex>\pi</tex>(школьный факт).
Однако по сферической теореме синусов напротив максимальной стороны лежит максимальный угол. Значит в таком треугольнике сумма углов меньше <tex>\pi</tex>. Противоречие.
}}
 
====Движение вдоль луча====
 
Когда нам надо пройти по триангуляции вдоль какого-то луча <tex>PQ</tex>, то ,оказавшись в каком-то треугольнике, надо проверить, что точка <tex>Q</tex> принадележит этому треугольнику. Если принадлежит, то мы останавливаем свой обход, иначе находим какую сторону пересекал луч и переходим в смежный этой стороне треугольник.
 
{{Теорема
|statement=Луч <tex>PQ</tex> пересекает отрезок <tex>AB</tex> тогда и только тогда, когда повороты точек <tex>A</tex> и <tex>B</tex> относительно <tex>PQ</tex> различены, а повороты <tex>B</tex> и <tex>Q</tex> относительно <tex>AP</tex> совпадают.
|proof='''Необходимость'''
 
<tex>AB</tex> пересекает <tex>PQ</tex>. Очевидно, что в этом случае повороты точек <tex>A</tex> и <tex>B</tex> относительно <tex>PQ</tex> различены. Рассмотрим повороты <tex>B</tex> и <tex>Q</tex> относительно <tex>AP</tex>. Если они различны, тогда луч <tex>PQ</tex> и отрезок <tex>AB</tex> лежат в разных полусферах, но они пересекаются, значит такого быть не может и повороты должны совпадать.
 
'''Достаточность'''
Предикат выполняется. Значит отрезок <tex>AB</tex> пересекает прямую <tex>PQ</tex>. Луч <tex>PQ</tex> в свою очередь есть половина прямой <tex>PQ</tex>. Из того, что повороты <tex>B</tex> и <tex>Q</tex> относительно <tex>AP</tex> совпадают, следует, что отрезок <tex>AB</tex> находится в одной полусфере с лучем <tex>PQ</tex>, значит они пересекаются.
}}
1632
правки

Навигация