Метод цепей для организации хранения многомерных триангуляций

Автор: Клячин Владимир Александрович, Попов Владимир Валентинович

Журнал: Математическая физика и компьютерное моделирование @mpcm-jvolsu

Рубрика: Прикладная математика

Статья в выпуске: 2 (19), 2013 года.

Бесплатный доступ

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

Триангуляция, симплекс, оценка объема памяти, число триангуляций, число каталана

Короткий адрес: https://sciup.org/14968738

IDR: 14968738

Текст научной статьи Метод цепей для организации хранения многомерных триангуляций

О способах записи триангуляции

В настоящей статье под к -мерным симплексом S в R мы понимаем выпуклую оболочку к + 1 точек А г = 0,..., к п таких, что векторы А 1 А 0 2 А 0 ,..., А ^ А 0 линейно независимы. Пусть р г ,г = 1,...,N — некоторый набор точек р г Е R таких, что любой симплекс в вершинах из { р ^ } является невырожденным. Триангуляцией Т заданного набора точек называется такой набор п -мерных симплексов S 1 ,...,S m , что:

  • 1)    каждая точка p i заданного набора является вершиной одного из симплексов S Е Т ;

  • 2)    каждая вершина любого симплекса S Е Т является одной из точек р^г = = 1,...,N ;

  • 3)    внутренность пересечения любых двух симплексов пуста.

Один из первых алгоритмов триангуляции с использованием условия пустого шара был предложен Б.Н. Делоне в его работе [5] (перевод см.: [1]).

Нас будет интересовать вопрос об оценке объема памяти, необходимой для хранения триангуляции заданного набора точек. Отметим работу [4], в которой решается подобная задача для случая размерности п = 2 . Объем памяти будем вычислять в битах. С этой целью введем функцию Ь(х) , равную минимальному числу бит, необходимому для записи натурального числа х Е N в двоичной системе счисления. Очевидно, что

Ь(х) = [log 2 х] + 1.

Формально постановка задачи следующая. Обозначим через V(Р ) совокупность всех триангуляций набора точек Р = { р 1 2 , ...,p N } . Тогда под способом записи триангуляции Т мы понимаем отображение

/ : V(Р) ^ N, которое всякой триангуляции ставит в соответствие натуральное число. Причем, мы предполагаем, что отображение обладает свойством

V P = Р ‘‘ е V(Р ) ^ / ) = / ‘‘ ).

Тогда величину

^ ( /) = тах теУ (р ) Ь ( / ( Т ))

можно считать мерой объема памяти, необходимой для запоминания триангуляции Т при заданном способе хранения / . Приведем примеры.

Пример 1. Один из стандартных способов (см., например, [2]) хранения триангуляции состоит в том, что каждому симплексу S i Е Т сопоставляется набор из (п + 1) натурального числа п i 0 , п i 1 ,..., n in , такой, что

S i = C o nv [ p n j 0 ,p n ii , ...,Рщ п } .

Значит, для такого способа записи одного симплекса понадобится (п + 1)&(^) бит, а для всей триангуляции получим величину т(п + 1)&(^) . В этом примере конструкция отображения / следующая. Значение /(Т) — это натуральное число, в двоичной системе записи которого первые b(N ) бит занимает число пю, вторые b(N ) бит — п 11 и т. д.

Другими словами, матрицу натуральных чисел Цп^||, г = 1,...,N, j = 0,

..

., п записы-

ваем в итоговое число построчно. Полученное натуральное число /(Т) будет в памяти занимать т(п + 1)b(N) бит. Обозначим построенное отображение в этом примере через /0. Заметим, что г      М(/о)          , з lim —----— = п + 1.

  • n >^ mlog 2 N

Мы предлагаем конструкцию построения отображения / , для которого

М ( /)

.lim n>^ mlog2N

= 1.

Для ее описания нам понадобится понятие цепи. Цепью С в заданной триангуляции Т Е V(Р ) мы назовем совокупность различных симплексов S 1 , S 2 , ..., S k , такую, что для любого г = 2, ...,к симплексы S t - 1 и S t имеют единственную общую (п 1) -мерную грань. Число к называется длиной цепи С . Предположим, что триангуляция Т Е V ) разбита на непересекающиеся цепи С 1 , ...,С Р длины 1 1 , ...,1 Р соответственно. Пусть С — некоторая цепь. Построим последовательность натуральных чисел

П 10 11 , ...,П 1 ТИХ 1 2 2 з , ...,Х к- 1 ,п к к ,

где п 10 ,п 11 ,...,п 1 п — номера вершин в диапазоне 1, 2,...,N первого симплекса цепи, х 1 — номер в диапазоне 0, 1,...,п вершины первого симплекса, напротив которого расположена общая грань со вторым симплексом, п 2 — номер вершины второго симплекса, расположенной напротив общей грани с первым симплексом, и т. д. Причем х к всегда равно п + 1 . Это число нам необходимо для указания конца цепи в последующих построениях. Несложно подсчитать, что для записи всей этой последовательности чисел понадобится (п + k)Ь(N) + кЬ(п + 1) бит. Так что для каждой цепи С г мы получим запись длины (п + l г )Ь(N ) + l t Ь(п + 1) . Суммируя по всем цепям и используя равенство

р

1г = т, г=1

получим, что для всей записи симплексов триангуляции Т Е V(Р ) будет затрачено (рп + m)Ь(N )+ тЬ(п + 1) бит. Конструкция отображения / сводится к упаковке последовательностей вида (2) в одно двоичное число, содержащее ровно (рп+m)Ь(N)+тЬ(п+1) бит. Следовательно, для нашего отображения / получаем

р(/ ) = (рп + m)Ь(N ) + тЬ(п + 1).

Поэтому

..     р(/ )      ..   (рп + m)Ь(N )+ тЬ(п + 1)

lim —----— = lim -------------—-------- = 1, n>^ т1од2Л   n>^         т1од2Л при условии р = о(т), N ^ то, что предполагает неограниченное и равномерное увеличение длины цепей при N ^ то. На самом деле это условие несущественно, поскольку небольшие перестройки триангуляции позволяют записать ее в виде одной цепи. Однако представление триангуляции в виде одной цепи не разумно с точки зрения временных затрат на доступ к отдельному симплексу. Действительно, предложенная нами конструкция, скажем, в отличие от отображения /0 примера 1, не позволяет осуществить прямой доступ к любому симплексу, поскольку номера вершин формируются динамически — в процессе побитового чтения числа /(Т). При этом, чем длиннее цепь, тем она более затратней для чтения. Попытаемся найти оптимальное значение для количества цепей в триангуляции. Для этого составим целевую функцию. Пусть с1 — стоимость единицы одной операции доступа к памяти, с2 — стоимость одного бита памяти. Средняя длина цепи равна т/р, соответственно среднее число операций чтения равно т/2р. Получаем следующее выражение для целевой функции

F (р) = с 1-- + с 2 (рп + m)Ь(N ) + тЬ(п + 1).

Исследуя эту функцию на минимум, получим оптимальное значение для числа цепей

В этом случае

р

с1 m с2 2nb(N)'

ц(/ ) = а С ~ mnb(N ) + mb(N ) + mb(n + 1). V С 2

Так что и в оптимальном случае

Р ( / )

. lim n>^ mlog2N

lim n ^^

у/ ^ 1 mnb(N) + mb(N) + mb(n + 1) mlog 2 N

= 1.

Зададимся вопросом, насколько предложенный метод является наилучшим способом записи триангуляции. С этой целью необходимо получить нижние оценки величины ^(f) , независящие от / . Пусть К = | V ) | обозначает мощность множества V(Р ) , то есть равно количеству триангуляций набора точек Р . Несложно проверить, что

Р ( / ) [ lo g 2 К ] + 1.

Действительно, поскольку отображение / взаимно-однозначно, то мощность множества значений / равно мощности множества области определения, то есть в нашем случае эта мощность равна К . Это требует как минимум К натуральных чисел для идентификации каждой триангуляции. Для записи такого числа необходимо как минимум [log 2 К ] + 1 бит.

Пример 2. Рассмотрим набор точек в R 2 с координатами p i 0 = (г, 0) и Р г1 (г, 1) , где г = 0,1, ...,п . Так что N = 2(п + 1) . Триангуляцию будем строить так. Возьмем ребро р 00 р 01 . Для получения треугольника у нас два варианта: либо точка р 10 , либо точка р 11 . Выберем какую-нибудь из них. Допустим, это точка р 10 . Для получения следующего треугольника у нас опять два варианта: либо точка р 20 , либо точка рц. Заметим, что во всех вариантах у нас будут две точки: одна на верхнем ряду, другая — на нижнем. Теперь отображение / можно построить так. Каждой триангуляции необходимо поставить в соответствие двоичное число длины 2п бит, в котором число единиц равно числу нулей. Единицы соответствуют выбору точки из верхнего ряда, а нули — из нижнего ряда. Так что всего комбинаций получается С П п . Согласно формуле Стирлинга С П = о(4 п ) . Отсюда получаем оценку для числа триангуляций К = о(4 п ) , что, в свою очередь, учитывая, что число треугольников m = 2п , дает нулевое значение в пределе вида (1).

Пример 3. Рассмотрим N = п + 2 точки, лежащие в вершинах выпуклого N- угольника. Число триангуляций вершин выпуклого многоугольника дается числом

Ка-

талана (см., например, [7])

С п

п + 1

п

С 2п *

Так что в этом случае ^(/) = о(4 п ) и мы получаем, как и в предыдущем примере,

Р ( / )

. lim n>^ mlog2N

= 0 .

Оказывается, что эти примеры носят более общий характер. Именно в работах [3; 6; 8-11] было показано, что найдется абсолютная постоянная с, независящая от набора точек и его мощности N, что число триангуляций не превосходит cn. Наилучшая на данный момент константа с = 43 была найдена в работе [10]. Следовательно, можно надеяться на существование такого способа записи триангуляции, при котором число бит растет линейно при N ^ то. Ну и, в частности, будет выполнено (3).

Триангуляции многоугольника на плоскости

Пусть F — многоугольник на плоскости и S = { р 1 2 , ... ,P n } — такой набор точек плоскости, который включает все вершины многоугольника F , причем каждая точка р г является или вершиной, или внутренней точкой F . Необходимо перечислить все триангуляции многоугольника F , вершинами которой являются точки множества S . Не теряя общности, считаем, что отрезок р 1 р 2 является стороной многоугольника F .

Обозначения:

Триангуляция Т будет состоять из треугольников А 1 , А 2 , ... , А т ( т — общее число треугольников в триангуляции).

Вершинами треугольника А & служат точки множества S с порядковыми номерами п1[к] , п2[к] и п3[к] .

к — порядковый номер строящегося треугольника из триангуляции Т . В начале построения к = 1 .

Треугольник строим следующим образом: к отрезку с порядковыми номерами точек п1[к] , п2[к] («активная сторона строящегося треугольника А & ») пытаемся подобрать вершину с порядковым номером п3[к] (если такая вершина существует) из того же множества S , и полученный треугольник А & будет включен в строющуюся триангуляцию Т . После этого ребро с концами п1[к] , п3[к] будет принято за активную сторону треугольника А ^ + 1 , а ребро с концами п2[к] , п3[к] («свободное ребро») будет запомнено и в дальнейшем может быть использовано как активное ребро для построения треугольника А г при некотором г > к + 1 (если в этом возникнет необходимость).

Триангуляции многоугольника на плоскости

Пусть F — замкнутый многоугольник на плоскости и S = { р 1 , р 2 ,..., р } — такое его конечное подмножество, которое содержит все вершины F . Необходимо перечислить все триангуляции многоугольника F , вершинами которых являются точки множества S . Не теряя общности, считаем, что отрезок 1 2 ] является стороной многоугольника F .

Обозначения:

Очередная триангуляция Т будет состоять из треугольников А 1 , А 2 , ... , А т , где т — общее число треугольников в триангуляции (оно одинаково для любой триангуляции). Это число будет найдено после построения первой триангуляции. В начале работы алгоритма полагаем т = 0 . Вершинами треугольника А & служат точки множества S с порядковыми номерами п 1 [к] , п 2 [к] и п 3 [к] .

к — порядковый номер строящегося треугольника из триангуляции Т . В начале построения к = 1 .

Через В(г 1 2 3 ) будем обозначать треугольник с номерами вершин г 1 , г 2 , г 3 . Пусть к >  1 и треугольники А 1 , А 2 , ... , А ^ - 1 уже построены. Пусть г 1 , г 2 , г 3 — целые числа от 1 до п . Тогда через / 1 2 3 ) будем обозначать такое наименьшее целое число j , что г 3 < j п и треугольник В(г 1 2 , j ) можно добавить к последовательности А 1 , А 2 , ... , А ^ - 1 , то есть он удовлетворяет следующим условиям:

  • (а)    В(г 1 2 ,^) не содержит точек множества S , отличных от вершин этого треугольника;

  • (b)    треугольник D (i1,i2 ,j ) не имеет общих внутренних точек ни с одним из треугольников А 1 , А 2 , ... , А ^ - 1 (но может иметь общую вершину или общую сторону).

Если числа j с перечисленными свойствами не существует, то полагаем / 1 2 3 ) = = 0 .

Определим функцию /(г 1 2 3 ) и при к = 1 . А именно, /(г 1 2 3 ) — это наименьшее целое число от 1 до п , которое больше г 3 , и для которого треугольник D(i 1 ,i 2 ,j ) удовлетворяет условию (a). Если такого j не существует, то полагаем /(г 1 2 3 ) = 0 .

В процессе работы алгоритма будут строиться также три одномерных массива 7 1 [г] , 7 2 [г] и /г[г] , где 1 г п . При построении треугольника А & отрезок е , , концами которого являются точки множества S с порядковыми номeрами д 1 [г] и <7 2 [г] , г = 1, 2,..., к 1 , в дальнейшем может быть использован для построения треугольника A t , где t к . Отрезки е , содержатся в объединении границ треугольников А 1 , А 2 , ... , А д - ( е , — «граничные отрезки»). Массив /г[г] играет следующую роль: если /г[г] = 0 , то отрезок е , пока не использован для построения треугольника. Если же этот отрезок будет стороной некоторого треугольника A t , t >  0 , включенного в строящуюся триангуляцию, то /г[г] = t .

На множестве упорядоченных пар целых чисел рассматриваем обычный лексикографический порядок: если a, b, c, d — целые числа, то

(a, b) < (c, d) < >  a c или (a = c и b < d).

Алгоритм построения триангуляций

  • (1)    Полагаем к = 1 , п 1 [1] = 1 , п 2 [1] = 2 (активная сторона треугольника А 1 ).

Триангуляция Т пока не содержит ни одного треугольника.

Полагаем m = 0 (число треугольников в триангуляции; оно будет определено после того, как будет построена первая триангуляция).

Полагаем ktr = 0 — общее число триангуляций.

  • (2)    Начинаем строить треугольник А ^ (в этом пункте к 1 — целое число). Полагаем п 3 [к] = 0 .

  • (3)    Полагаем j = /(п 1 [к],п 2 [к], п 3 [к]) .

Если j = 0 , то идем к пункту (5), если же j >  0 , то идем к пункту (4).

  • (4)    Принимаем за А д треугольник D(n 1 [к],п 2 [к], j) , где j — число, найденное в пункте (3), и определяем новую активную сторону с номерами вершин п 1 [к] и п 3 [к] . Для этого полагаем

п з [ к ]        = j,

П 1 [к + 1] = П 1 [к], П 2 [к + 1] = п з [к].

Сторону с номерами вершин п 2 [к] и п з [к] запоминаем как граничную сторону. Для этого полагаем

7 1 [к]   = П 2 [к],

7 2 [к]   = п з [к],

/г [к] = 0.

Число к увеличиваем на 1.

Если m = 0 , то идем к пункту (2).

Если m > 0 и к m , то идем к пункту (2).

Если m > 0 и к > m , то идем к пункту (7) (очередная триангуляция построена).

  • (5)    На этот пункт попадем, если j = 0 в пункте (3). Среди граничных сторон выбираем такую, которую можно принять за активную сторону. Для этого полагаем

Е = { / : /<9 1 [/], 9 2 [/], 0) > 0, где 1 / < к } .

Если множество Е пусто, то идем к пункту (6). Если же Е = 0 , то за / 0 принимаем такое число, что (9 1 [/ 0 ],9 2 [/ 0 ]) — наименьший элемент множества Е (относительно введенного выше лексикографического порядка). После выбора / 0 полагаем

^[к]   = 9 1 [/ о ],

^[к]   = 92 [/о], пз[к]   = 0,

/г[/ о ] = к.

Идем к пункту (3).

  • (6)    На этот пункт попадем, если множество Е в пункте (5) пусто, то есть уже нет граничных ребер, которые можно принять за сторону строящегося треугольника. Это будет означать, что или построена очередная триангуляция, или зашли в тупик, или алгоритм завершил работу и все триангуляции уже перечислены. Действия в этом пункте таковы:

Если т = 0 , то полагаем т = к 1 и идем к пункту (7).

Если к = 0 , то выдаем число ktr найденных триангуляций и завершаем работу.

Если 1 < к т , то к уменьшаем на 1 и идем к пункту (8).

  • (7)    Построена очередная триангуляция. Выдаем список треугольников А 1 , А 2 ,..., А т . Увеличиваем число ktr (уже построенных триангуляций) на 1 .

Переходим к построению очередной триангуляции. Для этого полагаем к = т — — 1 : в дальнейшем будем строить заново треугольник А т-1 . Тем самым мы удаляем два последних построенных треугольника А т-1 и А т (удаление только последнего треугольника не даст новой триангуляции).

  • (8)    Начинаем заново строить треугольник А ^ , а затем и все треугольники с большими номерами. При построении «старых» треугольников А ^ , А к+1 и т. д. могли быть использованы граничные ребра 9 1 [/] , 9 2 [/] . Теперь эти ребра снова должны стать граничными. Это достигается так: просматриваем массивы 9 1 [/] , 9 2 [/] , и если при некотором / верно 1 / < к и /г[/] к , то полагаем /г[/] = 0 — теперь при построении треугольника А- t , где t к , сторону с номерами вершин 9 1 [/] , 9 2 [/] можно будет использовать при построении треугольников А - , где t к .

Полагаем j = /(п 1 [к],п 2 [к],п 3 [к]) .

Если j >  0 , то идем на пункт (3).

  • (В противном случае) к уменьшаем на 1 .

Если к >  1 , то идем на пункт (8).

Полагаем j = /(п 1 [к],п 2 [к],п 3 [к]) .

Если j >  0 , то идем на пункт (8).

  • (В противном случае) выдаем общее число кtr найденных триангуляций и завершаем работу.

Список литературы Метод цепей для организации хранения многомерных триангуляций

  • Делоне, Б. Н. О пустой сфере. К мемуару Георгия Вороного/Б. Н. Делоне; пер. с фр.: А. Ю. Игумнов//Записки семинара «Сверхмедленные процессы». -2005. -Вып. 1. -С. 147-153.
  • Скворцов, А. В. Алгоритмы построения и анализа триангуляции/А. В. Скворцов, Н. С. Мирза. -Томск: Изд-во Томск. ун-та, 2006. -168 с.
  • Ajtai, М. Crossing-free subgraphs/M. Ajtai, V. Chvátal, M. M. Newborn, E. Szemerédi//Annals Discrete Math. -1982. -№ l2. -P. 9-12.
  • De Floriani, L. Compressing Triangulated Irregular Networks/L. De Floriani, P. Magillo, E. Puppo//Geoinformatica. -2000. -V. 1, № 4. -P. 67-88.
  • Delaunay, В. N. Sur la sphere vide. Â la memoire de Georges Voronoi/B. N. Delaunay//Изв. АН СССР. -1934. -№ 6. -C. 793-800.
  • Denny, M. О. Encoding a triangulation as a permutation of its point set/M. O. Denny, C. Â. Sohler//Proc. 9th Canadian Conf. on Computational Geometry. -1997. -P. 39-43.
  • Pólya, G. On picture-writing/G. Polya//The American Mathematical Monthly. -1956. -№ 63. -P. 689-697.
  • Santos, F. A better upper bound on the number of triangulations of a planar point set/F. Santos, R. Seidel//J. Combinat. Theory, Ser. A. -2003. -№ 102. -P. 186-l93.
  • Seidel, R. On the number of triangulations of planar point sets/R. Seidel//Combinatorica. -1998. -№ 18. -P. 297-299.
  • Sharir, M. Random triangulations of planar point sets/M. Sharir, E. Welzl//Proc. 22nd Ann. ÂCM Symp. on Computational Geometry. -2006. -P. 273-281.
  • Smith, W. S. Studies in Computational Geometry Motivated by Mesh Generation: Ph.D. Thesis/W. S. Smith. -Princeton University, 1989. -488 p.
Еще
Статья научная