Snap rounding — различия между версиями
Alex z (обсуждение | вклад) (→Свойства) |
Alex z (обсуждение | вклад) м |
||
Строка 11: | Строка 11: | ||
|} | |} | ||
− | '''Snap rounding''' (фиксирование выравнивания) {{---}} это алгоритм, который восстанавливает топологию множества отрезков, координаты которого заданны с некоторой | + | '''Snap rounding''' (фиксирование выравнивания) {{---}} это алгоритм, который восстанавливает топологию множества отрезков, координаты которого заданны с некоторой <tex>\varepsilon</tex> погрешностью. |
===Мотивация=== | ===Мотивация=== | ||
Строка 26: | Строка 26: | ||
==Алгоритм== | ==Алгоритм== | ||
+ | |||
+ | {{Определение | ||
+ | |definition= | ||
+ | '''Активная ячейка''' {{---}} ячейка решётки, относительно которой идёт выравнивание, в которую попал конец отрезка или точка пересечения отрезков из <tex>A</tex>. | ||
+ | }} | ||
+ | |||
+ | {{Определение | ||
+ | |definition= | ||
+ | '''Пучок''' <tex>b_h</tex> {{---}} подмножество отрезков <tex>A</tex>, у которых меньший в лексикографическом порядке конец лежит в ячейке <tex>h</tex>. | ||
+ | }} | ||
+ | |||
+ | {{Определение | ||
+ | |definition= | ||
+ | <tex>u(b)</tex> {{---}} отрезок лежащий выше всех в пучке <tex>b</tex>.<br/><tex>l(b)</tex> {{---}} отрезок лежащий ниже всех в пучке <tex>b</tex>. | ||
+ | }} | ||
+ | |||
+ | В целом алгоритм выравнивания похож на [[Алгоритм Бентли-Оттмана|алгоритм Бентли-Оттмана]], только мы будем манипулировать пучками вместо отрезков. | ||
+ | |||
+ | Инициализируем приоритетную очередь <tex>Q</tex> для хранения активных ячеек в лексикографическом порядке. Также инициализируем статус <tex>T</tex> для хранения пучков, которые в данный момент пересекает заметающая прямая. Для каждого конца отрезка из <tex>A</tex> добавим в <tex>Q</tex> соответствующую активную ячейку. | ||
+ | |||
+ | Далее будем доставать из <tex>Q</tex> активные ячейки и для каждой ячейки <tex>h</tex> выполнять следующие операции: | ||
+ | #Найдём все пучки в статусе <tex>T</tex>, которые пересекают ячейку <tex>h</tex>. | ||
+ | #Разобьём каждый пересекающий пучок на три части: | ||
+ | #Обновим статус. | ||
==Упрощение выравнивания== | ==Упрощение выравнивания== |
Версия 00:20, 4 августа 2014
Содержание
Введение
Snap rounding (фиксирование выравнивания) — это алгоритм, который восстанавливает топологию множества отрезков, координаты которого заданны с некоторой
погрешностью.Мотивация
Пусть у нас есть множество отрезков, чьи координаты были получены с некоторой абсолютной погрешностью. В такой структуре может быть нарушена топология, а это может повлиять на работу других алгоритмов над этой структурой.
Например, если у нас появилось ложное пересечение (рисунок 1) мы можем получить отрицательное "расстояние" до прямой, если ожидаем, что все точки лежат с одной стороны относительное неё. Ещё, из-за недостаточной точности, может быть нарушена замкнутость контура (рисунок 2), что приведёт, например, к неправильной заливки области в графическом редакторе.
Свойства
Пусть нам дано множество отрезков
, тогда полученный после выравнивания планарный граф должен обладать следующими свойствами:- Фиксированная точность координат: все координаты должны лежать в узлах некоторой решётки с шагом .
- Геометрическое подобие: суммой Минковского и квадрата со стороной . должен полностью лежать в области, полученной
- Топологическое подобие: Существует непрерывное преобразование в .
Алгоритм
Определение: |
Активная ячейка — ячейка решётки, относительно которой идёт выравнивание, в которую попал конец отрезка или точка пересечения отрезков из | .
Определение: |
Пучок | — подмножество отрезков , у которых меньший в лексикографическом порядке конец лежит в ячейке .
Определение: |
— отрезок лежащий ниже всех в пучке . | — отрезок лежащий выше всех в пучке .
В целом алгоритм выравнивания похож на алгоритм Бентли-Оттмана, только мы будем манипулировать пучками вместо отрезков.
Инициализируем приоритетную очередь
для хранения активных ячеек в лексикографическом порядке. Также инициализируем статус для хранения пучков, которые в данный момент пересекает заметающая прямая. Для каждого конца отрезка из добавим в соответствующую активную ячейку.Далее будем доставать из
активные ячейки и для каждой ячейки выполнять следующие операции:- Найдём все пучки в статусе , которые пересекают ячейку .
- Разобьём каждый пересекающий пучок на три части:
- Обновим статус.
Упрощение выравнивания
Замечания
Ссылки
- CGAL - 2D Snap Rounding
- Iterated snap rounding with bounded drift
- Efficient Snap Rounding with Integer Arithmetic
- An Intersection-Sensitive Algorithm for Snap Rounding