+ All Categories
Home > Documents > Диплом Дубов на...

Диплом Дубов на...

Date post: 25-Feb-2020
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
29
Transcript
Page 1: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает
Page 2: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Реферат

Выпускная квалификационная работа, 27 с., 16 рис., 1 табл., 1 листинг, 7 источников.

ТРИАНГУЛЯЦИЯ, ТРЕХМЕРНАЯ ТРИАНГУЛЯЦИЯ ДЕЛОНЕ, ИТЕРАТИВНЫЙ АЛГОРИТМ , ДИНАМИЧЕСКОЕ КЭШИРОВАНИЕ , ЛОКАЛЬНОЕ ПЕРЕСТРОЕНИЕ.

Объектом исследования является алгоритмы построения трехмерной триангуляции Делоне.

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

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

Z2

Page 3: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Содержание

Введение 4 ..............................................................................................................................

1. Обзор алгоритмов триангуляции 5 ...................................................................................

1.1 Двумерные алгоритмы 5 .............................................................................................

1.2 Трехмерные алгоритмы 8 ...........................................................................................

2. Описание предлагаемого алгоритма 11 ...........................................................................

2.1 Структура хранения данных 12 .................................................................................

2.2 Построение суперструктуры 12 .................................................................................

2.3 Локализация точки 13 .................................................................................................

2.4 Локальная проверка условия Делоне 14 ...................................................................

2.5 Локальное перестроение 16 .......................................................................................

2.6 Поддержание целостности кэша 17 ..........................................................................

3. Реализация алгоритма 19 ..................................................................................................

4. Усовершенствование алгоритма 23 ..................................................................................

5. Результаты 25 .....................................................................................................................

Заключение 27 ........................................................................................................................

Список использованных источников 28..............................................................................

Z3

Page 4: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Введение

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

Z4

Page 5: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

1. Обзор алгоритмов триангуляции

1.1 Двумерные алгоритмы

Для начала разберем задачу построения двумерной триангуляции Делоне. Основные определения: “Триангуляцией называется планарный граф, все внутренние области которого являются треугольниками. Выпуклой триангуляцией называется такая триангуляция, для которой минимальный многоугольник, охватывающий все треугольники, будет выпуклым. Говорят, что триангуляция удовлетворяет условию Делоне, если внутрь окружности, описанной вокруг любого построенного треугольника, не попадает ни одна из заданных точек триангуляции. Триангуляция называется триангуляцией Делоне, если она является выпуклой и удовлетворяет условию Делоне” [1] Эта задача решена многочисленными способами, самые распространенные и эффективные собраны в [1]. Среди всех алгоритмов выделяется группа алгоритмов, которые основаны на последовательном добавлении точек в триангуляцию и перестроениях. Такие алгоритмы называют итеративными, они просты в понимании и реализации, а также быстро работают. Общий ход простого итеративного алгоритма для каждой точки можно описать тремя шагами:

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

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

Рис. 1 Суперструктура теугольник Z5

Page 6: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Локализацию точки алгоритмически проще всего проводить с помощью метода «переход через разделяющее ребро» (рис.2). Этот метод представляет из себя последовательную проверку расположения искомой точки и точки внутри текущего треугольника относительно каждого его ребра, а точнее прямой содержащей это ребро. Если точки находятся по разные стороны от прямой, то выполняется переход к соседнему треугольнику, лежащему за соответствующим ребром. Если же все ребра проверены а переход не выполнен, значит точка лежит внутри текущего треугольника. Стоит отметить, что при не выполнении условия Делоне на триангуляции такой метод может зацикливаться.

Рис. 2 Локализация точки методом «переход через разделяющее ребро»

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

Рис. 3 Проверка условия Делоне через сумму противолежащих углов

При невыполнении условия Делоне на двух треугольниках делается их перестроение, путем замены смежного ребра на другое, как показано на рис. 4. Затем условие Делоне проверяется заново для перестроенных треугольников и их соседей.

Z6

Page 7: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Рис. 4 Локальное перестроение двух треугольников

Существует множество оптимизаций простого итеративного алгоритма, основанных на ускорении локализации точки. Одной из лучших является алгоритм с динамическим кэшированием поиска. Он берет за идею более простое разбиение пространства, обычно на квадратные ячейки. Каждая ячейка имеет указатель на какой-то из построенных треугольников, таким образом, позволяя за O(1) находить треугольник близкий к искомому. Ячейка определяется из координат текущей точки. Затем проводится последовательный переход по треугольникам от того, на который указывает ячейка кэша, к искомому и замена указателя в ячейке на указатель на него. Динамическое кэширование подразумевает расширение кэша при достижении определенного числа точек в триангуляции. Однако существует итеративный алгоритм, использующий другую систему перестроений, это алгоритм «Удаляй и строй». Он отличается тем, что после локализации точки выполняется поиск и удаление из триангуляции всех треугольников, в описанную сферу которых попадает данная точка. В результате образуется многоугольник-полость, затем данная точка соединяется ребрами со всеми точками, образующими данный многоугольник. Получившаяся триангуляция является триангуляцией Делоне и не требует дополнительных проверок и перестроений. Одна итерация алгоритма представлена на рис. 5.

Рис. 5 Итерация алгоритма «Удаляй и строй»

На основе этой информации разберем трехмерный вариант триангуляции.

Z7

Page 8: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

1.2 Трехмерные алгоритмы

По аналогии с двумерным вариантом триангуляцией в пространстве называют набор непересекающихся тетраэдров, вершинами которых являются заданные точки, а также объединении этих тетраэдров полностью заполняет выпуклый многогранник, образованный точками. Условие Делоне имеет вид: внутрь сферы описанной вокруг любого тетраэдра триангуляции не должна попадать ни одна из заданных точек. Двумерная триангуляция Делоне обладает рядом свойств, которые не присущи трехмерной, например, максимизация минимальных углов.[1,2] Таким образом, проверка условия Делоне через сумму противолежащих углов, как описано в [1], становится невозможной. Для трехмерной триангуляции были предложены аналоги локального перестроения [2, 3]. Они представляют из себя перестроение двух тетраэдров в три, с помощью вставки нового ребра, как показано на рис. 6. Также эта операция имеет обратное преобразование из трех тетраэдров в два.

Рис. 6 Локальное перестроение двух тетраэдров в три

В [2] описан и математически обоснован алгоритм построения триангуляции Делоне, с помощью локальных перестроений, приведем основные определения, леммы и теоремы без доказательств. Обозначим abc|de - пара смежных тетраэдров abcd, abce с общей гранью abc и вершинами d и e лежащими по разные стороны от abc. Допустим, что никакие 4 точки не лежат на одной плоскости, тогда смежные тетраэдры могут быть трех видов, рис. 7: 1) abcde - выпуклый шестигранник, т.е. de пересекает грань abc 2) de не пересекает грань abc, тогда возможны три равносильных варианта ab пересекает cde, bc пересекает ade, или ac пересекает bde. Для дополнения до

Z8

Page 9: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

выпуклого шестигранника нужен еще один тетраэдр, соответственно abde, bcde или acde. 3) одна из точек смежной грани лежит внутри выпуклой оболочки остальных четырех точек, т.е. если это точка с, то до выпуклой оболочки необходимо добавить два тетраэдра acde, bcde

1) 2) 3) Рис. 7 Виды смежных тетраэдров

Определение 1. Пусть существует abc|de, тогда abc называют локально-оптимальной гранью, если внутрь описанной сферы вокруг тетраэдра abcd не попадает вершина e (при этом гарантированно вершина d не попадает в описанную сферу вокруг abce). Теорема 1. Триангуляция является Делоне тогда и только тогда, когда все ее внутренние грани локально-оптимальны. Определение 2. Пусть существует abc|de, тогда abc называют трансформируемой гранью, если abc|de является парой первого вида, или если второго, при условии существования дополняющего тетраэдра в триангуляции. При его отсутствии грань называют не трансформируемой. Определение 3. Триангуляцию T называют псевдо-локально оптимальной, если каждая из внутренних не локально-оптимальных граней является также не трансформируемой (остальные грани являются локально-оптимальными) Определение 4. Пусть существует abc|de, abc - не локально-оптимальная не трансформируемая грань, ребро ab пересекает cde, тогда пару abc|de называют NLONT-конфигурацией (NonLocally Optimal NonTransformable). Пусть Z - последовательность NLONT-конфигураций, тогда С - соединенная NLONT-последовательность, если для каждой пары рядом стоящих конфигураций верно, что общие грани не совпадают, но имеют хотя бы одну совпадающую точку. Если Z , то С - соединенный NLONT-цикл.

C = [a0b0c0 | d0e0,a1b1c1 | d1e1,...,ambmcm | dmem ]

a0b0c0 | d0e0 = ambmcm | dmem

Z9

Page 10: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Лемма 1. Пусть Т - не Делоне триангуляция, тогда если Т - псевдо-локально оптимальная триангуляция, то Т содержит NLONT-цикл. Теорема 2 . Каждая не Делоне триангуляция может быть трансформирована в псевдо -локально оптимальную, путем конечного числа локальных трансформаций не локально-оптимальных внутренних граней. Следствие 1. Пусть Z - не Делоне триангуляция, и Z - последовательность триангуляций, где только Z является псевдо-локально оптимальной, а также каждая из триангуляций получена из предыдущей в последовательности путем одной локальной трансформации не локально-оптимальной грани. Если Z не содержит NLONT-цикла, тогда она является триангуляцией Делоне. В [2] описан алгоритм построения триангуляции Делоне или близкой к ней. Этот алгоритм основан на последовательном присоединении новых тетраэдров к триангуляции и локальных перестроений. Каждая взятая точка гарантированно лежит вне построенной триангуляции, т.к. все точки отсортированы по координатам в лексикографическом порядке. Предполагается и проверено на практике, что такой алгоритм строит триангуляцию Делоне в большинстве случаев. В [4, 3] описан алгоритм, основанный на идеях Д. Уотсона [5]. Он представляет собой итеративный алгоритм, где каждая взятая точка сначала локализуется, т.е. находится содержащий ее тетраэдр, затем удаляется из триангуляции все тетраэдры, в описанные сферы которых попадает данная точка. Это делается с помощью переходов к соседним тетраэдрам через грани при удалении тетраэдра. В результате образуется полость, имеющая звездообразную форму. Затем соединяются все точки, из которых состоит эта полость, с данной точкой.

T0 T0,T1,...,TmTm

Tm

Z10

Page 11: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

2. Описание предлагаемого алгоритма

Основываясь на математических выкладках [2] можно предположить, что простой итеративный алгоритм построения двумерной триангуляции [1], переосмысленный в трехмерном варианте, должен также давать в результате триангуляцию Делоне. При использовании суперструктуры, алгоритм будет иметь следующий вид: 1. Локализуем очередную точку множества, т.е. находим тетраэдр, внутри которого она находится. 2. Если точка попала на узел триангуляции, то она отбрасывается, если попала точно внутрь тетраэдра, то он разбивается на четыре новых. 3. Проводятся локальные проверки для новых и смежных с ними тетраэдров, а также перестроения при невыполнении условия Делоне. Также для упрощения первого шага алгоритма можно ввести кэш поиска. Кэш представляет из себя трехмерную квадратную сетку, где каждая ячейка указывает на какой-то тетраэдр триангуляции. При взятии новой точки сначала вычисляется ячейка кэша, в которую она попадает, затем делается переход к тетраэдру указанному в ячейке, а затем последовательные переходы от соседа к соседу до тех пор, пока не обнаружится тетраэдр, содержащий взятую точку. После этого в соответствующей ячейке кэша меняется указатель на найденный тетраэдр. Такой подход позволяет значительно сократить количество итераций на поиск тетраэдра на большом количестве точек, однако, чтобы повысить эффективность работы алгоритма, пока кэш не заполнен актуальными указателями, предлагается использовать динамически расширяющийся кэш. Такой кэш изначальной имеет размер 2х2х2. Затем при каждом достижении определенного числа точек в триангуляции Z , где r - коэффициент роста динамического кэша, нужно расширять в 2 раза по каждой оси, при этом переписывать информацию из старого кэша в новый таким образом: h - старый кэш, h’ - новый

Z .

Использование динамического кэширования позволяет эффективно оптимизировать простой итеративный алгоритм на любом количестве точек, заранее не зная их числа.

n = rm3

∀i, j,k = 0,m −1:h '2i,2 j ,2k ,h '2i+1,2 j ,2k ,h '2i,2 j+1,2k ,h '2i+1,2 j+1,2k ,h '2i,2 j ,2k+1,h '2i+1,2 j ,2k+1,h '2i,2 j+1,2k+1,h '2i+1,2 j+1,2k+1 = hi, j ,k

Z11

Page 12: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Для упрощения разбора и реализации алгоритма, его можно разбить на следующие подзадачи:

1. Структура хранения данных 2. Построение суперструктуры 3. Локализация точки 4. Локальная проверка условия Делоне 5. Локальное перестроение 6. Поддержание целостности кэша

2.1 Структура хранения данных

В качестве структуры данных выбран вариант аналогичный двумерному «Узлы и треугольники» - «Узлы и тетраэдры», как самый простой для понимания и реализации. Такая структура подразумевает две сущности. Первая - точка, которая содержит в себе только свои координаты. Вторая - тетраэдр, который имеет массив указателей на точки-вершины, а также массив указателей на соседние тетраэдры. Соседи упорядочены в массиве в таком порядке: пусть Z - индекс соседнего тетраэдра в массиве, тогда точки-вершины, образующие грань, за которой лежит сосед, лежат в массиве вершин под индексами - Z , таким образом вершина тетраэдра, не образующая эту грань лежит под индексом Z . Такой порядок позволяет упростить некоторые аспекты алгоритма.

2.2 Построение суперструктуры

В качестве суперструктуры был выбран правильный тетраэдр содержащий в себе все заданные точки как на рис. 8. Допустим все точки лежат в кубе (0,0,0) - (s,s,s), где s - длина ребра куба.

Рис. 8 Суперструктура правильный тетраэдр

i

i,(i +1)mod4,(i + 2)mod4

(i + 3)mod4

Z12

Page 13: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Описанная сфера вокруг куба будет являться вписанной для тетраэдра. Тогда получим координаты вершин тетраэдра: сначала высчитаем радиус описанной сферы вокруг куба (вписанной в тетраэдр)

Z , тогда радиус сферы описанной вокруг правильного

тетраэдра:

Z , центр сферы точка Z .

Пусть а - длина ребра тетраэдра, тогда высоты грани и тетраэдра соответственно равны

Z , по теореме Пифагора получим ребро

Z , тогда Z .

Обозначим координаты вершин тетраэдра: Z , тогда

Z

Получим полную формулу координат вершин тетраэдра

Z

2.3 Локализация точки

По аналогии с двумерным алгоритмом локализации «переход через разделяющее ребро» был взят «переход через разделяющую грань». Суть этого метода в том, что берется точка внутри текущего тетраэдра, и относительно каждой грани проверяется расположение взятой точки и искомой. Если они лежат по разные стороны от плоскости, содержащей эту грань, значит делаем переход к соседнему тетраэдру за этой гранью. Таким образом, для этой проверки нам нужно вычислить уравнение плоскости, содержащей грань, по трем точкам-вершинам, а затем подставить в

r = s2 + s2 + s2

2= s 3

2

R = 3r O( s2, s2, s2)

h = a2 − 14a2 = a 3

2,H = r + R = 4r = 2 3s

H 2 = a2 − (23h2 ) = a2 − 1

3a2 = 2

3a2,a = 6

2H = s 2 ⋅3 2

2= 3 2s h = 3 6

2s

ABCD = {(x0, y0, z0 ),(x1, y0, z0 ),(x2, y0, z1),(x2, y1, z2 )}

x0 =s2− a2= s1− 3 2

2, x1 =

s2+ a2= s1+ 3 2

2, x2 =

s2,

z0 =s2− 13h = s1− 6

2, z1 =

s2+ 23h = s1+ 2 6

2, z2 =

s2,

y0 =s2− r = s1− 3

2, y1 =

s2+ R = s1+ 3 3

2

ABCD =

{(s1− 3 22

, s1− 32

, s1− 62

),(s1+ 3 22

, s1− 32

, s1− 62

),( s2, s1− 3

2, s1+ 2 6

2),( s2, s1+ 3 3

2, s2)}

Z13

Page 14: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

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

Z , расписав определитель, получим

Z

вынесем за скобки множители содержащие Z , тогда

Z => Z (1)

теперь проведем замены и раскроем скобки: Z => Z (2) наконец, после того как мы получили все коэффициенты общего уравнения плоскости, можно подставить в него координаты точек: Z , итак, если Z иZ разных знаков, значит точки лежат по разные стороны от плоскости, и требуется делать переход к соседнему тетраэдру через эту грань. Когда для каждой грани тетраэдра Z иZ одного знака, тогда искомая точка лежит внутри проверяемого тетраэдра, и поиск завершен.

2.4 Локальная проверка условия Делоне

Проверку условия Делоне на двух тетраэдрах проще всего выполнять, вычисляя центр и радиус описанной вокруг тетраэдра сферы. Составим систему уравнений, исходя из того факта, что центр описанной сферы равноудален от всех вершин тетраэдра: Пусть тетраэдр ABCD имеет центр описанной сферы Z , тогда

(x1, y1, z1),(x2, y2, z2 ),(x3, y3, z3)

(x4 , y4 , z4 ) (x0, y0, z0 )

Ax + By +Cz + D = 0

x − x1 y − y1 z − z1x2 − x1 y2 − y1 z2 − z1x3 − x1 y3 − y1 z3 − z1

= 0

(x − x1)(y2 − y1)(z3 − z1)+ (x3 − x1)(y − y1)(z2 − z1)+ (x2 − x1)(y3 − y1)(z − z1)−−(x − x1)(y3 − y1)(z2 − z1)− (x2 − x1)(y − y1)(z3 − z1)− (x3 − x1)(y2 − y1)(z − z1) = 0

x, y, z(x − x1)[(y2 − y1)(z3 − z1)− (y3 − y1)(z2 − z1)]++(y − y1)[(x3 − x1)(z2 − z1)− (x2 − x1)(z3 − z1)]++(z − z1)[(x2 − x1)(y3 − y1)− (x3 − x1)(y2 − y1)]= 0

A = (y2 − y1)(z3 − z1)− (y3 − y1)(z2 − z1)B = (x3 − x1)(z2 − z1)− (x2 − x1)(z3 − z1)C = (x2 − x1)(y3 − y1)− (x3 − x1)(y2 − y1)

Ax + By +Cz − (Ax1 + By1 +Cz1) = 0 D = −(Ax1 + By1 +Cz1)

s = Ax4 + By4 +Cy4 + D, s0 = Ax0 + By0 +Cy0 + D s s0

s s0

O(xo, yo, zo )

Z14

Page 15: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Z , где R - радиус описанной сферы

путем преобразований описанных в [6] получим радиус и координаты:

Z

Z

Z

Z

Для уменьшения количества выполняемых математических операций, можно вычислить каждый элемент матрицы отдельно, а затем только вычислять определители из полученных чисел. Таким образом, получится 60 операций */ и 54 +-, для вычисления координат центра. Также имеет смысл сохранять центр и радиус описанной сферы тетраэдра после первого вычисления.

(xo − xa )2 + (yo − ya )

2 + (zo − za )2 = R2

(xo − xb )2 + (yo − yb )

2 + (zo − zb )2 = R2

(xo − xc )2 + (yo − yc )

2 + (zo − zc )2 = R2

(xo − xd )2 + (yo − yd )

2 + (zo − zd )2 = R2

⎨⎪⎪

⎩⎪⎪

R = (xo − xa )2 + (yo − ya )

2 + (zo − za )2

xo =

xd2 − xa

2 + yd2 − ya

2 + zd2 − za

2 yd − ya zd − zaxd2 − xb

2 + yd2 − yb

2 + zd2 − zb

2 yd − yb zd − zbxd2 − xc

2 + yd2 − yc

2 + zd2 − zc

2 yd − yc zd − zc

2 ⋅xd − xa yd − ya zd − zaxd − xb yd − yb zd − zbxd − xc yd − yc zd − zc

yo =

xd − xa xd2 − xa

2 + yd2 − ya

2 + zd2 − za

2 zd − zaxd − xb xd

2 − xb2 + yd

2 − yb2 + zd

2 − zb2 zd − zb

xd − xc xd2 − xc

2 + yd2 − yc

2 + zd2 − zc

2 zd − zc

2 ⋅xd − xa yd − ya zd − zaxd − xb yd − yb zd − zbxd − xc yd − yc zd − zc

zo =

xd − xa yd − ya xd2 − xa

2 + yd2 − ya

2 + zd2 − za

2

xd − xb yd − yb xd2 − xb

2 + yd2 − yb

2 + zd2 − zb

2

xd − xc yd − yc xd2 − xc

2 + yd2 − yc

2 + zd2 − zc

2

2 ⋅xd − xa yd − ya zd − zaxd − xb yd − yb zd − zbxd − xc yd − yc zd − zc

Z15

Page 16: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

2.5 Локальное перестроение

Как уже говорилось ранее, локальное перестроение бывает двух видов: из двух тетраэдров в три и наоборот. Первое применяется, когда смежные тетраэдры являются парой первого вида рис. 9. В таком случае появляется новое ребро de, тетраэдр abcd преобразуется в abde, abce в acde, а также появляется новый тетраэдр bcde.

Рис. 9 Смежные тетраэдры первого вида

Перестроение второго вида применяется, когда смежные тетраэдры являются парой второго вида и при этом имеют общего соседа как на рис. 10. При этом тетраэдр abde преобразуется в abcd, acde в abce, а также удаляется тетраэдр bcde.

Рис. 10 Смежные тетраэдры второго вида

Если смежные тетраэдры являются парой второго вида и не имеют общего соседа, то их перестроить невозможно. В таком случае нужно сохранить указатели на оба этих тетраэдра для того, чтобы проверить условие Делоне и возможность перестроения позже. Так как при перестроении первого вида смежные тетраэдры также не имеют общего соседа, нужно разделять эти случаи. Для того, чтобы выяснить какой случай мы имеем, требуется определить пересекает ли отрезок de грань abc, если да, то это первый случай, если нет то последний. Для этого сначала нужно найти точку p пересечения прямой, содержащей отрезок de, и плоскости, содержащей грань abc, а затем определить

Z16

Page 17: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

лежит ли эта точка внутри треугольника abc. Это можно сделать, посчитав площадь abc и сумму площадей abp, acp, bcp, и сравнить получившиеся числа. Если они равны, то точка лежит внутри треугольника, а значит мы имеем первый случай, а если нет, то последний. Для начала получим общее уравнение плоскости по трем точкам по формулам (1) и (2), затем направляющий вектор прямой и смещение: Z

Z , теперь получим точку пересечения прямой и плоскости

Z

для нахождения площадей треугольников воспользуемся формулой Герона:

Z , где Z (3), итак мы проверяем равенство

Z , где

Z

Z

2.6 Поддержание целостности кэша

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

xs = xd − xe, ys = yd − ye, zs = zd − ze

t = − Axe + Bye +Cze + DAxs + Bys +Czs

xp = xe + xs ⋅ t, yp = ye + ys ⋅ t, zp = ze + zs ⋅ t

S = p(p − a)(p − b)(p − c) p = a + b + c2

S0 = S1 + S2 + S3

S0 = p0 (p0 − dab )(p0 − dac )(p0 − dbc ), p0 =dab + dac + dbc

2

S1 = p1(p1 − dab )(p1 − dap )(p1 − dbp ), p1 =dab + dap + dbp

2

S2 = p2 (p2 − dbp )(p2 − dcp )(p2 − dbc ), p2 =dap + dcp + dbc

2

S3 = p3(p3 − dap )(p3 − dac )(p3 − dcp ), p3 =dap + dac + dcp

2

dab = (xa − xb )2 + (ya − yb )

2 + (za − zb )2 ,dap = (xa − xp )

2 + (ya − yp )2 + (za − zp )

2

dbc = (xb − xc )2 + (yb − yc )

2 + (zb − zc )2 ,dbp = (xb − xp )

2 + (yb − yp )2 + (zb − zp )

2

dac = (xa − xc )2 + (ya − yc )

2 + (za − zc )2 ,dcp = (xc − xp )

2 + (yc − yp )2 + (zc − zp )

2

Z17

Page 18: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

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

Z18

Page 19: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

3. Реализация алгоритма

Для реализации алгоритма был выбран язык С++, т.к. он имеет высокую скорость выполнения операций и не очень сложен в использовании, а также имеет поддержку ООП. Была спроектирована и реализована архитектура классов, как показано на рис. 11:

Рис. 11 Диаграмма классов

Класс Point описывает точку в пространстве, имеет три поля вещественных координат и целочисленный индекс. Класс CachePoint описывает ссылку на ячейку кэша и содержит её целочисленные координаты. Класс Tetrahedron описывает тетраэдр, имеет массивы для хранения указателей на точки-вершины и соседей, также имеет динамический массив обратных ссылок на кэш и целочисленный индекс. Объект этого класса имеет ряд методов: • delone() - метод для проверки выполнения условия Делоне на двух тетраэдрах. При выполнении возвращает NULL, при невыполнении определяет какого вида смежные тетраэдры и проверяет возможность перестроения, после чего делает перестроение, если это возможно, иначе возвращает указатель на себя. При перестроении первого типа возвращает новый тетраэдр с индексом «-1»,

Z19

Page 20: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

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

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

• findNghbr() - вспомогательный метод, возвращает указатель на соседний тетраэдр, лежащий через грань, образованную передаваемыми точками

• replaceNghbr() - вспомогательный метод, заменяет у текущего тетраэдра указатель на одного соседа указателем на другого.

• splitByPoint() - метод, который разбивает текущий тетраэдр на 4 новых по переданной точке. Возвращает массив указателей на новые тетраэдры, где первым является перестроенный текущий тетраэдр.

• removeCacheReference() - метод, который удаляет из массива обратных ссылок на кэш переданную ячейку.

• calculateCenter() - метод, который вычисляет если необходимо координаты центра описанной сферы, ее радиус и сохраняет в поля объекта.

Класс Triangulation описывает текущее состояние триангуляции. Объект этого класса содержит указатели на все точки и построенные тетраэдры, указатель на кэш (трехмерный массив указателей на треугольники) и целочисленный размер кэша по одной оси. Также имеется множество указателей на тетраэдры, которые не удовлетворяют условию Делоне и их не удалось перестроить. Методы: • doubleCache() - метод, который создает кэш, увеличенный в два раза по каждой оси, переписывает информацию из старого кэша в новый, а также меняет обратные ссылки у тетраэдров кэше в соответствии с расположением в новом кэше.

• addToCache() - метод, который заменяет в указанной ячейке кэша указатель на тетраэдр указателем на переданный тетраэдр, а также удаляет и добавляет обратную ссылку на ячейку кэша старому и новому тетраэдру соответственно. Изменения в кэше следует производить только с помощью этого метода.

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

Z20

Page 21: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

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

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

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

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

• bruteCheck() - вспомогательный метод не относящийся к алгоритму. Он проверяет условия Делоне путем полного перебора, т.е. для каждого построенного тетраэдра триангуляции проверяет попадение внутрь описанной вокруг него сферы каждой точки. Возвращает false при нарушении условия хотя бы для одной пары тетраэдр-точка, иначе возвращает true. Используется для проверки триангуляции после полного построения.

Для визуального отображения результата была использована программа Gmsh[7]. Эта программа позволяет отображать трехмерные объекты, такие как точки, отрезки, грани и объемы, для этого нужно сформировать текстовый файл с расширением «.geo» и записать все, что нужно отобразить на специальном языке. Затем этот файл можно открыть в программе, и она отрисует все объекты, которые там указаны. Пример файла (листинг 1) и соответствующего отображения (рис. 12) представлены ниже. Для ввода данных для триангуляции и формирования выходного файла реализован класс Inouter. Он спроектирован так, чтобы объект класса Triangulation мог делать вывод в файл текущей триангуляции на любом шаге алгоритма, при этом детали вывода от него скрыты.

Z21

Page 22: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Листинг 1lc = 1e-2; Point(0) = {0.0, 0.0, 0.0, lc} ; Point(1) = {0.0, 0.0, 1.0, lc} ; Point(2) = {0.0, 1.0, 0.0, lc} ; Point(3) = {0.0, 1.0, 1.0, lc} ; Point(4) = {1.0, 0.0, 0.0, lc} ;

//Tetrahedron(1) Line(1) = {2,0}; Line(2) = {2,1}; Line(3) = {2,4}; Line(4) = {0,1}; Line(5) = {0,4}; Line(6) = {1,4};

//Tetrahedron(2) Line(21) = {2,1}; Line(22) = {2,4}; Line(23) = {2,3}; Line(24) = {1,4}; Line(25) = {1,3}; Line(26) = {4,3};

Рис. 12 Пример отображения программы Gmsh

Z22

Page 23: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

4. Усовершенствование алгоритма

После того, как алгоритм был реализован, он был проверен на различных размерах поля генерации, количестве точек и их характере. Так на случайно размещенных точках алгоритм стабильно обрабатывал порядка 10000 точек, увеличение количества приводило к зацикливанию алгоритма. Также регулярное размещение точек, т.е. через равные промежутки вдоль каждой оси, также приводило к зацикливанию. После анализа данных ситуаций, был сделан вывод, что зацикливание возникает из-за расположения более трех точек в одной плоскости, что при локальных перестроениях вызывает появление вырожденных тетраэдров, у которых все 4 вершины находятся в одной плоскости. В [2] было предложено решение этой проблемы. Для начала разберем возможные случаи, пусть имеется два смежных тетраэдра abcd и abce, у которых вершины a, b, d, e лежат в одной плоскости (рис. 13): 1) abde - выпуклый четырехугольник 2) abde - треугольник (a или b лежит на прямой de) 3) abde - невыпуклый четырехугольник

1) 2) 3) Рис. 13 Виды смежных тетраэдров при 4х точках лежащих на одной плоскости

Так как в текущем алгоритме используется суперструктура, то оба данных тетраэдра имеют соседей соответственно abdf и abeg. Итак перестроение возможно тогда и только тогда, когда abde - выпуклый четырехугольник и f = g, т.е. два соседних тетраэдра также являются смежными относительно друг друга. Оно выполняется путем замены ребра ab у всех четырех тетраэдров на de, таким образом получаются тетраэдры acde, bcde, adef, bdef. В остальных случаях перестроение невозможно и тетраэдры добавляются в множество не трансформируемых. Проверить расположение четырех точек на одной плоскости можно получив общее уравнение плоскости для каждой несмежной грани одного из

Z23

Page 24: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

тетраэдров по формулам (1,2) и подставив в него несмежную вершину другого, при выполнении равенства следует проверить то, что соседние тетраэдры смежны, т.к. это не требует вычислений. Затем при выполнении этого условия нужно определить какой случай расположения точек мы имеем. Это можно сделать посчитав сумму площадей треугольников abd, abe по формуле (3), затем сравнив их с площадями треугольников ade, bde последовательно, если сумма больше чем обе эти площади, то мы имеем первый случай, если сумма равна или меньше одной из площадей, то второй или третий случай соответственно.

Z24

Page 25: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

5. Результаты

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

Таблица 1. Сравнение времени работы алгоритмов

Как можно заметить динамическое кэширование ускоряет алгоритм, но незначительно. Вследствие этого был проведен анализ времени выполнения разных частей алгоритма, он показал, что локализация точки занимает всего 10% всего времени работы простого итеративного алгоритма, 80% отнимают локальные проверки условия Делоне и перестроения. Таким образом, можно сделать вывод о том, что именно эта часть алгоритма нуждается в оптимизации. Результаты работы алгоритма для разных наборов точек представлены на рис. 14-16

Рис. 14 Триангуляция Делоне на 10 случайно размещенных точках

Количество точек Простой итеративный, ~с С динамическим кэшированием, ~с

1 000 <1 <1

10 000 1,1 1,1

50 000 6,8 6,2

100 000 16,6 15,4

150 000 37,7 33,1

Z25

Page 26: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Рис. 15 Триангуляция Делоне на 5 случайно размещенных точках с отображением суперструктуры

Рис. 16 Триангуляция Делоне на регулярной сетке из 27 точек

Z26

Page 27: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Заключение

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

Z27

Page 28: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Список использованных источников

1. Скворцов А.В. Триангуляция Делоне и её применение. / Томск : Изд-во Том. ун-та, 2006. – 168 с.

2. B. Joe. Three-dimensional triangulations from local transformation. // SIAM J. Sci. Stat. Comput., 10(4):718-741, July 1989

3. Галанин М.П., Щеглов И.А. Разработка и реализация алгоритмов трехмерной триангуляции сложных пространственных областей: итерационные методы. Препринт ИПМ им. М.В. Келдыша РАН, 2006.

4. P. R. Cavalcanti, U. T. Mello. Three-Dimensional Constrained Delaunay Triangulation: A Minimalist Approach. // Proceedings of the 8th International Meshing Roundtable, p.p. 119-129, 1999.

5. D.F. Watson. Computing the Delaunay Tessellation with Application to Voronoi Polytopes // The Computer Journal, Vol. 24(2), p.p. 167-172, 1981.

6. Координаты центра описанной вокруг тетраэдра сферы. Радиус описанной вокруг тетраэдра сферы. [Электронный ресурс] / Владимир Фомин, [email protected]. - Электрон. дан. - Владимир Фомин, 2016. - URL: http://ateist.spb.ru/mw/center.htm (дата обращения 5.04.16)

7. Gmsh: a three-dimensional finite element mesh generator with built-in pre- and post-processing facilities. [Электронный ресурс] / GNU GPL 2.0 - Электрон. дан. - C. Geuzaine, J.-F. Remacle 1997-2015. - URL: http://gmsh.info (дата обращения 5.04.16)

Z28

Page 29: Диплом Дубов на отправкуinf.tsu.ru/library/DiplomaWorks/CompScience/2016/Dubov/...1) abcde - выпуклый шестигранник, т.е. de пересекает

Z29

Оригинальность: 95.59%

Заимствования: 2.81%

Цитирование: 1.6%

Уважаемый пользователь! Обращаем ваше внимание, что система «Антиплагиат» отвечает на вопрос, является ли тот или иной фрагмент текстазаимствованным или нет. Ответ на вопрос, является ли заимствованный фрагмент именно плагиатом, а не законной цитатой, система оставляет на вашеусмотрение.

Отчет о проверке № 1дата выгрузки: 24.05.2016 22:39:46пользователь: [email protected] / ID: 3252838отчет предоставлен сервисом «Антиплагиат»на сайте http://www.antiplagiat.ru

Информация о документе№ документа: 3Имя исходного файла: Diplom_Dubov_NI.docxРазмер текста: 1529 кБТип документа: Не указаноСимволов в тексте: 33215Слов в тексте: 4235Число предложений: 243

Информация об отчетеДата: Отчет от 24.05.2016 22:39:46 - Последний готовый отчетКомментарии: не указаноОценка оригинальности: 95.59%Заимствования: 2.81%Цитирование: 1.6%

Источники

Доля втексте

Источник Ссылка Дата Найдено в

2.71% [1] не указано http://window.edu.ru раньше 2011 года Модуль поискаИнтернет

2.11% [2]http://www.inf.tsu.ru/library/DiplomaWorks/CompScience/2004/Mirza/diplom.pdf

http://inf.tsu.ru раньше 2011 года Модуль поискаИнтернет

1.7% [3] Курсовая: "Построение триангуляции Делоне" http://westud.ru 29.03.2016 Модуль поискаИнтернет


Recommended