Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Построение выпуклой оболочки в режиме реального времени / Doc / Построение выпуклой оболочки в реальном времени.doc
Скачиваний:
25
Добавлен:
01.05.2014
Размер:
783.87 Кб
Скачать

Описание программы Функции

Основные функции, представляющие интерес, это те, которые реализуют непосредственно построение выпуклой оболочки.

1) Функция Create_Convex_hull(CPoint point) – построение выпуклой оболочки. В качестве параметра получает объект – Точка, которая должна быть добавлена (или не добавлена, если является внутренней) в выпуклую оболочку.

2) Функция поиска опорных точек Search (RandomizeNode<TPoint> *root,TTree *troot, CPoint p). Эта функция использует вспомогательные функции, осуществляющие поиск в левом и правом поддеревьях Left_Search(RandomizeNode<TPoint> *root, TTree *troot, CPoint p) и Right_Search(RandomizeNode<TPoint> *root,TTree *troot, CPoint p) соответственно.

3) Для определения ситуации предназначена функция Situation (RandomizeNode<TPoint> *m, RandomizeNode<TPoint> *M,CPoint p), которая возвращает номер (с 1 по 8) ситуации.

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

Структура Структуры данных

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

Пример рандомизированного дерева

Около каждого узла дерева указан его приоритет. Корень каждого яруса дерева должен иметь приоритет больший, чем у его правого и левого поддеревьев. Каждый узел дерева имеет правое и левое поддеревья, возможно, оба пустые.

Структура данных, описывающая узел дерева, выглядит следующим образом:

template <class T> class RandomizeNode

{

private:

RandomizeNode *p_parent; //указатель на родителя

RandomizeNode *p_lchild; //указатель на левое поддерево

RandomizeNode *p_rchild; // указатель на правое поддерево

RandomizeNode *p_next; //указатель на следующий элемент

RandomizeNode *p_prev; //указатель на предыдущий элемент

T *val; //значение узла

double m_dPriority; //приоритет узла

// методы

public:

// методы

}

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

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

Структура данных, описывающая само дерево, выглядит следующим образом:

template <class T> class RandomizeSearchTree

{

private:

RandomizeNode<T> *win; //текущий элемнент списка

RandomizeNode<T> *root; //корень дерева

RandomizeNode<T> *max; //МАКСимальный элемент дерева

RandomizeNode<T> *min; //МИНимальный элемент дерева

// методы

typedef const RandomizeSearchTree<T> t_constTree;

typedef RandomizeSearchTree<T> t_noconstTree;

/*Шаблон итератора по дереву

_Tree - контейнер

_Node - тип возвращаемый опреатором * и -> (узел дерева)

*/

template<class _Tree,class _Node>

class tree_iterator

{

typedef tree_iterator<_Tree,_Node> t_iterator;

typedef tree_iterator<t_noconstTree,_Node> t_noconst_iterator;

typedef tree_iterator<t_constTree,_Node> t_const_iterator;

_Tree *p_cont_tree; //указатель на контейнер

_Node *cur; //текущий узел

}

public:

// методы

}

Для перемещения по элементам контейнера (узлам дерева) без затрагивания его структуры разработан итератор. Основные функции итератора - обеспечение доступа к объекту, на который он ссылается (разыменование), и переход от одного элемента контейнера к другому (итерация).

Рандомизированное дерево – это основная структура данных. Разработаны еще несколько структур данных, предназначенных для второстепенных целей. Например, класс StepStruct (смотри Приложение 2, текст файла TPoint.h), экземпляр которого во время выполнения программы хранит последовательность шагов, сделанных в процессе построения ВО. Если пользователь желает сохранить построенную ВО в файле, то в файл сохраняется указанный экземпляр класса StepStruct. Таким образом, при открытии файла с сохраненной ВО пользователь видит не готовый результат, а процесс построения ВО.

Соседние файлы в папке Doc