УДК 681.3
АЛГОРИТМ ПОСТРОЕНИЯ ОВЕРЛЕЯ МНОГОУГОЛЬНИКОВ И МНОГОГРАННИКОВ
Н.А. Тюкачев
Для описания гомогенных слоев породы в геоинформационных системах предлагается модель трехмерного тела, ограниченного множеством треугольников. Проводится анализ известных алгоритмов оверлеев многоугольников и предлагается иной, индексный, алгоритм, подходящий для булевых операций над трехмерными телами. Алгоритм основан на локальном анализе семейств инцидентных вершин, граней и ребер. В отличие от ранее предлагаемых, алгоритм не требует глобальной упорядоченности ребер
Ключевые слова: геометрические алгоритмы, оверлей многоугольников и многогранников
'В геоинформационных системах (ГИС) для описания слоев породы или рудного тела необходимо использовать трехмерные объекты. Эти объекты могут быть гомогенными, например, слой породы с одинаковой литологи-ей|стратиграфией, или гетерогенными, например, рудное тело с плотностью руды, зависящей от координат.
Для описания гомогенных объектов можно использовать граничную модель, определяяя границу как множество многоугольников. Частным случаем граничной модели является модель трехмерного тела, у которого граница представляет собой замкнутое множество нерегулярных треугольников. Замкнутую ориентированную поверхность Р разобьем на треугольники со следующими условиями: а) каждая точка поверхности Р принадлежит хотя бы одному треугольнику; б) два треугольника могут пересекаться только в одной вершине или по целому ребру. Такую модель будем называть CTIN-представлением или CTIN-поверхностью (CTIN
- closed triangular irregular network). На рис. 1 изображены верхняя и боковая триангулированные поверхности слоя.
Рис. 1. Пример трехмерной CTIN-модели для слоя
Тюкачев Николай Аркадиевич - ВГУ, канд. физ.-мат. наук, доцент, тел. 208-470, E-mail: [email protected]
Заметим, что такая трехмерная область может быть многосвязной и/или иметь полости. Многосвязность и число полостей описывается эйлеровой характеристикой %. В работе [15] доказана теорема: для замкнутой триангуляции (CTIN), ограничивающее тело с g полостями или ограничивающее тело, состоящее из N=1-g изолированных частей, справедливы следующие зависимости числа ребер Pg и граней rg от числа узлов Bg и эйлеровой характеристики xg поверхности: rg = 2*(В - xg); Pg = 3*(В - xg). Напомним, что эйлерова характеристика связана с числом полостей g формулой Xg = 2 - 2*g, а с числом изолированных частей тела N формулой xg = 2*N = 2-2*g, если считать, что N=1-g.
Модель CTIN обладает следующими достоинствами:
• в случае изменения координат узловой точки, топология поверхности не меняется, как это могло бы быть в случае использования, например, плоских четырехугольников;
• бинарные операции (оверлеи) над такими телами (объединение, пересечение, вычитание) сводятся к операциям пересечения треугольников с многогранниками;
• результат бинарных операций над двумя CTIN-телами дает CTIN-тело;
• требует значительно меньше ресурсов для хранения и вычислений, чем модель TEN (tetrahedral network), основанная на тетраэдрах.
Перечислим некоторые из задач, возникающих при работе с CTIN-поверхностями:
1. построение 2Б-триангуляции верхней и нижней поверхности слоя;
2. построение 2Б-триангуляции с ограничениями в виде произвольного многоугольника или ломаной линии, моделирующей разлом земной коры;
3. построение триангуляции всех слоев;
4. сглаживание триангуляции;
5. задача построения триангуляции боковой поверхности слоя, которая сводится к созданию упорядоченного по обходу массива номеров граничных точек;
6. построение триангуляции невыпуклого многоугольника вертикального разреза слоя;
7. построение изолиний;
8. булевы операции над 3Б-телами, которые сводятся к задачам:
■ определение точек пересечения двух тел. Эта задача сводится к определению точек пересечения ребер одного тела с гранями второго тела;
■ разбиение ребер и треугольных граней на новые грани и ребра;
■ расстановка индексов для вершин, ребер и граней;
9. изображение тела.
В этой работе проводится анализ известных алгоритмов оверлеев многоугольников и предлагается иной, индексный, алгоритм, подходящий для булевых операций над трехмерными телами. Оверлеи полигонов эквивалентны операциям теории множеств: объединения, пересечения и т.д. множеств А и В. Всего возможно шестнадцать булевых операций с двумя полигонами, выраженные через объединение, пересечение и отрицание.
В книге Роджерса [16] вся третья глава посвящена обзору алгоритмов отсечения. В статье
О.В. Ченцова и А.В. Скворцова [19] обзор алгоритмов построения оверлеев многоугольников расширен алгоритмами О’Рурка, Леонова, Шут-те и некоторыми другими. Сразу отметим, что многие алгоритмы (Сазерленда-Ходжмана, О’Рурка, Вейлера-Азертона, Леонова, Шутте) используют упорядоченность ребер по обходу контура многоугольника и, следовательно, не могут быть распространены на многогранники. Необходимость упорядоченного списка ребер вызывает сомнение, а для многогранника упорядоченность просто невозможна. Оверлеи многогранников в литературе описаны значительно хуже - пока можно привести только известную книгу Роджерса [11], в которой рассматриваются некоторые алгоритмы для выпуклых многогранников, и две ссылки на работы автора
[17,18].
Прежде чем начнем анализ известных алгоритмов, напомним некоторые понятия и определения.
Рассмотрим евклидову плоскость Б2 с декартовой системой координат.
Определение. Ребром называется направленный отрезок с началом в точке а и концом в точке Ь, не совпадающей с а, который обознача-
ется как Е(а,Ь) . При этом будем говорить, что для точки Ь ребро Е является входящим, а для точки а - выходящим.
Определение. Контуром С называется
множество ребер [Ео,Еь...,Еп-1] такое, что п>2 и
V7 е{0,...,п-1}: Е1-1=Е(у1-1,у1),Е1=Е(у1,у1+1). Точка V;, для которой ребра Е1-1 и Е1 являются соответственно входящим и выходящим, будем называть 7-й вершиной контура С, ребра Е;-1 и Е; -соседними или смежными. Порядок обхода ребер контура С = [Е0,Еь...,Еп_1] с увеличением индекса 7^7+1 будем называть прямым направлением обхода, а противоположный ему - обратным. Заметим, что одной точке плоскости может соответствовать несколько вершин контура, такие вершины будем называть кратными.
Определение. Областью А называется ограниченное полигональное открытое связное множество на евклидовой плоскости, определенное с точностью до множества меры нуль. Под полигональностью понимается то, что граница области состоит из замкнутых ломаных.
Рассмотрим границу йЛ некоторой области А. Если ориентация йЛ согласована с ориентацией А, то граница области соответствует набору контуров на плоскости. Для взаимнооднозначного соответствия к определению области добавляется два ограничения.
Определение. Контур С называется ограничивающим контуром области А, если выполняются следующие условия:
1) С с йЛ ;
2) обход С в прямом направлении является положительным обходом, т.е. обходом, при котором область А остается слева;
3) V7e{0,..., п-1}:3в > 0 : V хев+ (^): хе Л;
4) V7е{0,.., п-1}:3в > 0 : V хе в" (^): х ё Л.
Определение. Общим полигоном или многоугольником называется множество всех ограничивающих контуров некоторой области. Внешним контуром области А назовем ограничивающий ее контур, положительный обход которого производится против часовой стрелки. Внутренним контуром области А назовем ограничивающий ее контур, положительный обход которого производится по часовой стрелке.
Определение. Многоугольник называется выпуклым, если определяемое им множество точек является выпуклым.
Определение. Многоугольник называется простым, если он имеет, по крайней мере, две различных точки, если ни одна пара непоследовательных ребер не разделяет точку и если каж-
дая пара последовательных ребер разделяет только одну точку.
Определение. Многоугольник называется регулярным, если он не имеет пересекающихся или «висящих» ребер и совпадающих точек.
Определение. Вершинно-полным называется многоугольник, который не имеет пересекающихся ребер, однако у него могут быть совпадающие вершины и коллинеарные ребра.
Определение. Ориентированным называется многоугольник, любые два ребра которого или не пересекаются, или коллинеарны, или пересекаются в точке, являющейся конечной точкой как минимум одного из ребер.
Классы полигонов образуют следующую
иерархию: выпуклые с простые с регулярные с вершинно-полные с ориентированные с общие. Введем понятия индексов множеств и индексов границ [17,18].
Из элементов двух множеств А и В пространства М, используя булевы операции объединения «и», пересечения «п» и разности «\» и т.д., можно составить новое множество С (рис. 2).
Аг)В AkjB А\В В\А
Рис. 2. Операции над множествами
Без ограничения общности можно считать, что AnB Ф 0, то есть существуют x такие, что (хеА)л(хеВ). Каждому элементу xeM поставим в соответствие число (рис. 4). Пронумеруем не-пересекающиеся части пространства M, в котором определены множества А и В: АпВ - 0; А\В
- 1; В\А - 2; М\(АиВ) - 3.
Определение. Числа 0, 1, 2, 3 будем называть индексами (Index) внутренних элементов множеств АпВ, А\В, В\А и М\(АиВ):
Index=0: AnB = {x: xeA и xeB};
Index=1: A\B = {x: xeA и xgB};
Index=2: B\A = {x: xeB и xgA};
Index=3: —An—B = {x: x^A и xgB}.
3+0=1+2
Рис. 3. Индексы подмножеств и границ при разбиении
Далее вместо термина индекс внутреннего элемента множества будем употреблять термин индекс множества. Индексы множества А равны ненулевым битам в двоичном числе 00112, а индексы множества В равны ненулевым битам в числе 01012.
Определение. Каждому граничному элементу множеств А и В поставим в соответствие число, которое будем называть индексом границы. Индекс границы равен сумме индексов множеств, которые она разделяет (рис. 4): 1+0=1
- индекс граничной точки между множествами с индексами 0 и 1; 2+0=2 - индекс граничных точек между множествами с индексами 0 и 2; 3+0=1+2=3 - индекс узловых точек; 3+1=4 - индекс точки между множествами с индексами 1 и 3; 3+2=5 - индекс граничной точки между множествами с индексами 3 и 2.
В любой узловой точке - точке пересечения границ - сходятся две или четыре (например, для операции исключающее или с номером 610=01102) границы нового множества С.
БУЛЕВЫ ОПЕРАЦИИ НАД МНОЖЕСТВАМИ
Операции объединения, вычитания, пересечения 2Б и 3Б тел являются достаточно сложными. Однако, бинарная нумерация операций над множествами позволяет сформулировать общий алгоритм сбора ребер и граней в результирующее тело, опирающийся на теорему об индексах [17,18].
В общем случае над двумя множествами А и В можно рассматривать шестнадцать различных операций, каждая из которых имеет номер от 0 до 15. Для дальнейших рассуждений будем использовать двоичную нумерацию этих операций (табл. 2). Двоичный номер операции полностью определяет ее результат. Так, например, операция с номером 7а0=01112 - это операция объединения «или».
Пусть индекс элемента хеМ соответствует номеру бита в двоичном представлении номера операции (табл. 1). В той же таблице приведены логические операции, соответствующие множественным операциям.
Булевы операции над множествами
Таблица 1
N2 Программиро- вание Логика Множества Логическая операция Речевая конструкция
0000 FALSE VA,B: FALSE 0 для УЛ,В - ложно
0001 A and B A л В A n B конъюнкция, и Л и В
0010 A and not B A л -В A \ B Разность Л и не В
0011 A A А А Л для любых Б
0100 not A and B - (А ^ В) B \ A разность неверно, что Л——В
0101 В B В В Б для любых Л
0110 A xor B - (А » В) (A\B) u (B\A) исключающее или не верно, что Л»В
0111 A or B A v В A u B дизъюнкция, или Л или В
1000 not A and not B -А л -В -A n -B стрелка Пирса не Л и не В
1001 not (A xor B) A » В -(A\B)u-(A\B) эквивалентность Л эквивалентно В
1010 not B -B -B не В для любых Л не Б
1011 A or not B A ^ В A u -B импликация, влечет из Л следует В
1100 not А -A -А не А для любых Б не Л
1101 not A or B -А v В -A u B Не Л или В
1110 not A or not B -А v -B -A u -B штрих Шеффера не Л или не В
1111 TRUE VA,B: TRUE M для УЛ,В - истино
Так, например, 1 в нулевом бите номера операции пересечения С=ЛпБ указывает на то, что в множество С входят только элементы множества с индексом 0. Ясно, что практический интерес, прежде всего, представляют операции с номерами 1, 2, 4, 6, 7: ЛпБ, Л\Б, Б\Л, (Л\Б)и(Б\Л), ЛиБ.
Замечание. Восемь операций с номерами от 810=10002 до 1510=11112 операцией отрицания сводятся к операциям с номерами от 0^=00002 до 710=01112, а эти восемь операций при помощи формул Моргана могут быть сведены только к двум: например, к операции отрицания и операции «и», т.е. пересечения.
Теорема об индексах [17,18]. Между номерами операций и индексами граничных элементов есть связь: сумма номеров пар различных битов в двоичном представлении номера операции совпадает с индексами граничных элементов.
Доказательство сводится к проверке утверждения для всех 16-ти бинарных операций. Так, например, для операции С=(Л\Б)и(Б\Л) с номером 6]0=01102 граница состоит из элементов с номерами: 0+1, 2+3, 1+3, 2+3, 3+0=1+2. В двоичном числе 01102 различны следующие пары битов: (0,1), (0,2), (2,3), (1,3). Элементы пересечения границ (0+3=1+2) входят в границы любого нового множества. Для операции пересечения ЛпБ с номером 110=00012 граница множества С состоит из элементов с индексами 0+1, 0+2, 0+3=1+2. Эти же пары различных битов есть в числе 00012: (0,1), (0,2), (0,3).
Замечание. Порядок нумерации множеств АпВ, А\В, В\А и М\(АиВ) влияет на порядок нумерации булевых операций.
Под выполнением булевой операции над многоугольниками A и В понимается выполнение операции над описываемыми ими областями и получение множества многоугольников, описывающего полученную область.
В качестве исходных данных здесь могут быть произвольные полигональные области любого класса, в частности, многосвязные области с отверстиями и неограниченной кратностью вершин.
Определение. Оверлейный алгоритм называется замкнутым, если многоугольник, полученный с помощью алгоритма, того же типа, как и операнды.
Прежде, чем перейдем к обзору и анализу алгоритмов, сделаем еще одно замечание. Практически все алгоритмы вычисления пересечения, объединения или разности многоугольников, кроме алгоритмов Леонова, линейноузлового и триангуляционного, реализуют набор операций, не являющийся замкнутым, так как в результате их выполнения могут получаться контуры с самокасаниями, что неприемлемо в качестве исходных данных для почти всех алгоритмов, и с отверстиями, которые, например, не допускаются алгоритмом Шутте [5]. Кроме этого, многие из широко известных алгоритмов не позволяют корректно обрабатывать вершины, в которых сходится более двух ребер многоугольников.
Алгоритм Сазерленда - Ходжмана является одним из самых первых и простых алгоритмов отсечения многоугольников [6]. Этот алгоритм определяет только пересечение многоугольника общего вида с выпуклым многоуголь-ником-отсекателем.
Алгоритм последовательно обрабатывает пересечение каждого ребра многоугольника общего вида с каждым ребром выпуклого многоугольника, сохраняя вершины, находящиеся внутри ребра (?) и точки пересечения ребер во временный многоугольник. Далее алгоритм повторяется, на вход подаются полученный на предыдущем шаге временный многоугольник и следующее ребро отсекателя.
Достоинства: простота, малая требова-
тельность к памяти.
Недостатки: высокая трудоемкость порядка 0(иіП2 ^п2); применимость только для выпуклых отсекателей; невозможность обобщения для операций объединения и разности; в результате могут образоваться вырожденные многоугольники нулевой ширины; алгоритм не замкнут; невозможность обобщения на 3Б.
Алгоритм О’Рурка один из наиболее простых алгоритмов пересечения выпуклых многоугольников [4]. Предположим, что (p1p2,...pL) и (д1^2,...^) - это списки вершин P и Q, упорядоченные при обходе их против часовой стрелки двух выпуклых многоугольников. Для каждого многоугольника объявляются текущие вершины pi и qi, кроме этого, текущие ребра E(pi-1pi) и E(qi-^). Алгоритм заключается в том, чтобы не двигаться по той границе P или Q, текущее ребро которой еще может содержать необнаруженную точку пересечения. Анализируется четыре возможных варианта взаимного расположения вершин pi и qj и ребер E(pi_pi) и E(qИqj).
Достоинства: прост в реализации; может быть модифицирован для построения объединения и разности многоугольников.
Недостатки: применимость только для выпуклых многоугольников; алгоритм не замкнут; невозможность обобщения на 3Б.
Алгоритм Вейлера-Азертона [7,8] является гораздо более мощным алгоритмом отсечения многоугольников по сравнению с ранее перечисленными. Применим для простых областей с «дырами» без самопересечений и для любых регулярных отсекателей.
Алгоритм описывает оба многоугольника как циклические списки вершин. Внешние границы многоугольников представляются упорядоченными по часовой стрелке, а внутренние границы и «дыры» упорядоченными против часовой стрелки. При перемещении по списку
вершин, внутренняя область многоугольника должна всегда находиться справа. Границы многоугольников могут пересекаться. Если они пересекаются, пересечения возникают дважды. Одно из пересечений происходит, когда ребро 8Р входит внутрь СР, а второе, когда выходит. Алгоритм начинается на «входящем» пересечении и следует по часовой стрелке по внешней границе 8Р до тех пор, пока не будет найдено пересечение с СР. На пересечении делается правый поворот и выполняется обход по часовой стрелке внешней области СР, пока не будет найдено пересечение с 8Р. Далее, снова на пересечении делается правый поворот и выполняется обход по 8Р.
Процесс продолжается до тех пор, пока не будет достигнута стартовая точка. Внутренние границы 8Р обходятся против часовой стрелки. Фактически это модифицированный алгоритм поиска эйлерова пути на графе.
Более подробное описание алгоритма может быть найдено в [1,11].
Трудоемкость вычислений пересечений равна O(n1n2), где П1 и п2 - соответственно количество вершин 8Р и СР. При применении методов пространственного индексирования рёбер исходных многоугольников, например с помощью ^-деревьев, трудоемкость может быть
снижена до O(nl+n2).
Недостатки: высокая сложность при отработке большого количества особых случаев [1]; невысокая скорость работы; алгоритм не замкнут; невозможность обобщения на 3Б.
Алгоритм Леонова [10]. В качестве исходных данных могут быть произвольные полигональные многосвязные области с отверстиями и неограниченной кратностью вершин. Результат, полученный с помощью алгоритма, удовлетворяет его же предусловию.
Алгоритм состоит из четырех шагов.
На первом шаге находятся все пары несмежных пересекающихся ребер регионов А и В. Если точки пересечения не совпадают с концевыми точками ребер, в исходные регионы добавляются новые вершины с координатами соответствующих точек.
На втором шаге рассматривается некоторый ограничивающий контур С одного из регионов А и В. За М обозначается регион, к которому не принадлежит С. На предыдущем шаге все точки пересечения были добавлены в исходные регионы. Пометка контура C или ребра, принадлежащего контуру С, делается в зависимости от геометрического положения относительно M.
На третьем шаге последовательно рассматривается каждый контур из регионов А и В. В зависимости от метки, контур включается в результат с нужным направлением или совершается обход всех ребер С, чтобы найти ребра, с которых начнется сборка результирующих контуров.
На четвертом шаге происходит формирование результирующего контура R. Для каждого внешнего контура создается отдельный полигон, внешним контуром которого он и будет являться. Внутренние контуры на предыдущем этапе сохраняются во временном списке, а затем помещаются в результирующие полигоны. Регион R будет состоять из множества полученных таким образом полигонов.
Вычислительная трудоемкость алгоритма различается на разных этапах. В среднем она
равна O((nl+n2)log(nl+n2)+no+zlog(nl+n2)) , где
(п1+п2) - общее число вершин регионов A и В; z
- общее число контуров регионов A и В; п0 -максимальное число новых вершин.
Достоинства: является одним из лучших по таким параметрам как, скорость, затраты на память, численная устойчивость, обработка вырожденных ситуаций; алгоритм замкнут; алгоритм замкнут.
Недостатки: невозможность обобщения на
3Б.
Алгоритм Шутте [5] основан на алгоритме Вейлера-Азертона [7], однако имеет несколько ограничений:
1. Вершины многоугольников должны быть упорядочены по часовой стрелке;
2. Многоугольники не должны иметь «дыр»;
3. Многоугольники не должны быть само-пересекающимися.
Алгоритм состоит из следующих шагов:
Шаг 1. Пересечение двух многоугольников. Результатом являются те же самые многоугольники, с одним отличием, что точки пересечения добавляются как вершины многоугольников.
Шаг 2. Все ребра обоих многоугольников помечаются как «внутренние» (ребро находится внутри другого многоугольника), «разделенные» (ребро принадлежит обоим многоугольникам) и «наружные» (ребро находится снаружи другого многоугольника).
Шаг 3. Находятся минимальные многоугольники.
Шаг 4. Все минимальные многоугольники классифицируются по трем выходным наборам AПB, B/A, A/B. Конец алгоритма.
Для проведения классификации на четвертом шаге вводится термин «отцовство». «Отцовство» определяется как отношения между ребрами и исходными многоугольниками и между минимальными многоугольниками и исходными многоугольниками. Если «отцовство» доказано, значит объект является частью исходного многоугольника. Если «отцовство» ложно, значит объект не является частью исходного многоугольника. Кроме значений «доказано» и «ложно», «отцовство» может быть «неизвестным» и «смешанным». «Неизвестное» означает, что
убедительных подтверждений нет. «Смешанное» означает, что существуют противоречащие факты. Это возможно только для минимальных многоугольников и означает, что минимальный многоугольник - это «дыра» между двумя исходными многоугольниками.
Процесс классификации минимальных многоугольников происходит в два этапа. На первом этапе проверяется «отцовство» каждого минимального многоугольника, после этого решается, к какому классу относится минимальный многоугольник. Ответ на вопрос, является ли минимальный многоугольник потомком исходного многоугольника, производится при помощи маркировки ребер. Для каждого ребра минимального многоугольника выясняется родительский исходный многоугольник.
Трудоемкость алгоритма при операциях нахождения пересечений и маркировки ребер равна O(n1n2).
Недостатки: вершины многоугольников
должны быть упорядочены по часовой стрелке; многоугольники не должны иметь «дыр»; многоугольники не должны быть самопересекаю-щимися; алгоритм не замкнут; невозможность обобщения на 3Б.
Алгоритм Холверда. Входными данными скан-линейного алгоритма Холверда [2] являются два набора многоугольников. Идея алгоритма состоит в том, чтобы разбить плоскость на секции, называемые закрытыми областями, описываемыми простыми многоугольниками.
Результат булевой операции может быть получен, если определена принадлежность каждой из закрытых областей одному или обоим наборам многоугольников, для этого необходимо вычислить пересечения всех сегментов многоугольников.
Основные этапы алгоритма:
Шаг 1. Конвертация всех многоугольников в графы. Один многоугольник становится одним графом.
Шаг 2. Объединение всех графов в один граф. Такой граф подходит для скан-линейного
алгоритма, так как ссылки графа могут быть отсортированы без потери структуры отображения. Каждая ссылка в графе получает уникальный номер, содержащий информацию принадлежности тому или иному многоугольнику.
Шаг 3. Вычисление точек пересечения между графами, используя скан-луч, и вставка их как дополнительных вершин или сегментов. Скан-луч - это пространство между двумя последовательными вертикальными скан-линиями, генерируемое каждым узлом графа. Все начальные узлы ссылок графа сортируются по минимальной Х-координате или по минимальной Y-координате.
Шаг 4. Установка с помощью скан-луч соответствующих флагов сегментов одновременно для всех булевых операций.
Шаг 5. Получение для данной булевой операции результирующих многоугольников. Необходимо найти подходящую ссылку, помеченную для данной операции, и двигаться по связанным с первой ссылкам, которые также помечены для этой операции. Когда доходим до стартовой ссылки, можно извлекать один многоугольник, и так далее, пока не будут получены все многоугольники.
Недостатки: на входе нельзя использовать самопересекающиеся многоугольники; невозможность обобщения на 3Б; алгоритм не замкнут.
Достоинства: оригинальность, высокая
скорость работы, корректное округление координат точек пересечения; высокая вычислительная устойчивость.
Алгоритм Маргалита-Кнотта. Авторы алгоритма предложили алгоритм, ориентируясь, в первую очередь, на эффективность и простоту реализации [3]. Алгоритм делится на две основные стадии. Первая стадия - это классификация линейных сегментов входных многоугольников, а вторая - конструирование результирующих многоугольников.
Основные этапы алгоритма:
Шаг 1. Классифицирует вершины каждого многоугольника на нахождение внутри, снаружи или на границе другого многоугольника.
Шаг 2. Ищутся все точки пересечения между многоугольниками. Для каждого многоугольника вершины вместе с точками пересечения помещаются в такую структуру данных, что две соседние точки определяют оригинальное ребро или часть оригинального ребра результирующего многоугольника.
Шаг 3. Классифицирует реберные фрагменты одного многоугольника на нахождение внутри, снаружи или на границе другого много-
угольника. Множество реберных фрагментов многоугольника Q делится на три подмножества, в зависимости от положения относительно многоугольника P.
Шаг 4. Классифицированные реберные фрагменты сохраняются в структуре данных, позволяющей быстро выполнять операции поиска и удаления. После создания каждого результирующего многоугольника его вершины помещаются в выходной массив, а его реберные фрагменты удаляются из структуры данных для того, чтобы приготовиться для конструирования следующего результирующего многоугольника.
Каждый результирующий многоугольник создается при помощи последовательного поиска следующего реберного фрагмента, пока не будет найден фрагмент, вторая конечная точка которого посещается во второй раз. На этой точке результирующий многоугольник найден.
Трудоемкость алгоритма составляет в худшем случае O(n2), однако на практике она может быть значительно улучшена в среднем до O(nlogn).
Достоинства: алгоритм прост и практичен.
Недостатки: применим только для вершинно-полных многоугольников; невозможность обобщения на 3Б; алгоритм не замкнут.
Триангуляционный алгоритм. Идея алгоритма построения оверлеев многоугольников с помощью триангуляции [14] заключается в построении триангуляции с ограничениями ребер исходных многоугольников, а затем объединения некоторых треугольников в искомый многоугольник.
При построении триангуляции автоматически решается задача поиска точек пересечения и разбиения сторон многоугольников, возникающая во всех других алгоритмах построения оверлеев.
В общем виде алгоритм можно записать следующим образом:
Шаг 1. Ребра исходных многоугольников А и В передаются в качестве структурных линий в алгоритм построения триангуляции с ограничениями [12].
Шаг 2. Каждый треугольник триангуляции классифицируется по признаку попадания внутрь А и В.
Шаг 3. Каждый треугольник ^ полученной триангуляции классифицируется в зависимости от выполняемой операции.
Вариант 1 (объединение): если Ъ еЛ или Ъ еБ, то а: = 1, иначе о:=0.
Вариант 2 (пересечение): если Ті єЛ и Ті єБ, то сі: = 1, иначе сі:=0.
Вариант 3 (разность): если Ті єЛ и Ті £Б, то сі: = 1, иначе сі:=0.
Шаг 4. Все треугольники, имеющие сі: = 1, объединяются в один многоугольник, который выбирается в качестве результата.
В целом трудоемкость первого шага составляет в худшем случае O(nlog(n1+n2)), а в среднем - O(n). Трудоемкость третьего шага является линейной - O(n). Трудоемкость второго и четвертого шагов составляет также O(n). Таким образом, в целом алгоритм построения оверлеев на основе триангуляции имеет в худшем случае
трудоемкость O(nlog(n1+n2)), а в среднем - O(n).
Достоинства: алгоритм замкнут.
Недостатки: в связи с достаточно высокой алгоритмической сложностью триангуляционного алгоритма уступает по скорости другим алгоритмам; возможно обобщение на 3Б, но для этого необходимо разбить области на тетраэдры.
Линейно-узловой алгоритм. Основная идея алгоритма, предложенного в работе [13], заключается в выполнении трех шагов:
Шаг 1. Построение планарного графа, ребра которого должны соответствовать ребрам границ многоугольников.
Шаг 2. Классификация ребер графа по признаку вхождения в результирующий многоугольник. Для классификации ребер требуется выполнить две операции:
1) определить расположение многоугольника относительно ребра;
2) определять, попадает ли некоторое ребро на границу, внутрь или вне многоугольника.
Шаг 3. Выполняется сборка ребер графа в последовательность ребер границы результирующего многоугольника. Для этого необходимо пометить входящие в результат ребра как не-пройденные, а остальные - как пройденные и запустить алгоритм выделения контуров.
В результате работы предложенного алгоритма будет построен многоугольник, в котором контуры не будут самопересекаться, и каждый контур будет задан в таком порядке обхода точек, что многоугольник всегда находится справа по ходу обхода.
Достоинства: позволяет явно учесть эффекты; возникающие на пороге точности вычислений; имеет большую область определения, чем алгоритм Маргалита-Кнотта; достаточно
простую структуру для программной реализации.
Недостатки: необходимость построения
планарного графа специального вида по ребрам; медленнее алгоритма Маргалита-Кнотта; невозможность обобщения на 3Б.
Индексный алгоритм. В работах автора
[17,18] предложен алгоритм, основанный на понятии индекса вершин и границ. Алгоритм применим для многоугольников и многогранников общего вида:
Шаг 1. Для всех вершин многоугольников А и В определить соседние вершины и ребра. Вычислительная сложность - О(п);
Шаг 2. Решая задачу принадлежности вершин одного тела другому, расставить индексы вершин (1..5). Вычислительная сложность -0(п1*П2);
Шаг 3. Упорядоченно добавить точки пересечения ребер многоугольников Л и Б. Вычислительная сложность - О(п);
Шаг 4. Разбить ребра добавленными точками. Вычислительная сложность - 0(п0);
После выполнения трех шагов алгоритма выполняются следующие условия:
1. Ребра многоугольников А и В не имеют никаких общих точек друг с другом, кроме концевых.
2. Ребра многоугольников А и В могут находиться целиком (за исключением, может быть, концевых точек) внутри или вне области, описываемых А и В.
Шаг 5. Расставить индексы ребер и по номеру булевой операции на основе теоремы об индексах собрать в новый многоугольник С ребра с подходящими индексами. Вычислительная сложность - 0(п1+ П2+ по);
Достоинства: алгоритм замкнут; применим для многоугольников и многогранников общего вида; прост на заключительной стадии сбора результирующего мгогоугольника.
На рис. 4 приведен результат выполнения операции «и».
Рис. 4. Операция «и» для двух полигонов
В табл. 2 приведены сравнительные характеристики всех вышеописанных алгоритмов.
Таблица 2. Сравнительные характеристики алгоритмов построения оверлеев
могут получаться контуры с самокасаниями, что неприемлемо в качестве исходных данных.
Вещественные операции. Основным источником неустойчивой работы алгоритмов является вещественная арифметика при выполнении следующих операций:
1. пересечение ребер;
2. положение вершины относительно прямой;
3. вершина принадлежит многоугольнику;
4. вершина принадлежит ребру;
5. вычисление углов для алгоритма Леонова. Номера выполняемых операций для каждого алгоритма указаны в столбце «Вещественные операции».
Операция «пересечение ребер» выполняется в любом алгоритме. Операции 3 и 4 являются топологическими, т.е. определяют положение вершины относительно многоугольника. В случае простых и упорядоченных по обходу контура многоугольника многоугольников в этих операциях нет необходимости, а для многоугольников общего вида эти операции необходимы.
Алгоритм Операции Упоря- дочен- ность 3Б Тип многоугольников Ал- гебра Вещественные операции Трудоемкость
П и /
1 Сазерленд- Ходжман + - - список - Один выпуклый, другой общий - 1,2 0(п1 п2 •logn2)
2 О’Рурк + + + список - Выпуклые - 1 0(п)
3 Вейлер- Азертон + + + список - Простые 1,2 0(п •log(nl+n2))
4 Леонов + + + список - Общие + 1,3,5 0((П1+П2) •l0g(nl+n2) +п0+2 -^(пі+п2 ))
5 Шутте + - + список - Простые - 1,3,4 0(п\ п2)
6 Холверд + + + граф ? Не самопересекаю-щиеся + 1,3,4 0(п -^п)
7 Маргалит- Кнотт + + + - ? Вершинно-полные 1,3,4 0(п2) - в худшем 0(п •logn)
8 Линейно-узловой + + + граф ? Общие + 1,3,4 0(п2)
9 Триангуля- ционный + + + - ? Общие + 1,2,3,4 0(п) - в среднем, 0(п •log(n\+n2))
10 Индексный + + + - + Общие + 1,3,4 0((П1+П2) ^(П1+П2) +п0+2 •log(n\+n2 ))
В этой таблице П1 - количество вершин первого многоугольника А; т- второго (В); т- количество новых точек пересечения сторон двух многоугольников; г - общее число контуров многоугольников А и В п = П1+ П2+ П0
К недостаткам большинства из них стоит отнести недостаточно высокую вычислительную устойчивость, нерешенные численные проблемы, связанные с округлением. Многие алгоритмы реализуют набор операций, не являющийся замкнутым, так как в результате их выполнения
Определение принадлежности вершины многоугольнику наиболее сложная задача. Традиционный алгоритм предлагает вычислить число пересечений горизонтальной полупрямой, проходящей через точку (х,у), с контуром многоугольника.
Для многоугольника общего вида возможен вариант, для которого эта прямая проходит через вершину нескольких ребер (рис. 5).
Рис. 5. К алгоритму определения принадлежности точки многоугольнику
ЕЯ-МОДЕЛЬ
Для реальных трехмерных объектов число вершин может достигать десятков и сотен тысяч. Поэтому для быстрой и экономной реализации всех алгоритмов с полигонами, TIN-поверхностями (triangular irregular network) и с CTIN-поверхностями (closed triangular irregular network) существенное значение имеет выбор модели данных, так как от этого выбора зависит скорость доступа, например, от вершины к телу или от тела к его вершинам.
Для описания любой поверхности будем использовать модель «сущность-связь» (Entity-Relationship model, или ER-модель). Основной концепцией ER-модели является [9]:
• тип сущности (entity type), который представляет группу объектов реального мира, обладающих одинаковыми свойствами;
• и тип связи (relationship type) является набором ассоциаций между одним (или несколькими) типами сущностей, участвующими в этой связи. Каждому типу связи присваивается имя, которое должно описывать его назначение.
Рассмотрим многоугольники, которые могут быть определены тремя сущностями: многоугольники (polygon), ребра (edge) и вершины (vertex). В общем случае эти сущности связаны между собой тремя отношениями «многие ко многим» *:* (многоугольники-ребра, много-
угольники-вершины, ребра-вершины) и тремя отношениями «один ко многим» (многоуголь-ники-соседние многоугольники, ребро-соседние ребра, вершина-соседние вершины).
Рис. 6. Структура сущностей и связей для ТМ-
поверхности
Однако, для реализации алгоритмов достаточно оставить только часть их. На рис. 6 показано направление действия каждой связи. Около прямоугольника сущности ромбом обозначена каждая связь и рядом обозначена ее кратность. Кратность всех связей «один ко многим», но для связи «ребро опирается на вершины» кратность 1:2.
Каждая из трех связей «один ко многим» сущности самой на себя на самом деле образует даже не дерево, а граф внутри своей сущности (многоугольников, ребер или вершин). Каждое отношение «многие ко многим» необходимо разбить на пару связей «один ко многим», что приводит к 9-ти возможным связям. Оценим число ER-моделей для многоугольников: можно выбрать любое число связей от 0 до 9 и из них составить неповторяющиеся сочетания. Таким образом, число ER-моделей будет равно N = ^1=19С91 = 29-1 = 511. Впрочем, для наших алгоритмов достаточно оставить 5 связей. Можно считать, что ER-модель с 5 связями, изображенная на рис. 6, образует орграф. Конечно, такая модель данных избыточна: избыточность ускоряет выполнение алгоритмов, но, во-первых, требует дополнительной памяти, во-вторых, усложняет процессы добавления или удаления экземпляров сущностей. Так, например, для задачи изображения полигона достаточно знать две связи: полигон ограничен ребрами и ребро опирается на вершины. Наличие только этих двух связей для задачи «какие соседние вершины есть у выделенной вершины» приведет к более громоздкой переборной задаче «для всех полигонов перебрать ребра, у каждого ребра проверить есть ли выделенная вершина, проверить входит ли вторая вершина в число соседей, если нет то включить». Мощность этого алгоритма пр*пе*2, где пР - число полигонов, пЕ - число ребер полигона.
На стадии физического моделирования связи «многие ко многим» в БД могут быть реализованы в виде таблиц, содержащих только пару
Ы атрибутов; при реализации с помощью классов каждую связь «многие ко многим» необходимо разбить на пару связей «один ко многим» и каждую связь реализовать в виде динамического массива указателей на экземпляры классов сущностей.
РЕАЛИЗАЦИЯ АЛГОРИТМА
Введем обозначения: т1 - количество вершин первого многоугольника А; п2 - второго В; п0 - количество новых точек пересечения сторон двух многоугольников.
Напомним, что для решения задачи предлагается следующий алгоритм:
Шаг 1. Для всех вершин многоугольников А и В определить соседние вершины и ребра. Вычислительная сложность - О(п);
Шаг 2. расставить индексы вершин (1..5). Вычислительная сложность - О(п1*п2);
Шаг 3. упорядоченно добавить точки пересечения ребер многоугольников Л и Б. Вычислительная сложность - О(п);
Шаг 4. разбить ребра добавленными точками. Вычислительная сложность - О(п0);
Шаг 5. расставить индексы ребер и собрать в новый многоугольник С ребра с подходящими индексами. Вычислительная сложность - О(п1+ П2+ П0);
ШАГ 1. Определить соседние вершины и ребра. Этот шаг может быть реализован в момент добавления или удаления вершин. Если же массивы соседних вершин не сформированы, то используется алгоритм поиска эйлерова пути.
ШАГ 2. Задача расстановки индексов вершин для многоугольника А с номером к1, решается следующим образом:
Если вершина многоугольника А принадлежит многоугольнику В,
то ее индекс равен 0+2=2,
Иначе
индекс равен 1+3=4;
Если вершина многоугольника В принадлежит многоугольнику А,
то ее индекс равен 0+1=1,
Иначе
индекс равен 2+3=5;
Если вершина попала на ребро с номером Е вершина,
то она получает индекс 3 и в упорядоченный массив Edge[E].AddVertex
добавляется номер этой точки.
Принадлежность точки с координатами (х,у) многоугольнику определяет функция АссеззотуО£Ро1пЬ. Если точка (х,у) принадлежит многоугольнику к, то
АссеззотуО£Ро1пЬ=1, если не принадлежит, то 0, если на границе, то 2. Алгоритм определения принадлежности точки Q(x,y) заключа-
ется в следующем: через точку Q(x,y) проводится горизонтальный луч налево (рис. 5). Если число пересечений луча с контуром четно, то Q не принадлежит многоугольнику, если нечетно, то принадлежит.
Сформулируем алгоритм определения принадлежности точки многоугольнику: для всех частично левых относительно точки Q(x,y) ребер выполнить:
Если ребро горизонтально, то
Если точка (x,y) принадлежит ребру, то вершина на границе (AccessoryCfPoint^2) . Выход.
Иначе ребро не горизонтально
Если P совпадает с 1-ой вершиной,
то
Выполнить ПРОВЕРКУ 1-ой вершины Иначе
Если P совпадает со 2-ой вершиной,
то
Выполнить ПРОВЕРКУ 2-ой вершины Иначе P принадлежит ребру
Вычислить координаты (u,v) точки P пересения ребра с лучом;
Если u=x, то вершина на границе (AccessoryOfPoint-^2). Выход.
Иначе
Если P(u,v) левее точки (x,y) и P принадлежит ребру, то
Сменить бит Parity.
Функция AccessoryCfPoint использует функцию CheckVertex проверки необходимости смены бита четности для непосещенной вершины используя следующее условие [1б]:
1. Находим те вершины, которые попадают на луч.
1.1. Для каждой такой вершины строим семейство инцидентных вершин.
1.2. Для каждого семейства определяем, принадлежит ли вершина интервалу проекций инцидентных вершин на ось Y, если принадлежит, то число пересечений увеличиваем на 1.
2. Для всех ребер без вершин считаем число пересечений.
Время выполнения алгоритма расстановки индексов вершин O(Nv).
ШАГ 3. Добавить точки пересечения ребер многоугольников. Третью задачу, задачу пересечения ребер одного многоугольника с ребрами другого многоугольника, решает процедура AddPoints (k 1, k2: word), где k1,k2 -
номера многоугольников. Процедура AddPoints для каждой пары ребер обращается к процедуре LineToLine, которая ищет точку
пересечения двух ребер и добавляет ее к массиву вершин.
При решении системы линейных уравнений, описывающих ребра, возможны следующие случаи (рис. 7):
1. ребра параллельны - вершины не добавляются;
2. ребра лежат на одной прямой - вершины не добавляются, но у каждого ребра в список добавленных вершин добавляется по одному указателю на вершину;
3. ребра имеют общий конец - вершины не добавляются;
4. конец одного ребра принадлежит другому ребру - вершины не добавляются, но у одного ребра в список добавленных вершин добавляется один указатель на вершину;
5. ребра пересекаются - добавляется одна вершина и у каждого ребра в список добавленных вершин добавляется по одному указателю на вершину;
6. ребра не пересекаются - вершины не добавляются.
*А2 М
Рис. 7. Варианты пересечения отрезков
Новые вершины и ребра добавляются во втором, в четвертом и в пятом случаях.
ШАГ 4. Разбить ребра добавленными вершинами. В результате пересечения всех ребер одного многоугольника с другим на некоторых ребрах появились точки пересечения, номера которых собраны в упорядоченных массивах ЛёёУеМех. Этими точками необходимо разбить каждое ребро на новые ребра. Алгоритм действий таков:
Для всех ребер вычислить длину І1 массива АсІсІУєгЬєх.
Если І1>0 то
Запомнить в t номер вершины конца ребра и номером вершины конца ребра назначить первую точку из массива AddVertex.
Для всех элементов массива AddVertex[j], j є[0..І1-1]:
Добавить ребро, у которого начало будет показывать на AddVertex[j],
и конец - на AddVertex[j+1] или на t для последнего добавляемого ребра;
Добавить в массив IdPolygon ребра номер многоугольника из старого ребра;
Добавить в массив Polygons[k1].IdEdge номера новых ребер.
ШАГ 5. Расставить индексы ребер. Для решения пятой задачи заметим, что если хотя бы для одной вершины ребра индекс равен 1,2,4 или 5, то и индекс ребра равен 1,2,4 или 5 (рис.
3). Сложнее дело обстоит с ребрами, у которых обе вершины находятся на границе, то есть имеют индекс 3. Но в этом случае ребро целиком принадлежит или многоугольнику А или многоугольнику В. Поэтому достаточно вычислить, например, индекс середины ребра.
Итак, для всех ребер необходимо выполнить:
Если индекс начала ребра равен 3 и индекс конца ребра равен 3, то
Индекс ребра равен индексу середины ребра
Иначе
если индекс начала ребра равен 1 или индекс конца ребра равен 1, то индекс=1 Иначе
если индекс начала ребра равен 2 или индекс конца ребра равен 2, то индекс=2 Иначе
если индекс начала ребра равен 4 или индекс конца ребра равен 4, то индекс=4 Иначе
если индекс начала ребра равен З или индекс конца ребра равен З, то индекс=З;
если индекс ребра удовлетворяет номеру операции, то
добавить ребро в новый многоугольник и в массив IdPolygon ребра
добавить номер нового многоугольника .
При решении задачи выбора ребер нового многоугольника подходящих для операции с номером k, используется функция
Cp In Set(k,n: Byte): Boolean, где n -индекс ребра, k - номер операции. В функции Cp In Set по номеру операции k формируется множество допустимых индексов V. Это множество содержит сумму номеров различных битов в номере операции k. Ребро считается подходящим (Cp In Set:= true), если индекс его входят в множество V:
Аналогичным образом решается задача пересечения многогранников в трехмерном пространстве:
1. сначала необходимо найти линии пересечения двух многогранников, добавляя в массивы вершин, ребер и граней новые элементы;
2. затем расставить индексы вершин многоугольников;
3. и, наконец, сформировать новый многогранник, собирая те грани, у которых все вершины имеют подходящие индексы.
Литература
1. Foley D.J., van Dam A., Feiner S.K., Hughes J.F. Computer graphics. Principles and practice. N.Y.: Addisson-Westey, 1991.
2. Holwerda K. Complete Boolean Description (http:// www.xs4all.nl/~kholwerd/bool.html).
3. Margalit A., Knott G.D. An algorithm for computing the union, intersection or difference of two polygons // Computers & Graphics. 1989. V.13. No. 2. P. 167-183.
4. O'Rourke J., Chien C.B., Olson Т., Naddor D. A new linear algorithm for intersecting convex polygons // Computer Graphics and Image Processing. 1982. V.19. P. 384391.
5. Schutte K. An edge labeling approach to concave polygon clipping // ACM Transactions on Graphics. 1995. P. 1-10.
6. Sutherland I.E., Hodgman G.W. Reentrant polygon clipping // CACM. 1983. V.26. P. 868-877.
7. Weiler K. Polygon comparison using graph representation // Computer Graphics. 1980. V.14. P. 10-18.
8. Weiler K., Atherton P. Hidden surface removing using polygon area sorting // Computer Graphics. 1977. V.11. P. 214-222.
9. Конноли, Томас, Бегг, Карелии. Базы данных. Проектирование, реализация и сопровождение. Теория и практика. 3-е издание.: Пер. с англ. - М.: Издательский дом "Вильямс", 2003. - 1440 с.
10. Леонов М.В., Никитин А.Г. Эффективный алгоритм, реализующий замкнутый набор булевых операций над множествами многоугольников на плоскости / Препринт Института систем информатики СО РАН № 46. 1997. 20 с.
11. Роджерс Д. Алгоритмические основы машинной графики / Пер. с англ. М.: Мир, 1989. 512 с.
12. Скворцов А. В. Алгоритмы построения триангуляции с
ограничениями // Вычислительные методы и программирование. 2002. № 3. С. 82-92 (И1р://пит-
meth.srcc.msu.su).
13. Скворцов А. В. Линейно-узловой алгоритм построения оверлеев двух полигонов // Вестник ТГУ. 2002. № 275. С. 99-103.
14. Скворцов А.В. Построение объединения, пересечения и разности произвольных многоугольников в среднем за линейное время с помощью триангуляции // Вычислительные методы и программирование. 2002. Т. 3. С. 116-123.
15. Тюкачев Н.А. Выбор ER-модели для описания поверхности трехмерных тел // Вестник ВГТУ. 2009. №
4. С. 338-345.
16. Тюкачев Н.А. Определение принадлежности точки многоугольнику общего вида методом трассировки луча // Вестник ВГТУ. 2009. № 4. С. 338-345.
17. Тюкачев Н.А., Илларионов И.В., Хлебостроев В.Г. Программирование графики в Бе1рЫ. СПб., БХВ-Петербург. 2008. - 766 с.
18. Тюкачев Н.А., Свиридов Ю.Т. Создание мультимедийных приложений в Бе1рЫ. СПб., Питер. 2001. - 400 с.
19. Ченцов О.В., Скворцов А.В. Обзор алгоритмов построения оверлеев многоугольников // Вестник ТГУ. 2003. № 280. С. 338-345.
Воронежский государственный университет
ALGORITHM OF CONSTRUCTION OVERLAY OF POLYGONS AND POLYHEDRONS
N.A.Tjukachev
For the description of homogeneous layers of breed in geoinformation systems the model of the three-dimensional body limited by set of triangles is offered. The analysis of known algorithms overlay polygons is spent and other is offered, index, the algorithm suitable for boolean of operations above three-dimensional bodies. The algorithm is based on the local analysis of families of incidental vertex, sides and edges. Unlike earlier offered, the algorithm does not demand global orderliness of edges
Key words: geometrical algorithms, overlay polygons and polyhedrons