Теория геоинформатики и дистанционного зондирования 45 zB − zA = 0 , а затем вычислить невязку и координаты (13) соответL ствующей точки C на кривой. Если невязка превышает допустимый порог, то в треугольную сетку включается новая вершина C. Добавление новой точки всегда уменьшает максимальную невязку на AB, т.к. пространственные отрезки AC и CB располагаются между кривой и отрезком AB. Этот факт иллюстрирует рис. 4, где длины отрезков CD, C1 D1 , C 2 D2 определяют максимальные невязки, соответственно, на AB, AC, CB. шить уравнение f ' (t ) = 3c3 ⋅ t 2 + 2c 2 ⋅ t + c1 − C C2 C1 D2 D1 A D B Рис. 4. Уменьшение максимальной невязки при включении дополнительной точки C ЛИТЕРАТУРА 1. Роджерс Д., Адамс Дж. Математические основы машинной графики. – М.: Мир, 1980. – 240 с. 2. Шенен П., Коснар М., Гардан И. и др. Математика и САПР: В 2 кн. Кн. 1 / Пер. с франц. – М.: Мир, 1988. – 204 с. 3. Костюк Ю.Л. Применение сплайнов для изображения линий в машинной графике // Автоматизация эксперимента и машинная графика. – Томск: Изд-во Том. ун-та, 1977, с. 116-130. БЫСТРЫЙ АЛГОРИТМ ТРИАНГУЛЯЦИИ ДЕЛОНЕ, ОСНОВАННЫЙ НА ПРЕДВАРИТЕЛЬНОЙ ОБРАБОТКЕ НАБОРА ТОЧЕК* А.Л. Фукс Томский государственный университет, НПО «Сибгеоинформатика», г. Томск 1. Введение Триангуляция множества точек на плоскости является важным этапом в задачах, связанных с определением топологических свойств объектов или восстановлением поверхностей, заданных нерегулярными наборами отсчетов. Обычно требуется, чтобы получаемая система треугольников была структурированной, т.е. описание любого треугольника содержало не только номера его вершин, но и номера треугольников, смежных с данным по каждому из трех ребер (либо специальные значения для граничных ребер триангуляции). Среди нескольких известных типов триангуляций на практике обычно применяется триангуляция Делоне, имеющая ряд преимуществ: • при ее построении используется простое локальное условие (никакая точка не может лежать внутри окружности, построенной по трем вершинам треугольника Делоне), для его проверки достаточно анализировать пары смежных треугольников; • триангуляция Делоне является однозначной (т.е. не зависит от порядка задания исходных точек) с точностью до множества точек, лежащих на одной окружности, внутри которой нет других точек. Известно, что в общем случае триангуляцию n точек на плоскости нельзя построить быстрее чем за O(n log n) [1]. Такую трудоемкость для триангуляции Делоне имеет рекурсивный алгоритм, основанный на стратегии «разделяй и властвуй» [2]. Однако данный алгоритм логически довольно сложен, количество операций на точку велико, поэтому его преимущества проявляются только при достаточно больших значениях n. Пожалуй, самым простым алгоритмом построения триангуляции Делоне является итеративный: по 3-4 точкам строится начальная триангуляция, а затем все исходные точки по одной добавляются в текущую систему треугольников. Для каждой точки P необходимо провести две основные операции: определить положение (локализовать) P и перестроить систему треугольников. Если в качестве начальных точек взять 4 вершины прямоугольника, объемлющего исходные точки, то точка P никогда не окажется за границей триангуляции и обязательно попадет внутрь некоторого треугольника ABC. Локализацию точки P можно начинать с любого треугольника текущей системы: если O – некоторая точка этого начального треугольника (например, одна из вершин), то ABC легко найти, последовательно проверяя смежные треугольники вдоль отрезка OP (варианты проверок приведены в [3]). ABC уже не может принадлежать триангуляции, поэтому он разбивается на три новых треугольника с общей вершиной P. Для каждого нового (содержащего точку P) и смежного с ним старого треугольника необходима проверка условия Делоне. При нарушении этого условия производится перестроение * Работа выполнена при частичной поддержке РФФИ (грант № 98-07-03194). 46 Раздел 1 нового и старого треугольников: в четырехугольнике, образованном ими, проводится новая диагональ. При этом появляются два новых треугольника, каждый из которых снова проверяется и т.д. Если всего будет построено t новых треугольников, то это означает, что P соединена ребрами триангуляции Делоне с t вершинами и было проведено 2t − 3 проверок условия Делоне. Трудоемкость локализации одной точки определяется количеством расположенных вдоль отрезка OP треугольников и составляет O( n) в среднем и даже O( n) в наихудшем. Если исходные точки хорошо перемешаны, то число перестроений треугольников обычно невелико, но в важном практическом случае, когда точки являются узлами небольшого числа линий (галсов), количество проведенных из P ребер (а следовательно, проверок условия Делоне) может зависеть от n и достигать таких же порядков, как у локализации. Трудоемкость итеративного алгоритма для конкретного набора точек существенно зависит от порядка их выбора и может изменяться от линейной до квадратичной. В настоящей работе описывается алгоритм предварительной обработки, определяющей такой порядок выбора, при котором для ряда практически важных распределений точек трудоемкость итеративного алгоритма триангуляции Делоне становится линейной. Доказывается, что если набор точек удовлетворяет определенным ограничениям, то трудоемкость триангуляции будет гарантированно линейной. 2. Предобработка точек Для снижения трудоемкости локализации точки P нужно начинать поиск с треугольника, содержащего вершину, которая является одним из ближайших соседей P среди вершин триангуляции. Для снижения числа перестроений пар треугольников нужно добавлять в триангуляцию точки как узлы некоторой постоянно сгущающейся сетки, тогда каждая вершина (кроме граничных) будет иметь не более фиксированного числа потенциальных соседей. Предлагается следующий подход: • по исходным точкам строить дерево точек (каждой вершине будет соответствовать одна точка в некотором квадрате в исходной области, степень дерева равна 9), • порядок выбора точек при триангуляции определять порядком прохода вершин дерева при поиске в ширину, • в качестве ближайшего соседа для каждой точки выбирать точку из родительской вершины. Будем полагать, что исходная область – это минимальный по площади квадрат, в который попадают все исходные точки. Приведем простейший рекурсивный алгоритм построения дерева точек. Алгоритм 1 (построение дерева точек). Шаг 1. Взять в качестве начального текущего квадрата исходную область и выбрать любую точку для включения в корень дерева – текущую родительскую вершину. Шаг 2. Разделить текущий квадрат на 9 новых равных квадратов, в каждом из которых выбрать по одной не выбранной ранее точке (если она существует) и включить их в вершины-сыновья родительской вершины. Шаг 3. Вернуться к шагу 2 для всех новых квадратов, в которых есть не выбранные ранее точки. Конец алгоритма 1. На шаге 2 введем дополнительное правило: если в новый квадрат попадает ранее выбранная точка, то она включается повторно, но уже в вершину другого уровня (во время триангуляции повторно задаваемые точки можно легко исключить). Тогда для каждой вершины уровня h выполнится следующее условие: если исходную область разбить на 9 h −1 одинаковых квадратов, то в каждый из них попадет не более одной из точек, включенных в вершины уровня не выше h. Если исходная область разбита на квадраты со сторонами d, то все исходные точки, лежащие на расстоянии не менее 2d от границы, будем называть внутренними, а остальные – граничными. Далее воспользуемся простым свойством: внутри окружности, построенной по трем вершинам любого треугольника Делоне, не содержится других точек, следовательно, вокруг любого ребра треугольника Делоне (ребра Делоне) можно описать окружность, которая не будет содержать внутри себя ни третьей вершины, ни других точек. (а) (б) (в) Рис. 1. Проверка ребер триангуляции Делоне: а) – для внутренней точки; б) – для граничной точки; в) – для точки на границе пустой области (сплошные линии – допустимые ребра, штриховые – недопустимые, заштрихованные квадраты не содержат точек) Теория геоинформатики и дистанционного зондирования 47 Лемма 1. Пусть исходная квадратная область разделена на m равных квадратов со сторонами d, в каждом из которых (кроме одного) находится по одной точке, и по данным точкам построена триангуляция Делоне. Добавим новую точку в пустой квадрат и перестроим триангуляцию. Тогда, если новая точка является внутренней, то число новых ребер Делоне составляет O(1), в противном случае оно может достигать O( m ) . Доказательство. Любая окружность диаметра 2d 2 , на которой лежит внутренняя точка, содержит внутри себя по крайней мере один полный квадрат со стороной d (т.е. одну точку, рис. 1,а). Следовательно, длина любого ребра Делоне, проведенного из внутренней точки, не превышает 2d 2 и число таких ребер составляет O(1). С другой стороны, все O( m ) граничных точек на одной границе области могут располагаться так, что новая точка соединится ребром Делоне с любой из них (рис. 1,б). Лемма 1 доказана. Лемма 2. Пусть выполнены условия леммы 1, а в качестве пустого квадрата последовательно выбирается каждый из m заданных. Тогда среднее количество ребер, проведенных из новой точки, составляет O(1). Доказательство. Если новая точка – внутренняя, то она может соединяться ребрами с O(1) из ранее заданных. Число граничных точек составляет O( m ) , каждая из них может соединяться не более чем с O( m ) другими, следовательно, общее число возможных ребер для всех граничных точек не превышает O(m) . Лемма 2 доказана. Лемма 3. Пусть исходная квадратная область разделена на равные квадраты со сторонами d, причем в каждом из них находится по одной точке, и по данному набору точек построена триангуляция Делоне. Пусть в каждый из квадратов последовательно добавляется не более O(1) новых точек и триангуляция постоянно перестраивается. Тогда среднее число ребер, включаемых в триангуляцию при добавлении новой точки, также не превышает O(1). Доказательство. Следует из доказательств лемм 1 и 2. Лемма 4. Пусть выполняются условия леммы 3, причем локализация новой точки всегда начинается с треугольника, содержащего точку, заданную ранее в том же квадрате. Тогда среднее число проверок треугольников при локализации новых точек составляет O(1). Доказательство. В силу ограниченности длин ребер триангуляции (лемма 1) через любой квадрат, не примыкающий к границе области, может проходить не более O(1) ребер. Через граничный квадрат могут проходить O( m ) ребер, но и число таких квадратов не превышает O( m ) . Лемма 4 доказана. Лемма 5. Пусть исходная квадратная область разделена на равные квадраты со сторонами d, причем внутри каждого, кроме квадратов из некоторой (пустой) прямоугольной области размером k ⋅ d × l ⋅ d , k , l ≥ 1 , задано по одной точке. По данным точкам построена триангуляция Делоне. Тогда любая точка, расположенная в квадрате, примыкающем к пустой области, может соединяться ребрами треугольников не более чем с O(min(k , l )) точками. Доказательство. Пусть k ≤ l . Построим окружность, внутрь которой попадают по 2 квадрата на противоположных сторонах пустой области (рис. 1,в). Диаметр этой окружности равен d ⋅ ((k + 2) 2 + 2 2 < < d ⋅ (k + 2 2 ) . Очевидно, что при любом расположении окружности такого диаметра внутрь нее целиком попадет хотя бы один квадрат, содержащий точку. Следовательно, длина любого ребра триангуляции не может превышать данного диаметра, причем ребро такой длины может соединять только точки, непосредственно примыкающие к границе пустой области. Таким образом, из любой точки на границе пустой области можно провести не более O( k ) ребер триангуляции Делоне. Лемма 5 доказана. При построении дерева по n исходным точкам производится разбиение исходной области на квадраты различного размера до тех пор, пока в каждом квадрате окажется не более одной точки. Размер квадрата определяется максимальным уровнем вершины, включающей попавшую в квадрат точку. Для вершины уровня h он в 3h−1 раз меньше размера исходной области. Назовем пустой квадратной областью любое объединение пустых смежных квадратов в единый квадрат, ко всем границам которого примыкает хотя бы по одному непустому. Для простоты будем считать, что к любой пустой квадратной области может примыкать либо O(1), либо O( n ) , либо O(n) непустых квадратов. Теорема. Пусть по n исходным точкам построено дерево. Если • к границам любой пустой квадратной области примыкает не более O( n ) непустых квадратов, • имеется не более O(1) пустых областей, к которым примыкает O( n ) непустых квадратов, • порядок выбора точек при последующей триангуляции совпадает с порядком просмотра вершин в ширину, • локализация любой точки начинается от точки из родительской вершины, то трудоемкость триангуляции Делоне будет гарантированно линейной. Доказательство. Следует из доказательства лемм 1-5, так как теорема просто объединяет их условия. 48 Раздел 1 Отметим, что трудоемкость локализации одной точки всегда будет O(1). С точки зрения общей трудоемкости наилучшим будет равномерное размещение точек в исходной области, которое характеризуется идеальной сбалансированностью получаемого дерева. В качестве худшего случая можно предложить размещение по O( n ) точек на O( n ) непересекающихся и не вложенных друг в друга окружностях. 3. Практическая реализация алгоритмов предобработки и триангуляции Приведенный выше простейший алгоритм построения дерева точек от корня вниз имеет трудоемкость O(n log n) даже для равномерного размещения точек и может достигать O(n 2 ) в наихудшем. Поэтому мы предлагаем рекурсивный алгоритм построения дерева снизу вверх. Алгоритм основан на разбиении исходной области на квадраты разного размера и построения списков попадающих в них точек. Для каждого квадрата сохраняются начало и конец такого списка, что обеспечивает быстрое объединение малых квадратов в более крупные. Точка, включаемая в вершину дерева (и исключаемая из дальнейшей обработки), всегда выбирается из начала соответствующего списка. Алгоритм 2 (построение дерева точек снизу вверх). Шаг 1. Формирование текущего (пустого) дерева точек. Шаг 2. Деление исходной области (квадрата) на m = 9 k (n div 9 < m ≤ n) равных квадратов уровня k+1. Построение m списков точек, попавших в каждый из этих квадратов. Шаг 3. Последовательное объединение квадратов (и соответствующих списков точек) в более крупные: девятки квадратов уровня k+1 образуют m/9 непересекающихся квадратов уровня k, которые далее объединяются на уровне k–1 и т.д., пока не будет получен единственный квадрат уровня 1. Результат – построение идеально сбалансированного дерева квадратов. Шаг 4. Построение по дереву квадратов поддерева точек высоты k+1: если список точек для некоторого квадрата не пуст, то первая точка из списка включается в вершину (уровень точки в поддереве равен уровню соответствующего квадрата). Присоединение полученного поддерева к текущему дереву точек. Шаг 5. Цикл по всем квадратам уровня k+1 (пусть очередной квадрат содержит i точек): если i<9, то все точки включаются в листья на соответствующем уровне текущего дерева точек, в противном случае квадрат обрабатывается, как вся исходная область (возврат к шагу 2 при n = i). Конец алгоритма 2. На шаге 2 производится однократный просмотр n точек. Дерево квадратов содержит O(n) вершин, поэтому трудоемкость шагов 3 и 4 также составляет O(n). На шаге 5 квадраты нижнего уровня обрабатываются рекурсивно, как вся исходная область. Глубина рекурсии теоретически может достигать O(n), однако реально она всегда ограничена минимальным значением расстояния eps, при котором точки еще считаются различными, D последовательных разбиений так как при размере исходного квадрата D нет смысла проводить более log 3 eps квадратов. При этом за один рекурсивный вызов для n точек производится сразу log 3 n таких разбиений (10 для 100 000-500 000 точек). Таким образом, реально глубина рекурсии всегда ограничена некоторой фиксированной величиной, и алгоритм имеет линейную трудоемкость. Предобработка производится тем быстрее, чем ближе исходное размещение точек к равномерному (чем лучше сбалансировано дерево точек). Последнее обычно выполняется для больших наборов точек. Дерево точек совершенно не обязательно хранить в виде классического списка. Для каждой точки достаточно определить только два значения: номер уровня дерева, на котором точка в первый раз включалась в вершину, и номер точки из родительской вершины. Последующая цифровая сортировка по номеру уровня [ее трудоемкость составляет O(n)] расположит точки в порядке, соответствующем поиску в ширину на дереве. Затраты памяти для размещения дополнительных структур данных во время предобработки существенно меньше, чем при триангуляции. Предобработка нужна для уменьшения числа проверок во время локализации точек и перестроении треугольников. Проверки состоят в основном из операций типа вычисления скалярных и векторных произведений (точнее, их модулей со знаком). Эти операции будем далее считать элементарными шагами при оценке трудоемкости. При локализации нужно установить, попадает ли точка в выбранный треугольник и, если нет, то в каком из соседних нужно продолжить поиск. Если перестроение треугольников организовано так, что порядок следования вершин всегда соответствует обходу треугольника против часовой стрелки (или всегда по часовой стрелке), то потребуется вычислять всего 1-3 векторных произведения на каждый проверяемый треугольник. Простой способ, предложенный в [4], требует 2 или 5 элементарных шагов на проверку условия Делоне при перестроении треугольников. 4. Вычислительный эксперимент Исследование работы итеративного алгоритма триангуляции Делоне после предварительной обработки набора точек проводилось путем статистического моделирования. Триангуляции строились по случайным наборам n точек, независимо распределенных в единичном квадрате. Кроме равномерного и близкого к нему тре- 49 Теория геоинформатики и дистанционного зондирования угольного распределения использовались три существенно неравномерных вида распределений – полинормальное, равномерное на отрезках и фрактальное. Полинормальное распределение строится как сумма из 5 круговых нормальных, центры которых равномерно и независимо распределены в единичном квадрате, а среднеквадратичные отклонения равны 0,1, причем точки, выходящие за пределы квадрата, не учитываются. Равномерное на отрезках распределение получается следующим образом: генерируются 2 n равномерно и независимо распределенных в квадрате вспомогательных точек, которые задают концы n отрезков, а затем исходные точки генерируются внутри отрезков по равномерному распределению, причем вероятность попадания точки в конкретный отрезок пропорциональна его длине. Симметричное фрактальное распределение в единичном квадрате с точкой бесконечного сгущения (0,5, 0,5) имеет плотность 1 f ( x, y ) = , 0 ≤ x, y ≤ 1 , r −1 2 r (| 2 x − 1 || 2 y − 1 |) r и при r=1 превращается в равномерное, а при r → ∞ стремится к дельта-функции. Всего в вычислительном эксперименте было использовано 7 видов распределений: 1) равномерное; 2) треугольное с максимумом плотности в левом нижнем углу квадрата; 3) полинормальное; 4) равномерное на отрезках; 5) фрактальное, при r = 2; 6) фрактальное, при r = 4; 7) фрактальное, при r = 8. Моделирование проводилось по 50 наборам точек для каждого распределения. Кроме того, триангуляция строилась по узлам равномерной прямоугольной сетки и по реальным наборам узлов изолиний и высотных отметок участка местности. Количество точек n во всех случаях менялось в диапазоне от 5 000 до 500 000. Трудоемкость определялась не временем, а количеством элементарных шагов (векторных или скалярных произведений) на одну точку. Моделирование показало очень слабую зависимость трудоемкости от количества точек, поэтому в табл. 1 представлены усредненные результаты. При всех значениях n реальные значения отличаются от табличных не более, чем на 2% для равномерного, 4% для фрактального (r = 8) и 1% для остальных распределений. Из-за наличия кэш-памяти зависимость времени работы линейного алгоритма от n не является строго линейной. Поэтому в табл. 1 приводится только время обработки 100 000 точек (процессор Intel Celeron 300 МГц). Таблица 1. Результаты экспериментов Средняя Кол-во элементарных Время обработки 100 000 высота шагов на точку точек, с Вид распределения дерева локалиперестропредобратриангу500 000 зация ение ботка ляция точек Равномерное 7,1 5,33 28,38 0,27 1,06 Треугольное 8,0 5,34 28,24 0,27 1,05 Полинормальное 9,0 5,36 28,20 0,38 1,01 Равномерное на отрезках 8,5 5,67 30,38 0,29 1,07 Фрактальное (r=2) Фрактальное (r=4) Фрактальное (r=8) Прямоугольная сетка Реальный набор точек 11,3 51,1 123,0 6,0 8,0 5,35 5,31 6,11 4,79 5,71 28,19 27,98 28,02 17,92 29,31 0,31 0,40 0,88 0,22 0,22 1,03 1,00 1,00 0,71 1,00 Отношение времени предобработки к общему времени для первых пяти распределений практически не зависит от n и не превышает 0,28. Для фрактального (r = 4) оно монотонно возрастает от 0,24 до 0,32, а для фрактального (r = 8) вначале резко возрастает от 0,36 до 0,55, а затем начинает медленно убывать. Последнее связано с тем, что из-за очень неравномерного размещения точек уже при n = 10 000 дерево точек достигает предельной высоты, когда размеры получаемых квадратов близки к значению точности представления чисел в формате double. При дальнейшем увеличении n предобработка оказывает все меньшее влияние на трудоемкость триангуляции. 50 Раздел 1 ЛИТЕРАТУРА 1. Препарата Ф., Шеймос М. Вычислительная геометрия: Введение / Пер. с англ. – М.: Мир, 1989. – 478 с. 2. Lee D., Schachter B. Two algorithms for constructing a Delaunay triangulation // Int. Jour. Comp. and Inf. Sci., 1980, Vol.9, No.3, p.219-242. 3. Скворцов А.В., Костюк Ю.Л. Эффективные алгоритмы построения триангуляции Делоне // Геоинформатика. Теория и практика. Вып. 1. – Томск: Изд-во Том. ун-та, 1998, с. 22-47. 4. Фукс А.Л. Предварительная обработка набора точек при построении триангуляции Делоне // Геоинформатика. Теория и практика. Вып. 1. – Томск: Изд-во Том. ун-та, 1998, с.48-60. ПОЛИГОНАЛЬНО-ЛИНЕЙНЫЕ ГРАФОВЫЕ МОДЕЛИ РАСТРОВЫХ ИЗОБРАЖЕНИЙ Ю.Л. Новиков Томский государственный университет, НПО «Сибгеоинформатика», г. Томск 1. Введение В настоящей работе предлагаются новые модели данных и алгоритмы автоматического построения векторно-графовых моделей растровых изображений. Векторно-графовые модели растровых изображений в общем случае представляют собой векторные модели линий и границ залитых площадных объектов, изображенных на исходном растре. Построенная такая векторная модель будет представлять собой граф, возможно, планарный. Для векторного моделирования полигонов в данных моделях используются многоугольники, и для представления таких моделей планарных графов уже недостаточно. В данной работе рассматривается задача автоматического построения векторно-графовых моделей растров, то есть без интерактивного вмешательства пользователя в процесс построения модели. Построенные таким образом модели растровых изображений находят широкое применение в задачах векторизации растровых образов картографических материалов в геоинформационных системах (ГИС). 2. Полигонально-линейная графовая модель (формальное определение) Несомненным достоинством предложенных ранее алгоритмов построения первичных моделей растровых образов при применении их для векторного моделирования n-цветных изображений (см., например, [1]) является простота их реализации. Однако они имеет и существенные недостатки. Суть данных недостатков – неадекватность получаемой графовой модели ожиданиям пользователя. Эта неадекватность выражается в получаемых моделях площадных объектов, залитых базовыми цветами растра. Во-первых, при построении векторных моделей двух полигонов, изображения которых на растре имеют общую границу, у них будут присутствовать не совпадающие границы, имеющие «пустоту» друг между другом. Во-вторых, при построении векторной модели полигона, на растровое изображение которого наложено изображение линейного объекта, векторная модель будет представлять собой два полигона, имеющих несовпадающие границы, причем между этими границами будет находиться модель линейного объекта. Такое несоответствие ожидаемого и получаемого приведет к ухудшению качества процедур последующего распознавания. Для решения этой проблемы нами предложена полигонально-линейная графовая модель n-цветного растрового изображения. Полигонально-линейная графовая модель растрового изображения (ПЛГМ)– это четверка G pl = (V , Rl , Rb , P) , построенная по исходному растру I как расширение планарного графа линий G = (V , R ) , где V – множество вершин графа G такое, что V = Vо ∪ Vп , где: Vо – множество опорных вершин (имеющих в графе G валентность 0, 1 или 3 и более); Vп – множество промежуточных вершин, имеющих в графе G валентность 2, причем каждая из вершин v ∈ V соответствует пикселу на растре I [то есть имеет растровые координаты (i, j ) ]; R – множество ребер графа G, образованное как R = Rl ∪ Rb , где Rl – множество ребер, образующих векторные модели линейных объектов на исходном растре, Rb – множество ребер, образующих векторные модели границ между площадными объектами на исходном растре, причем каждое из ребер r ∈ R соответствует отрезку на плоскости. Множества V, Rl, Rb этого графа G образуют соответствующие множества ПЛГМ Gpl. P – множество полигонов {p}. Содержательно полигон р моделирует закрашенную область на исходном растре, граница которой аппроксимируется многоугольником, задаваемым набором ребер. Полигон p здесь рассматривается как набор ломаных ( a1 ,..., a k ), задающих строгую границу этого полигона. Под ломаной a i мы понимаем здесь последовательность ребер (r1 , K , rn ) графа G, представляющих собой цепочку ребер, начинающуюся и заканчивающуюся в опорных точках. Формально это можно записать так: эту последовательность