Научная статья на тему 'Графический поиск с использованием триангуляции и клеточного разбиения'

Графический поиск с использованием триангуляции и клеточного разбиения Текст научной статьи по специальности «Математика»

CC BY
499
104
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по математике, автор научной работы — Костюк Юрий Леонидович

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Graphical search using triangulation and cellular fragmentation

The task of graphical search on a planar subdivision by polygons is considered. The search region is divided into square cells and is triangulated subject to boundaries of polygons. The average search length is computed and parameters of cellular fragmentation and triangulation are optimized for uniform and non-uniform distribution of input points. The algorithms of regional search having linear time complexity are introduced.

Текст научной работы на тему «Графический поиск с использованием триангуляции и клеточного разбиения»

Ю.Л. Костюк

ГРАФИЧЕСКИЙ ПОИСК С ИСПОЛЬЗОВАНИЕМ ТРИАНГУЛЯЦИИ И КЛЕТОЧНОГО РАЗБИЕНИЯ

Работа выполнена при финансовой поддержке РФФИ, грант № 98-07-03194

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

Для таких областей применения, как географические базы данных или обработка изображений, особенно важна задача графического поиска на плоскости. В [1-2] описан ряд алгоритмов, однако одни из них недостаточно эффективны, другие чрезмерно громоздки и требуют много памяти. Простейший вариант поиска - локализация точки на планарном подразбиении, когда плоскость делится на непересе-кающиеся многоугольники, а запрос является точкой. Задача состоит в определении того многоугольника, в который попадет точка запроса. В большинстве алгоритмов многоугольники предварительно делятся на более простые области - трапеции или треугольники. Лучшие из известных методов (метод детализации Киркпатрика [3], метод трапеций Препараты [2]) требуют много памяти и сложных структур данных. Хотя эти методы являются асимптотически оптимальными с временем поиска O (log n), однако константы пропорциональности в них столь велики, что на практике их применение оказывается недостаточно эффективным.

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

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

Свойства триангуляции в случае равномерного распределения точек

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

Треугольники вблизи границы триангуляции, которая является выпуклой оболочкой заданного множества точек, получаются сильно вытянутыми вдоль границы. Поэтому выделим вдали от границы внутри области прямоугольник со стороной а вдоль оси X со стороной b вдоль оси 7. Так как распределение точек в прямоугольнике равномерное, то можно считать, что все треугольники в нем имеют в среднем одинаковые размеры. Оценим среднюю длину ребра триангуляции внутри прямоугольника при следующих предположениях:

1) в прямоугольник попадает п0 точек;

2) триангуляция минимизирует суммарную длину ребер;

3) длину ребра, соединяющего точки (х,, у,) и X у), будем оценивать метрикой по Манхэттену:

I, = | X, - Х3 |+| у, -у} \.

Из последнего предположения следует, что среднее значение суммы длин ребер равно сумме средних длин ребер отдельно по координатам X и У.

Разделим прямоугольник на т равных по ширине горизонтальных полос. Предположим, что среднее количество точек в каждой из полос (частное р =п0/т)

- целое. Внутри каждой из полос соединим точки отрезками по возрастанию координаты X. Между полосами соединим точки отрезками так, чтобы получились треугольники, как на рис. 1. Так как вся триангуляция представляет собой единое целое, то необходимо рассматривать также точки за пределами прямоугольника, находящиеся вблизи его границ. Тогда максимально возможное количество отрезков, пересекающих горизонтальную линию, разделяющую полосы внутри прямоугольника, будет равно 2р.

У

Рис. 1

Будем искать решение для случая п0^ж, т^ж,

— ^ ж. Вычислим среднюю величину суммы т

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

кающие границу прямоугольника справа или снизу (но не слева или сверху).

Назовем те отрезки непрерывной ломаной, которые соединяют точки в одной полосе, продольными, отрезки, соединяющие точки между соседними полосами, - поперечными. В реальной триангуляции обычно присутствуют не все потенциально возможные поперечные отрезки, так как некоторые точки в полосе соединены не только с соседними точками в этой полосе, но и с некоторыми, отстоящими дальше, как это показано на рис. 1. Отрезки, соединяющие такие точки, назовем спрямляющими. Будем считать, что спрямляющие отрезки соединяют точки в полосе только через одну, пренебрегая редко встречающейся для равномерного распределения ситуацией, когда соединенные между собой в полосе точки отстоят друг от друга через две, три точки и далее. Не будем учитывать также другую редко встречающуюся ситуацию, когда некоторые две рядом стоящие в полосе точки не соединены между собой. Тогда общее число поперечных и спрямляющих отрезков будет равно 2р.

Обозначим через в среднюю долю из 2р спрямляющих отрезков, причем в<<1. На рис. 1 видно, что из поперечных отрезков можно выделить непрерывную ломаную от начала полосы до конца. При этом часть поперечных отрезков (их среднюю долю обозначим за а) не войдет в ломаную, причем а<<1. На рис. 1 продольные отрезки изображены толстыми линиями, поперечные отрезки, образующие непрерывную ломаную,- штриховыми линиями, остальные поперечные отрезки - сплошными тонкими линиями, спрямляющие отрезки - пунктирными линиями.

Для дальнейшего вывода используем следующие известные из теории вероятностей соотношения для равномерного на интервале [0,1] одномерного распределения:

1) среднее равно 1/2;

2) среднее абсолютного значения разности двух независимых случайных величин равно 1/3;

3) среднее значение разности максимального и минимального значений в выборке из п независимых случайных величин [4] равно (п-1)/(п+1).

Из последнего соотношения следует, что при п0^ж справедливо (п-1)/(п+1)^1.

Для продольных отрезков в полосе общая средняя

длина по X равна а, по У - 1 Ь—. Для поперечных

3 т т

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

равна Ь (1 - в). Этой же величине равна и длина всего

т

отрезка. Тогда длина всех отрезков равна

Ь (1 - в)2 ^(1 -в). тт

Для спрямляющих отрезков в полосе общая средняя длина по X с одной стороны от продольных отрезков ломаной равна 2ав, так как каждый спрямляющий отрезок образуется точками, расположенными через одну. Общая средняя длина по У равна

1 Ь п0 а тт

------- р . Для всех спрямляющих отрезков с двух

3 т т

сторон от продольных отрезков ломаной эти величи. „ 2 Ь п0

ны удвоятся: 4 ар и------- р соответственно.

3 т т

Тогда средняя длина всех ребер триангуляции внутри квадрата будет равна сумме длин отрезков в одной полосе, умноженной на число полос т:

Ь(т) = а(2 + а+ 4в)т + Ь(7 -10 в) —. (1)

3 3 т

Выражение (1) будет справедливым, если число полос т выбрано так, что оно минимизирует Ь(т). Для нахождения такого т продифференцируем Ь(т) и приравняем к нулю. Отсюда получим:

Ь(7 - 10в)

(2)

а(6 + 3а + 12в)

Тогда среднее число поперечных отрезков равно

п0

р0 = 2—(1 - в), а с учетом того, что а<<1 и Р<<1, т

приближенно получим:

Ро = с.

Ь

2£ <>+7 в>]"ь0

(3)

Экспериментальная оценка величины с вычислялась статистическим моделированием для различных п0 при а=Ь=1. Приведенные в таблице числовые оценки имеют верный второй знак после запятой с вероятностью 0,95. Эти оценки при большой величине п0 практически совпадают с (3), если положить а = в = 0,2 .

п0 5 10 20 50 100 1000 10000

с 2 2, 2,1 2,16 2,20 2,22 2,22

Подставив (2) в (1), получим суммарную длину (по Манхэттену) всех ребер в прямоугольнике:

К = 2.

а Ь

Т

(2 + а + 4в)(7 - 10в)п0

(4)

Подставив в (4) значения а = в = 0,2 и учитывая, что при по^-да число всех ребер в прямоугольнике стремится к 3п0, получим среднюю длину ребра (по Манхэттену):

^V5 1а Ь

1т =

(5)

Учитывая также, что среднее отношение длины по Манхэттену к евклидовой длине одного и того же отрезка (повернутого на случайный угол с равномерным распределением) равно 4/п, получим среднюю евклидову длину ребра:

е = п/5 Оь я Ш1 ІТь. (6)

6 V п0 V п0

а п

0

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

Известный алгоритм триангуляции с ограничениями [2] строит какую-то триангуляцию, которая может как угодно отличаться от триангуляции Делоне. С другой стороны, можно определить триангуляцию Делоне с ограничениями [5], в которой для любой пары смежных по ребру треугольников выполняется условие Делоне, если только это ребро не является ребром ограничения.

Такую триангуляцию можно построить различными способами, в частности модификацией алгоритма, описанного в [2], требующего время O(n log n). На первом

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

Предложенный в [5] алгоритм построения триангуляции Делоне с ограничениями является модификацией алгоритма динамического кэширования [6]. Он является итеративным, т.е. на очередном шаге в триангуляцию включается новая точка (или отрезок ограничения). Для ускорения локализации точки применяется вспомогательная прямоугольная кэш-таблица. При вставке отрезка перестраиваются те ребра триангуляции, которые он пересекает. Этот алгоритм требует среднего времени O(n), если точки концов отрезков ограничений распределены равномерно и независимо, а длины отрезков невелики. Точнее, среднее количество пересечений отрезков ограничений с ребрами триангуляции Делоне, построенной по точкам, являющимися концами отрезков ограничений, должно быть константой. Это условие можно проверить следующим способом. Формула (3) дает оценку среднего количества р0 пересечений ребер триангуляции с отрезком линии, имеющим длину а, внутри прямоугольника axb. Оценку средней длины le ребра триангуляции дает формула (6). Тогда среднее количество пересечений ребер триангуляции с произвольным отрезком длиной le равно p0le~2,6. Таким образом, отрезки ограничений должны иметь длину порядка le. Достаточно даже, если общая длина всех n0 отрезков ограничений имеет порядок n0le « 1,171^abn0.

Многоуровневый алгоритм

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

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

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

Алгоритм 1. Многоуровневый алгоритм триангуляции Делоне с ограничениями. На входе задается список отрезков ограничений (в виде пар точек) и список свободных исходных точек.

1. Строится суперструктура (объемлющая прямоугольная область) в виде начальной триангуляции, внутрь которой заведомо попадают все концы отрезков и свободные точки.

2. Прямоугольная область разделяется на одинаковые квадраты, их количество - Q Я, где Q - число строк, Я - число столбцов.

3. Вызывается рекурсивная процедура 2 со следующими параметрами:

a) список отрезков ограничений и список свободных исходных точек;

b) начальная триангуляция;

c) параметры прямоугольной области, разбитой на клетки;

ф параметр g.

Конец алгоритма.

Рекурсивная процедура 2. Вход:

a) список отрезков ограничений и список свободных исходных точек;

b) триангуляция;

c) параметры прямоугольной области, разбитой на клетки;

ф параметр g.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Выход: триангуляция.

1. Создается таблица счетчиков Су и таблица пустых ссылок Бу, в них каждый элемент соответствует клетке прямоугольной области. Создается начальная кэш-таблица.

2. Цикл по входным спискам отрезков и точек.

2.1. Для каждой точки (или обоих концов отрезка) определяется номер клетки и соответствующий элемент таблицы счетчиков Су увеличивается на 1. В случае отрезка на 1 увеличиваются оба элемента таблицы счетчиков, соответствующих концам отрезка.

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

3. Уничтожение таблицы счетчиков Су

4. Цикл по ссылкам Бу.

4.1. Если ссылка на список есть, то вызов процедуры 2 с параметрами:

a) список, адресуемый ссылкой Бу,

b) текущая триангуляция;

c) параметры квадратной области, которая соответствует ссылке Бу

5. Уничтожение текущей кэш-таблицы.

Конец процедуры.

Трудоемкость всего алгоритма при надлежащем выборе параметров - О(п) в среднем. Действительно, его трудоемкость Т(п) ограничена формулой

T(n) < k n + r k n + r2 k n + r3 k n +... = kn/(1 - r),

где k - константа, если в любом из квадратов разбиения количество точек не превышает доли r от всех точек, а средняя длина отрезков ограничений в постоянное количество раз не превышает le по формуле (6), в которой параметры a, b определяются размерами квадрата разбиения, n0 - количеством попавших в этот квадрат точек.

Поиск на триангуляции с помощью поисковой таблицы

Пусть триангуляция находится внутри прямоугольной области a х b . Разобьем эту область на R столбцов и Q строк так, чтобы получившиеся клетки со сторонами a/R и b/Q были квадратами (при необходимости одну из границ а или b можно немного увеличить). Построим поисковую таблицу в виде двумерного массива T из R столбцов и Q строк. Каждой из клеток области соответствует элемент Ту поисковой таблицы (i - номер строки, j

- номер столбца клетки). Этот элемент должен содержать номер того треугольника, внутрь которого попадет точка (xcyc) с координатами центра ij-й клетки области xc = (i - 0,5)а / R и yc = (j - 0,5)b / Q.

Пусть по точкам с равномерным и независимым распределением координат построена триангуляция Делоне. Рассмотрим квадратную клетку в середине триангуляции, вдали от ее краев. Проведем отрезок через всю клетку параллельно одной из ее сторон. Формула (3) дает среднее количество пересечений этого отрезка с ребрами триангуляции в зависимости от количества точек n0 внутри клетки. Это число не зависит от размера квадрата, поэтому квадрат можно считать единичным.

Рассмотрим ситуацию попадания случайной равномерно распределенной точки внутрь квадратной клетки. Среднее расстояние от места попадания этой точки до центра единичного квадрата:

1/2 1/2 _______ п/4 1/(2 cos ф)

q = 4 j j ■у x2 + у2 dx dy = 8 j dф j r2 dr =

0 0 п/4

8 r dф л/2 1, 3

= - j ------— = —+ -In tg-я» 0,38259. (7)

з 0 cos^ 6 6 8

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

Таблица 1-го уровня соответствует разбиению исходной прямоугольной области на 0 Я квадратных клеток, 0Я&п. Большинство элементов Ту содержат номера тех треугольников, в которые попадут точки центров соответствующих клеток. Если количество исходных точек щ, попавших в клетку г-й строки и у-го столбца, превышает некоторый параметр g, то соответствующий элемент поисковой таблицы первого уровня содержит ссылку на таблицу второго уровня (обозначенную Т"2)у). Число ее элементов должно быть близко к Пу. На втором уровне может быть несколько таблиц, присоединенных к разным клеткам таблицы первого уровня. С помощью аналогичного приема для отдельных клеток поисковой таблицы второго уровня строятся таблицы третьего уровня и т.д. В результате получается многоуровневая поисковая таблица.

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

М(п) < п + гп + г2п + гЗп + ... = п /(1 - г). (9)

Обозначим за г8 максимальную долю исходных точек в отдельной клетке области по отношению ко всем точкам области (для таблиц всех уровней), при этом г<г. Тогда максимальное число уровней к определяется из неравенства пг^к < g, откуда:

k =

n n

log1 — < log1 —

^g r g

(10)

Таким образом, среднее количество шагов при поиске не превысит суммы Б числа уровней поисковой таблицы (10) и средней длины поиска в клетке с g точками (8):

Тогда средняя длина поиска при движении по отрезку от места попадания случайной точки до центра квадрата будет равна (приближенно) произведению р0 и q по формулам (3) и (7) соответственно:

Poq ~ 0,85д/п~. (8)

Заметим, что если исходное распределение точек триангуляции неравномерное в целом, но внутри каждой клетки близко к равномерному, то средняя трудоемкость поиска будет не хуже чем (8) при значении п, равном максимальному числу исходных точек, попавших в любую из клеток. Если, например, число клеток близко к п -общему числу точек в триангуляции, то даже если в отдельные клетки попадет не одна точка, а 100, средняя длина поиска не превысит на этих клетках величины 9, что вполне приемлемо. При этом даже такая большая таблица занимает на самом деле не слишком много памяти - менее 1/10 от памяти, занимаемой триангуляцией.

Многоуровневая поисковая таблица

Для случая неравномерного распределения точек, когда эффективность поиска с помощью обычной 150

D =

і n

log 1 —

7.8

- 0,85^/g".

Величина Б зависит от произвольно задаваемого параметра g, поэтому ее можно минимизировать. Для этого представим Б(^) как функцию

D( g) = A

n

log 1 — 7 8

Bjg,

продифференцируем ее по g и приравняем к нулю. В результате получим

g =-

A2

4 B2 ln2 —

(11)

Это значение g дает минимум Б, так как Б” (g) = 7 В

= > 0 . Оптимальное значение g по формуле (11)

g

для реальных ситуаций, когда г^<< 1, может быть малым, даже меньшим единицы. Однако в действительности g не может быть произвольным, оно должно

0

0

r

выбираться из ряда: 3, 7, 15, 31 и т.д., так как поисковая таблица следующего уровня, содержащая не менее чем £+1 точек, должна разбиваться на целое число клеток, равное квадрату целого числа.

Рассмотрим построение поисковой таблицы. Одноуровневую поисковую таблицу легко создать после построения триангуляции. Для этого вначале необходимо задать параметры поисковой таблицы. Затем в цикле проводим поиск по триангуляции номеров треугольников, в которые попадают центральные точки квадратов (хсус) для всех элементов поисковой таблицы Ту. Если триангуляция построена алгоритмом кэширования, то для поиска первого элемента Тп можно воспользоваться кэш-таблицей. Затем можно перебирать элементы в первом ряду слева направо, во втором ряду

- справа налево, в третьем ряду снова слева направо и т.д., затрачивая на поиск очередного элемента 0(1) шагов. Так как количество элементов поисковой таблицы близко к п, то средняя трудоемкость построения всей таблицы будет иметь порядок 0(п).

Создание многоуровневой поисковой таблицы можно совместить с построением триангуляции алгоритмом 1 и рекурсивной процедурой 2. Для этого в алгоритм добавляются следующие действия:

1) процедуре 2 дополнительно передается параметр-указатель;

2) на шаге 1 процедуры 2 создается поисковая таблица Т очередного уровня, указателю присваивается ссылка на эту таблицу;

3) на шаге 4.1 процедуры 2 (при ее рекурсивном вызове) элемент поисковой таблицы Ту передается как параметр-указатель;

4) добавляется шаг 4.1 со следующим действием:

4.1) Если ссылка на список Бу пустая, то поиск с

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

Добавляемые действия несущественно увеличивают время выполнения всего алгоритма.

Заключительным этапом формирования структуры для последующего быстрого поиска является классификация (разметка) треугольников по многоугольникам (полигонам). Рассмотренные алгоритмы производят такую триангуляцию с ограничениями, что если исходные многоугольники имеют непере-секающиеся между собой границы, то каждый полученный в триангуляции треугольник принадлежит ровно одному многоугольнику. При этом допускается также, чтобы один многоугольник целиком размещался внутри другого многоугольника. Рассмотренный в [5] алгоритм классификации треугольников использует идею алгоритма закраски сплошной области с затравкой [7].

Поиск по региональным запросам

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

поисковая таблица и сделана классификация треугольников.

Вначале рассмотрим запрос в виде ломаной линии. Результатом поиска будут номера многоугольников, пересекаемых ломаной. Алгоритм 3, реализующий такой поиск, довольно прост, при этом не накладывается никаких ограничений на ломаную линию: она может быть даже самопересекающейся.

Алгоритм 3. Поиск по запросу в виде ломаной линии. Вход: а) триангуляция; Ь) поисковая таблица; с) массив пометок треугольников; ф ломаная, заданная I точками.

Выход: список номеров многоугольников, пересекаемых ломаной.

1. С использованием поисковой таблицы поиск треугольника, внутрь которого попадает 1-я точка ломаной. Занесение пометки этого треугольника в выходной список. Задание г=2.

2. Цикл по номерам точек ломаной, пока г<1.

2.1. Отслеживание треугольников, пересекаемых отрезком между точками г - 1 и г. Занесение пометок этих треугольников в выходной список с исключением повторений.

Конец алгоритма.

Трудоемкость алгоритма - 0(1 + к), где I - число отрезков ломаной, задающей запрос, к - число треугольников триангуляции, пересекаемых ломаной.

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

Алгоритм 4. Поиск по запросу в виде выпуклого многоугольника. Вход: а) триангуляция; Ь) поисковая таблица; с) массив Р поисковых пометок треугольников (обнуленный); ф замкнутая ломаная границы запроса, заданная I точками.

Выход: а) список Б номеров треугольников, частично пересекаемых многоугольником запроса; Ь) список и номеров треугольников, полностью перекрываемых многоугольником запроса; с) список О номеров треугольников, соседних с треугольниками списка Б и не пересекающихся с многоугольником запроса.

1. С использованием поисковой таблицы поиск треугольника ^, внутрь которого попадает 1-я точка ломаной.

2. Цикл по уменьшающимся номерам точек ломаной, начиная с п, для определения того отрезка (/-1у) ломаной, который входит в треугольник ^ при обходе по часовой стрелке.

3. t - номер текущего треугольника. t=t1.

4. Цикл по номерам треугольников вплоть до возвращения в треугольник ^.

4.1. Цикл просмотра отрезков ломаной от точки у до такой точки г, что отрезок (г-1,г) пересекает треугольник t.

4.2. Проверка варианта пересечения ломаной на промежутке от точки г-1 до точки г с треугольником t. Занесение внешних треугольников (если они есть) в список О и пометка их в массиве Р как -1. Занесение внутреннего треугольника (если он есть и помечен в Р нулем) в стек и пометка его числом 2. Занесение треугольника t в список Б и пометка его числом 1.

4.3. Переход к соседнему с t треугольнику, пересекаемому отрезком ломаной между точками г-1 и г. Теперь t - номер нового треугольника. у=г.

5. Цикл, пока стек не пуст.

5.1. Извлечение из стека треугольника t. Если его пометка 2, то занесение в список и и проверка соседних с ним треугольников. Занесение треугольников, помеченных нулем, в стек и пометка их числом 2 в массиве Р.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

6. Обнуление в массиве Р тех элементов, номера которых занесены в списки Б, О и и.

Конец алгоритма.

Чтобы после выполнения алгоритма 3 перейти от номеров треугольников, занесенных в списки Б и и, к номерам исходных многоугольников (поисковым объектам), необходимо в цикле по элементам списков Б и и составить выходной список пометок принадлежности этих треугольников и исключить в нем повторения. Шаг 6 обнуления части элементов массива Р необходим в алгоритме для того, чтобы такой поиск можно было проводить многократно без обнуления всего массива Р.

С помощью алгоритма 3 можно также проводить региональный поиск точечных объектов. Для этого после выполнения алгоритма 3 необходимо в цикле по треугольникам из списков Б и и сформировать список принадлежащих им точек, исключив повторения. Затем из сформированного списка исключить те точки, которые принадлежат треугольникам списка О.

Нетрудно видеть, что алгоритм 3 имеет трудоемкость порядка 0(1+к), где I - число отрезков границы многоугольника запроса, к - число пересекаемых многоугольником треугольников триангуляции.

ЛИТЕРАТУРА

1. Мартынов М. Г. Пространственные методы доступа // Программирование. 1998. № 3. С. 59-69.

2. Препарата Ф., ШеймосМ. Вычислительная геометрия: Введение. М.: Мир, 1989.

3. KirkpatrickD.G. Optimal Search in Planar Subdivisions // SIAM J. Comput. 12(1). 1983. P. 28-35.

4. Гаек Я., Шидак З. Теория ранговых критериев. М.: Наука, 1971.

5. Скворцов А.В., Костюк Ю.Л. Применение триангуляции для решения задач вычислительной геометрии // Геоинформатика: Теория и практика. Вып. 1. Томск: Изд-во Том. ун-та, 1998. С. 127-138.

6. Скворцов А.В., Костюк Ю.Л. Эффективные алгоритмы построения триангуляции Делоне // Геоинформатика: Теория и практика. Вып. 1. Томск: Изд-во Том. ун-та, 1998. С. 22-47.

7. Роджерс Д. Алгоритмические основы машинной графики. М.: Мир, 1989.

Статья представлена кафедрой теоретических основ информатики факультета информатики Томского государственного университета, поступила в научную редакцию номера 3 декабря 2001 г.

i Надоели баннеры? Вы всегда можете отключить рекламу.