Изменения

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

Трапецоидная карта

192 байта добавлено, 15:16, 9 марта 2012
м
нужно больше запятых!
У нас есть множество отрезков, ограниченных оболочкой <tex>R</tex>(это не выпуклая оболочка, а просто мнимая граница плоскости, за которую не вылезают отрезки).
Мы договариваемся, что никакие две точки не лежат на одной вертикалевертикали(в противном случаи все еще случае всё ещё противнее).
''Трапецоидная карта'' множества отрезков <tex>S</tex> {{---}} это эти отрезки и из каждой точки выпущены два луча {{---}} вверх и вниз, до первого пересечения с другим отрезком или с оболочкой <tex>R</tex>.
Введем обозначения для навигации по карте.
*''левая граница'' (<tex>\operatorname{leftpleft}p</tex>) {{---}} точка, определяющая левую сторону трапецоида или, в случаи треугольника, просто являющаяся левой вершиной.*''правая граница'' (<tex>\operatorname{rightpright}p</tex>) {{---}} аналогично левой, только справа.
*''верхний отрезок'' (<tex>\operatorname{top}</tex>) и нижний отрезок(<tex>\operatorname{bottom}</tex>) {{---}} отрезки, ограничивающие, трапецоид сверху и снизу.
*трапецоиды называются ''смежными'', если имеют общую вертикальную границу.
*''Поисковая структура''
Поисковая структура представляет из себя ациклический граф с одним корнем и каждому трапецоиду в структуре соответствует один листсоответствующими трапецоидам листьями.
У каждого узла есть два ребенка и при . При этом узел может быть двух типов.
[[Файл:Trapezoidmapsearchstructureshagal.jpg|650px|thumb|right|навигация в трапецоидной карте]]
*Первый тип узла - точка, соответствующая концу отрезка.
*Второй тип узла - отрезок.
Во время запроса мы двигаемся по графу от его корня до момента, когда окажемся в листе, это . Это и будет означать , что точка находится внутри трапецоида.
Если мы находимся не в листе, то мы должны опрелетиться опредетиться, в каком из детей мы окажемся дальше.
Еcть два правила:
*Если текущий узел соответсвует вершине, то смотрим левее или провее правее мы находимся(проверка по <tex>x</tex>-координате). *Если текущий узел соответствует отрезку, то смотрим выше или ниже мы находимся(проверка по <tex>y</tex>-координате).
*Плохие случаи:
Мы находимся на одной вертикале вертикали с вершиной
Мы находимся на отрезке
==Алгоритм==
[[Файл:Trapezoidmapnotsuchbadcaseshagal.jpg|400px|thumb|right|простой случай]]
Во время построения трапецоидной карты(в дальнейшем <tex> T</tex>) алгоритм так же строит структуру для поиска .
Так как трапецоидная карта {{- --}} геометрическая структура, а основные операции ведутся именно с поисковой, основной упор делается на неё.
Наш алгоритм добавляет отрезки по одному и , после каждого добававления добавления, модидицирует <tex> T</tex> и <tex> D</tex>.
''Порядок добавления отрезков''
От порядка добавления зависит время запроса. Как? Время запрос пропорцианально глубине графа.
Считается, что еслли если добавлять отрезки рандомнов случайном порядке, то время будет хорошим. Почему и какое время будет рассписано достигаться, расписано дальше.
===Алгоритм===
*Удалили их.
*Создали новый новые трапецоиды.
[[Файл:Trpezoidmapbadcaseshagal.jpg|400px|thumb|right|сложный случай]]
===Поиск трапецоидов которых , которые пересек отрезок===Чтобы модифицировать карту, мы должны понять , где произошло изменение.
Оно произошло в тех трапецоидах , которые пересек текущий отрезок , или можно сказать, что трапецоид с <tex>i-1</tex>-ой итерации не будет в <tex>i</tex>-ой только если его пересек отрезок.
Пусть якобы есть множество трапецоидов <tex>\Delta_0, \Delta_1, \Delta_2 ... \ldots \Delta_k</tex> , упорядоченное по <tex>s_i</tex>
Пусть <tex>\Delta_{j+1}</tex> {{---}} один из правых соседей <tex>\Delta_j</tex> . Так же , при этом не сложно понять , каким соседом он является.
Если rightp(<tex>\operatorname{rightp} \Delta_j</tex>) лежит выше <tex>s_i</tex>, то сосед нижний и наоборот.
Это значит, что , если мы знаем первый трапецоид, то мы можем найти остальные просто обходя по карте соседей справа.
Чтобы найти первый трапецоид , нужно просто локализовать правый конец в текущей карте.
===update===
Есть два случая.
*Простой {{- --}} отрезок не пересекает ни одного трапецоида, то есть целеком целиком внутри.
Тогда удаляем этот старый трапецоид и на его место ставим дерево из двух концов отрезка, отрезка и четырех образовавшихся трапецоидов.
Важно не забыть правильно определить соседей новых трапецоидов.
В случае, если какие-то трапецоиды выродятся в треугольники, будет не четыре новых трапецоида, а 2 или 3. Слава богу это не самая большая проблема.
В случаи если какие-то трапецоиды выродятся в треугольники будет не четыре новых трапецоида , а 2 или 3. Слава богу это не самая большая проблема. *Сложный {{--- }} отрезок пересекает сразу несколько трапецоидов.
Итак наш отрезок пересекает трапецоиды <tex>\Delta_0, \Delta_1, \Delta_2 ... \Delta_k</tex>.
Сначала добавляем вертикальные лучи из концов текущего отрезка. Это нужно, чтобы модифицировать <tex>\Delta_0 </tex> и <tex>\Delta_k</tex>.Теперь мы должны удалить соответствующие листья и на их место поставить те новые , которые появились из-за изменения лучей.
Дальше мы модифицуруем вертикальные лучи, которые пересекают текущий отрезок. Этот процесс происходит достаточно быстро, так мы храним много информацию об этих лучах в .
По -хорошему , то , как этот это происходит , просто ужасно и видеть это этого не хочется, а . А все потому, что много что добавляется добавляет много новых узлов.
<tex>\Delta_0, \Delta_1, \Delta_2 ... \ldots \Delta_k</tex>.
==Случай коллизии==
Рассмотрим момент, когда мы мы строим карты. Мы должны добавить очередной отрезок.
Предположим, левый конец отрезка лежит на одной вертикале с уже добавленной в карту точкой <tex> p </tex>.
Скажем, что наша точка лежит правее , чем та , которая уже есть. В случаи случае, если мы попали на уже созданный отрезок , мы скажем, что находимся , например , ниже его.
Что при этом произойдет.
*С геометрической точки зрения , появится еще ещё несколько трапецоидов , как в случааи случае, если бы вновь добавленная точка была правее на <tex> \varepsilon \rightarrow 0</tex>.
А значит, у трапецоида по прежнему не более двух правых соседей.
*С точки зрения поисковой структуры мы по -прежнему можем локализоваться. По крайней мере , узел , соответствующий точке <tex> p </tex> будет иметь правого сына правым сыном нашу точку. 
Итого, слова "трапецоидные карты просты отсутствие случаев" появляются именно отсюда, так как , казалось бы , неприятный случай будет прописан заменой <tex>\textless </tex>
на <tex> \le </tex>
403
правки

Навигация