Лекция 1. Сетки: определения и структуры данных Высокопроизводительные методы геометрического моделирования Михаил Бессмельцев к.ф.-м.н. Ольга Нечаева Определения Графы, Планарность, Триангуляция, Делоне , Сетки Graphs Графы Сетка – это частный случай неориентированного графа G = <V, E> A V – вершины (A,B,…) E – ребра (AB, BC, …) Цикл – например, AJLCB H Степень вершины – кол-во ребер, инцидентных вершине deg(B) = 3, deg(K) = 4 Грань – цикл без ребер/вершин внутри B C L J D I K E F G Planar Graphs Планарные графы Граф планарный, если его можно нарисовать на плоскости без пересечений B D A C Любой планарный граф можно нарисовать так, чтобы все ребра были прямыми Planar Graphs Планарные графы Граф планарный, если его можно нарисовать на плоскости без пересечений B B D A D A C C Любой планарный граф можно нарисовать так, чтобы все ребра были прямыми Planar Graphs Планарные графы Граф планарный, если его можно нарисовать на плоскости без пересечений B B B D A D D A A C C C Любой планарный граф можно нарисовать так, чтобы все ребра были прямыми Триангуляция Триангуляция – планарный граф с прямыми ребрами, все грани которого – треугольники. Триангуляция – разбиение исходного множества точек на треугольники (непересекающиеся) (вершины треугольников – точки множества) Триангуляций множества точек может быть много. Триангуляция Делоне Триангуляция Делоне – хорошая триангуляция. Триангуляция является ~ Делоне, если внутри описанной окружности любого треугольника нет вершин триангуляции (точек). В 2D для данного множества точек триангуляция Делоне существует (возможно, не одна). Meshes Сетки Сетка – граф с прямыми ребрами в R3. Граничные ребра – ребра, содержащиеся ровно в одном треугольнике. Обычные ребра – ребра, содержащиеся ровно в 2х треугольниках. Сингулярные ребра – > 2 треугольников. A B C L J M D I H E K F G Замкнутая сетка – сетка без граничных ребер. Manifold mesh (многообразия) – сетка без сингулярных ребер. Planar graphs & meshes Планарные графы и сетки Любая сетка многообразия является планарной! (почти) Сеточные структуры данных Где и как используются структуры данных для сеток? Где и как используются структуры данных для сеток? Для рендеринга (отрисовки) Для обработки/вычислений: Вопросы типа Операции Какие вершины у треугольника номер ##? Смежны ли вершины i и j? Какие соседи у треугольника ##? Вставить/удалить треугольник Вставить/удалить вершину Сделать общую универсальную структуру данных маловероятно Чем отличаются структуры данных? Временная сложность создания Временная сложность изменения Временная сложность ответа на вопросы про соседей/смежность Простота самой структуры (важно для портирования/распараллеливания) Ёмкостная сложность (точнее, сколько занимает памяти эта структура) Список граней (треугольников) GeomPrimitives::TriangulationData Структура состоит из: Списка координат вершин Списка треугольников TriangulationData::getAllPoints(); // возвращает все вершины TriangulationData::getPoint (i); TriangulationData::getAllTriangles(); TriangulationData::getTriangle(i); Ответ на вопрос «Какие вершины у треугольника номер ##» занимает O(1) Ответ на вопрос, смежны ли вершины i и j, занимает O(|E|) – неэффективно Список граней - пример v6 v3 f3 v1 вершина координаты v1 (x1,y1,z1) v2 (x2,y2,z2) v3 (x3,y3,z3) v4 f1 f2 v4 f4 v5 v2 грань вершины f1 (v1, v2, v3) f2 (v2, v4, v3) (x4,y4,z4) f3 (v3, v4, v6) v5 (x5,y5,z5) f4 (v4, v5, v6) v6 (x6,y6,z6) Список граней: плюсы и минусы Удобная и простая Эффективная (занимает мало памяти) Универсальная (нет ограничений на дырки или сингулярные ребра) Слишком простая: нет дополнительной информации вроде соседей треугольника Adjacency Matrix Матрица смежности Матрица смежности может задавать, вообще говоря, произвольный граф Пусть у нас есть n вершин. Матрица смежности – матрица n*n {ei,j}: ei,j = true, если вершины i и j смежны. ei,j = false, else. Кроме самой матрицы, нужно хранить список координат вершин Дополнительно храним треугольники – тройки номеров Adjacency Matrix : example Матрица смежности: пример vertex coordinate v1 (x1,y1,z1) v2 (x2,y2,z2) v3 (x3,y3,z3) v4 (x4,y4,z4) v5 (x5,y5,z5) v6 (x6,y6,z6) face vertices (ccw) f1 (v1, v2, v3) f2 (v2, v4, v3) f3 (v3, v4, v6) f4 (v4, v5, v6) v6 v3 f3 f1 v1 f2 f4 v4 v5 v2 v1 v1 v2 1 v3 1 v4 v2 v3 1 1 1 1 1 v5 1 1 1 1 1 v6 1 1 v5 v6 v4 1 1 1 1 Матрица смежности: эффективность Какие вершины в треугольнике ##? O(1) – посмотреть соотв. элемент списка треугольников Смежны ли вершины i и j? O(1) – проверить соответствующий элемент в матрице. В каких треугольниках содержится вершина i? O(|Faces|) – придется пробежать все грани/треугольники Adjacency Matrix : pros and cons Матрица смежности: плюсы и минусы Любые вопросы о смежности отвечаются мгновенно – O(1) Универсальная Расходуется слишком много памяти (|V|2). Редко применяется для сеток, скорее с её помощью описывают графы, близкие к полным (|E|≈|V|2). По вершине сложно найти треугольник Half-Edge structure Полуреберная структура Для каждой вершины храним Координаты Указатель на какое-нибудь «полуребро», началом которого является эта вершина next(e) IncFace(e) e prev(e) twin(e) origin(e) Для каждого треугольника храним Указатель на какое-нибудь «полуребро» этого треугольника Half-Edge structure Полуреберная структура Полуребро – это next(e) IncFace(e) e prev(e) twin(e) origin(e) 1. 2. 3. 4. Указатель на начало: origin(e) Указатель на двойственное полуребро - twin(e) Указатель на треугольник, которому оно принадлежит – IncidentFace(e) (положительный обход контура) Указатели на следующее и предыдущее полуребра в треугольнике – next(e) и prev(e) Half-Edge structure: Efficiency Полуреберная структура: Эффективность Большинство операций выполняются за O(1) Основные операции: Пробежать по границе (ребра+вершины) какого-то треугольника Пробежать все ребра, инцидентные v Half-Edge structure: Example Полуреберная структура: Пример v3 e1,1 v1 e6,1 e4,1 f1 e2,1 e3,1 v6 e3,2 e4,2 f3 e7,1 e7,2 f2 e5,1 e8,1 v4 e9,1 f4 v5 v2 Vertex coordinate Incident Edge v1 (x1,y1,z1) e2,1 v2 (x2,y2,z2) v3 face edge e5,1 f1 e1,1 (x3,y3,z3) e1,1 f2 e5,1 v4 (x4,y4,z4) e7,1 f3 e4,2 v5 (x5,y5,z5) e9,1 f4 e8,1 v6 (x6,y6,z6) e7,2 Half-Edge structure: Example Полуреберная структура: Пример v6 v3 e1,1 v1 e2,1 e6,1 e4,1 f1 e3,1 e3,2 e4,2 f3 e7,1 e7,2 f2 e5,1 v4 e8,1 e9,1 f4 v5 v2 Half-edge origin twin IncidentFace next prev e3,1 v2 e3,2 f1 e1,1 e2,1 e3,2 v3 e3,1 f2 e5,1 e4,1 e4,1 v4 e4,2 f2 e3,2 e5,1 e4,2 v3 e4,1 f3 e7,1 e6,1 Half-Edge structure Полуреберная структура Вопрос: Как пробежать все ребра, примыкающие к данной вершине? Half-Edge structure Полуреберная структура Вопрос: Как пробежать все ребра, примыкающие к данной вершине? begin = vertex.half; half = begin; do { half = half->pair->next; } while (half != begin) Half-Edge structure Полуреберная структура Вопрос 2: Какие ограничения на сетку накладывает такая структура? Half-Edge structure Полуреберная структура Вопрос 2: Какие ограничения на сетку накладывает такая структура? Half-Edge structure Полуреберная структура Вопрос 2: Какие ограничения на сетку накладывает такая структура? Ответ: сетка должна быть Сеткой многообразия Ориентируемой Half-Edge structure: Pros & cons Полуреберная структура: Плюсы и минусы Эффективная – большинство операций и запросов за O(1) (как правило) Не универсальная: годится только для сеток многообразий Corner Table Таблица Углов Угол состоит из Треугольника – c.t. Вершины - c.v Следующего угла – c.n Предыдущего угла – c.p Противоположного угла – c.o Левого угла – угла, противоположного c.p ( == c.n.n.o) Правого угла – угла, противоположного c.n ( == c.n.o) Corner Table: Example Таблица Углов: Пример v3 c3 c c9 c7 f3 4 v1 c1 v6 c12 c7 f1 c 2 c5 v2 f2 c6 c10 v4 f4 c11 v5 corner c.v c.t c.n c.p c.o c1 v1 f1 c2 c3 c6 c2 v2 f1 c3 c1 NULL NULL c3 v3 f1 c1 c2 NULL c6 NULL c4 v3 f2 c5 c6 NULL c7 c1 c5 v2 f2 c6 c4 c7 c1 NULL c6 v4 f2 c4 c5 c1 NULL c7 c.r c.l NULL NULL c6 Corner Table: Pros & Cons Таблица Углов: плюсы и минусы Все запросы за O(1) Все операции, как правило, за O(1) Только сетки многообразий Избыточность (хотя и не много) Corner Table: Queries Examples Таблица Углов: Примеры запросов Какие вершины у 3его треугольника? Смежны ли вершнины i и j? Проверить c.v. у углов 9, 10, 11 (c.v, c.n.v, c.p.v) Пробежать все углы вершины i, проверить, c.n.v == j или c.p.v == j Какие треугольники примыкают к вершине i? Проверить все c.t всех углов i ПО для семинаров AITricks GeomPrimitives & AITricks GeomBox AITricks GeomPrimitives Вам не требуется реализовывать тривиальные структуры данных, вроде точек, треугольников, сегментов, фигур и операций над ними. Зато у Вас будут задания посложнее Документация скоро будет на сайте AITricks GeomBox Те задачи, которые потребуют визуализации, можно рисовать, используя GeomBox. Вам не нужно самим писать отрисовку ваших сеток/примитивов AITricks GeomBox В следующий раз… Упрощение сеток 12,000 2,000 300 Вопросы? Вся информация по спецкурсу + презентации + текущие баллы выкладываются на http://aitricks.com/ru/research/course