Лекция 8Деревья разбиенияпространства (Space partition trees) 
КурносовМихаил Георгиевич 
E-mail: mkurnosov@gmail.com 
WWW: www.mkurnosov.net 
Курс “Алгоритмы и структуры данных” 
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) 
Осенний семестр, 2014
Визуализация трехмерных сцен 
2 
Имеется трехмерное пространство, в котором размещено nполигонов (многоугольников)и известны их координаты 
Полигон (polygon)–это многоугольник, замкнутая ломанная линия(задет плоскость, на которой лежит) 
z 
x 
y 
P0(x, y, z) 
P1 
P2 
P3 
P5 
P4 
Сложные поверхности представляются множеством полигонов
Визуализация трехмерных сцен 
3 
Имеется трехмерное пространство, в котором размещено nполигонов (многоугольников)и известны их координаты 
Требуется решать следующие задачи: 
oСортировать объекты (полигоны) в порядке удаления от наблюдателя (камеры) 
oОбнаруживать столкновения объектов 
z 
x 
y
Визуализация трехмерных сцен 
4 
Невидимые поверхности (полигоны) не отрисовываются 
Видимость определяется порядком расположения полигонов (от камеры) 
Camera 
(POV – point of view) 
Невидимая плоскость
Визуализация трехмерных сцен 
5 
Объекты нарисованы с учетом их расположения относительно наблюдателя (камеры)
Деревья двоичного разбиения пространства 
6 
Дерево двоичного разбиения пространства (Binary space partitioning tree, BSP tree) –это бинарное дерево, разделяющее пространство на подмножества 
BSP tree хранит информацию о расположении объектов сцены в упорядоченном порядке –от переднего плана (front) к заднему(back) 
Также применяется для определения столкновений объектов (collision detection)в компьютерных играх и робототехнике 
Использовались в играх Doom(1993), Quake(1996) и др. 
Авторы: 
SchumackerR. A., Brand B., Gilliland M. G., Sharp W.H., 1969 
Fuchs H., KedemZ. M, Naylor B. F., 1980
Построение BSP-дерева 
7 
1.Из заданного списка Pполигонов выбираем разбивающий полигон S, он задает разбивающую плоскость (plane) 
2.Создаем в дереве новый узел node 
3.Для каждого полигона Pв спискеполигонов 
a)Если полигон Pнаходится с фронтальной стороны S, заносим его в список полигонов фронтальной стороны(front list) 
b)Если полигон Pнаходится с обратной стороны S, заносим его в список полигонов обратной стороны(back list) 
c)Если полигон Pпересекается плоскостью S, разделяем его на два и заносим их в списки front и back 
d)Если полигон Pлежит в плоскости S, то добавляем его в список полигонов узла node 
4.Рекурсивно применяем алгоритм к списку front, затем к back
Пример построение BSP-дерева в 2D случае 
8 
1.В двумерном пространстве задан списокпрямых(A, B, C, D) –список P 
2.Требуется построить BSP-древо 
listP
Пример построение BSP-дерева в 2D случае 
9 
1.Из списка (A, B, C, D) выбираем разделяющую прямую A 
2.Создаем новый узелA –корень BSP-дерева 
3.Формируем списки frontи back 
4.Рекурсивно обрабатываем списки front иback 
back 
front 
Вектор указывает в сторону переднего плана (front)
Пример построение BSP-дерева в 2D случае 
10 
Из списка frontузла A выбираем разделяющую прямую B2 
Создаем узел B2и формируем его списки frontи back 
front 
back
Пример построение BSP-дерева в 2D случае 
11 
Из списка frontузла B2выбираем разделяющую прямую D2 
Формируем узел D2 
front 
back
Пример построение BSP-дерева в 2D случае 
12 
Из списка back узла B2выбираем разделяющую прямую C2 
Формируем узел C2и его список front(список backпуст) 
front
Пример построение BSP-дерева в 2D случае 
13 
Из списка front узла C2выбираем разделяющую прямую D3 
Формируем узел D3
Пример построение BSP-дерева в 2D случае 
14 
Из списка back узла A выбираем разделяющую прямую B1 
Формируем узел B1и его списки frontи back 
front 
back
Пример построение BSP-дерева в 2D случае 
15 
Из списка front узла B1выбираем разделяющую прямую D1 
Формируем узел D1
Пример построение BSP-дерева в 2D случае 
16 
Из списка back узла B1выбираем разделяющую прямую C1 
Формируем узел C1
Пример построение BSP-дерева в 2D случае 
17 
Количество полигонов в дереве больше их начального числа 
На плоскости было 4 прямые, в дереве 8
Сортировка полигонов 
18 
Задано BSP-дерево 
Заданы координаты наблюдателя–POV (point of view) 
Как изобразить на экране полигоны в порядке удаления от наблюдателя(упорядочить их)?
Обход BSP-дерева(сортировка полигонов) 
19 
1.Если текущий узел лист, нарисовать его полигоны 
2.Если наблюдатель (камера) расположен перед текущим узлом 
oрекурсивно обойти поддерево с узлами, находящимися позади текущего узла 
oнарисовать полигоны текущего узла 
oрекурсивно обойти поддерево с узлами, находящимися впереди текущего узла 
3.Если наблюдатель (камера) расположен позади текущего узла 
oрекурсивно обойти поддерево с узлами, находящимися впереди текущего узла 
oнарисовать полигоны текущего узла 
oрекурсивно обойти поддерево с узлами, находящимися позади текущего узла 
4.Если наблюдатель расположен в плоскости текущего узла 
oрекурсивно обойти поддерево с узлами, находящимися впереди текущего узла 
oрекурсивно обойти поддерево с узлами, находящимися позади текущего узла
Поиск столкновений 20 
Задано BSP-дерево 
Заданы координаты объекта 
Границы объекта задаются ограничивающей сферой (или окружностью) для упрощения вычислений 
Требуется найти полигон пересекающий ограничивающую сферу объекта –полигон, с которым столкнулся объект
Поиск столкновений 21 
functionFindCollision(node, obj) 
ifnode = NULL then 
returnNULL 
ifDist(node.polygon, obj.sphere.center) >obj.sphere.radiusthen 
ifDotProduct(obj.center, node.normal) >= 0then 
// Объект находится с фронтальной стороны разбивающей плоскости, 
// обходим только фронтальное поддерево 
returnFindCollision(node.front,obj) 
else 
// Объект находится с обратной стороны разбивающей плоскости, 
// обходим только оборотное поддерево 
returnFindCollision(node.back,obj) 
end if 
else 
// Столкновение с полигоном узла node 
returnnode 
end if 
end function
k-мерное дерево (k-d tree) 
22 
k-мерное дерево (k-d tree)–это дерево разбиения пространства для упорядочивания точек в k-мерном пространстве 
k-d дерево –это разновидность дерева поиска 
Автор: Дж. Бентли, 1975 
Сложностьв среднемслучае 
Сложность в худшем случае 
Lookup 
O(logn) 
O(n) 
Insert 
O(logn) 
O(n) 
Delete 
O(logn) 
O(n) 
Объемтребуемой памяти: O(n)
k-мерное дерево (k-d tree) 
23 
k-мерное дерево (k-d tree)–это бинарное дерево разбиения пространства для упорядочивания точек в k-мерном пространстве 
Пространство разбивается гиперплоскостью на два подпространства 
k-d дерево строится для заданного множества точек
k-мерное дерево (k-d tree) 
24 
Заданы точки (2,3), (5,4), (9,6), (4,7), (8,1), (7,2) 
Строим k-d дерево рекурсивно разбивая плоскость поочередно прямыми x=k, y=k 
За kпринимается медиана среди координат X или Y точек
k-мерное дерево (k-d tree) 
25 
k-мерное дерево (k-d tree)–это бинарное дерево разбиения пространства для упорядочивания точек в k-мерном пространстве
Дерево квадрантов (quadtree) 
26 
Дерево квадрантов (quadtree)–это дерево, в котором каждый внутренний узел содержит 4 дочерних элемента (квадранта) 
Дерево Quadtree–используется для разбиения 2D пространства 
Авторы: Raphael Finkel, Jon Bentley, 1974 
Задачи 
oПредставление изображений 
oОбнаружение столкновений (ближайших точек/объектов) 
oХранение данных для табличных или матричных вычислений
Дерево квадрантов (quadtree) 
27
Октодерево(octree) 
28 
Октодерево(octree)–это трехмерный аналог дерева квадрантов

Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)

  • 1.
    Лекция 8Деревья разбиенияпространства(Space partition trees) КурносовМихаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс “Алгоритмы и структуры данных” Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Осенний семестр, 2014
  • 2.
    Визуализация трехмерных сцен 2 Имеется трехмерное пространство, в котором размещено nполигонов (многоугольников)и известны их координаты Полигон (polygon)–это многоугольник, замкнутая ломанная линия(задет плоскость, на которой лежит) z x y P0(x, y, z) P1 P2 P3 P5 P4 Сложные поверхности представляются множеством полигонов
  • 3.
    Визуализация трехмерных сцен 3 Имеется трехмерное пространство, в котором размещено nполигонов (многоугольников)и известны их координаты Требуется решать следующие задачи: oСортировать объекты (полигоны) в порядке удаления от наблюдателя (камеры) oОбнаруживать столкновения объектов z x y
  • 4.
    Визуализация трехмерных сцен 4 Невидимые поверхности (полигоны) не отрисовываются Видимость определяется порядком расположения полигонов (от камеры) Camera (POV – point of view) Невидимая плоскость
  • 5.
    Визуализация трехмерных сцен 5 Объекты нарисованы с учетом их расположения относительно наблюдателя (камеры)
  • 6.
    Деревья двоичного разбиенияпространства 6 Дерево двоичного разбиения пространства (Binary space partitioning tree, BSP tree) –это бинарное дерево, разделяющее пространство на подмножества BSP tree хранит информацию о расположении объектов сцены в упорядоченном порядке –от переднего плана (front) к заднему(back) Также применяется для определения столкновений объектов (collision detection)в компьютерных играх и робототехнике Использовались в играх Doom(1993), Quake(1996) и др. Авторы: SchumackerR. A., Brand B., Gilliland M. G., Sharp W.H., 1969 Fuchs H., KedemZ. M, Naylor B. F., 1980
  • 7.
    Построение BSP-дерева 7 1.Из заданного списка Pполигонов выбираем разбивающий полигон S, он задает разбивающую плоскость (plane) 2.Создаем в дереве новый узел node 3.Для каждого полигона Pв спискеполигонов a)Если полигон Pнаходится с фронтальной стороны S, заносим его в список полигонов фронтальной стороны(front list) b)Если полигон Pнаходится с обратной стороны S, заносим его в список полигонов обратной стороны(back list) c)Если полигон Pпересекается плоскостью S, разделяем его на два и заносим их в списки front и back d)Если полигон Pлежит в плоскости S, то добавляем его в список полигонов узла node 4.Рекурсивно применяем алгоритм к списку front, затем к back
  • 8.
    Пример построение BSP-деревав 2D случае 8 1.В двумерном пространстве задан списокпрямых(A, B, C, D) –список P 2.Требуется построить BSP-древо listP
  • 9.
    Пример построение BSP-деревав 2D случае 9 1.Из списка (A, B, C, D) выбираем разделяющую прямую A 2.Создаем новый узелA –корень BSP-дерева 3.Формируем списки frontи back 4.Рекурсивно обрабатываем списки front иback back front Вектор указывает в сторону переднего плана (front)
  • 10.
    Пример построение BSP-деревав 2D случае 10 Из списка frontузла A выбираем разделяющую прямую B2 Создаем узел B2и формируем его списки frontи back front back
  • 11.
    Пример построение BSP-деревав 2D случае 11 Из списка frontузла B2выбираем разделяющую прямую D2 Формируем узел D2 front back
  • 12.
    Пример построение BSP-деревав 2D случае 12 Из списка back узла B2выбираем разделяющую прямую C2 Формируем узел C2и его список front(список backпуст) front
  • 13.
    Пример построение BSP-деревав 2D случае 13 Из списка front узла C2выбираем разделяющую прямую D3 Формируем узел D3
  • 14.
    Пример построение BSP-деревав 2D случае 14 Из списка back узла A выбираем разделяющую прямую B1 Формируем узел B1и его списки frontи back front back
  • 15.
    Пример построение BSP-деревав 2D случае 15 Из списка front узла B1выбираем разделяющую прямую D1 Формируем узел D1
  • 16.
    Пример построение BSP-деревав 2D случае 16 Из списка back узла B1выбираем разделяющую прямую C1 Формируем узел C1
  • 17.
    Пример построение BSP-деревав 2D случае 17 Количество полигонов в дереве больше их начального числа На плоскости было 4 прямые, в дереве 8
  • 18.
    Сортировка полигонов 18 Задано BSP-дерево Заданы координаты наблюдателя–POV (point of view) Как изобразить на экране полигоны в порядке удаления от наблюдателя(упорядочить их)?
  • 19.
    Обход BSP-дерева(сортировка полигонов) 19 1.Если текущий узел лист, нарисовать его полигоны 2.Если наблюдатель (камера) расположен перед текущим узлом oрекурсивно обойти поддерево с узлами, находящимися позади текущего узла oнарисовать полигоны текущего узла oрекурсивно обойти поддерево с узлами, находящимися впереди текущего узла 3.Если наблюдатель (камера) расположен позади текущего узла oрекурсивно обойти поддерево с узлами, находящимися впереди текущего узла oнарисовать полигоны текущего узла oрекурсивно обойти поддерево с узлами, находящимися позади текущего узла 4.Если наблюдатель расположен в плоскости текущего узла oрекурсивно обойти поддерево с узлами, находящимися впереди текущего узла oрекурсивно обойти поддерево с узлами, находящимися позади текущего узла
  • 20.
    Поиск столкновений 20 Задано BSP-дерево Заданы координаты объекта Границы объекта задаются ограничивающей сферой (или окружностью) для упрощения вычислений Требуется найти полигон пересекающий ограничивающую сферу объекта –полигон, с которым столкнулся объект
  • 21.
    Поиск столкновений 21 functionFindCollision(node, obj) ifnode = NULL then returnNULL ifDist(node.polygon, obj.sphere.center) >obj.sphere.radiusthen ifDotProduct(obj.center, node.normal) >= 0then // Объект находится с фронтальной стороны разбивающей плоскости, // обходим только фронтальное поддерево returnFindCollision(node.front,obj) else // Объект находится с обратной стороны разбивающей плоскости, // обходим только оборотное поддерево returnFindCollision(node.back,obj) end if else // Столкновение с полигоном узла node returnnode end if end function
  • 22.
    k-мерное дерево (k-dtree) 22 k-мерное дерево (k-d tree)–это дерево разбиения пространства для упорядочивания точек в k-мерном пространстве k-d дерево –это разновидность дерева поиска Автор: Дж. Бентли, 1975 Сложностьв среднемслучае Сложность в худшем случае Lookup O(logn) O(n) Insert O(logn) O(n) Delete O(logn) O(n) Объемтребуемой памяти: O(n)
  • 23.
    k-мерное дерево (k-dtree) 23 k-мерное дерево (k-d tree)–это бинарное дерево разбиения пространства для упорядочивания точек в k-мерном пространстве Пространство разбивается гиперплоскостью на два подпространства k-d дерево строится для заданного множества точек
  • 24.
    k-мерное дерево (k-dtree) 24 Заданы точки (2,3), (5,4), (9,6), (4,7), (8,1), (7,2) Строим k-d дерево рекурсивно разбивая плоскость поочередно прямыми x=k, y=k За kпринимается медиана среди координат X или Y точек
  • 25.
    k-мерное дерево (k-dtree) 25 k-мерное дерево (k-d tree)–это бинарное дерево разбиения пространства для упорядочивания точек в k-мерном пространстве
  • 26.
    Дерево квадрантов (quadtree) 26 Дерево квадрантов (quadtree)–это дерево, в котором каждый внутренний узел содержит 4 дочерних элемента (квадранта) Дерево Quadtree–используется для разбиения 2D пространства Авторы: Raphael Finkel, Jon Bentley, 1974 Задачи oПредставление изображений oОбнаружение столкновений (ближайших точек/объектов) oХранение данных для табличных или матричных вычислений
  • 27.
  • 28.
    Октодерево(octree) 28 Октодерево(octree)–этотрехмерный аналог дерева квадрантов