ИСМ-06-2:
7. б) Методы визуализации булевых операцийМетоды визуализации булевых операций
Методы визуализации булевых операций делятся на математические и графические.
При математическом методе необходимо:
Графические методы – алгоритмы, работающие в пространстве кадра. . К этой категории принадлежат алгоритмы Goldfeather, алгоритм слоев Goldfeather и SCS-алгоритм (последовательного вычитания выпуклых оболочек) [19].
Однако, у этих алгоритмов существуют свои недостатки [18]. Основным таким недостатком является медленное чтение пикселя из буфера кадра во внешнюю оперативную память. Эта операция необходима для:
Все эти алгоритмы реализованы в библиотеке OpenCSG. Однако, непонятно, как можно интегрировать данную библиотеку в разрабатываемую САПР.
Наиболее подходящей организацией данных для модуля визуализации, удовлетворяющих условию выбора объектов и перехода от конкретной точки на детали к сборке, содержащей эту деталь, является представление в виде графа.
Помимо перечисленных свойств, такая структура позволяет выполнять простое добавление и уничтожение отдельных объектов. Рассмотрим простую деталь «кронштейн» (рис. 1) в структурном представлении системы.
Структурно эта деталь будет выглядеть, как показано на рис. 2.
Верхний узел графа (агрегаты) представляет собой сборку – совокупность деталей. Ниже по иерархии находятся детали, которые, в свою очередь, подразделяются на поддетали и примитивы.
Рассмотрим реализацию данной структуры на языке C++ (листинг 1).
class VDTree { //Класс дерево private: VDTree *Parent; //Указатель на родителя VDTree **Childs; //Массив элементов – потомков unsigned int ChildCount; //Количество потомков public: VDTree(); //Конструктор ~VDTree(); //Деструктор void SetParent(VDTree *parent); //Установить родителя VDTree *GetParent(); //Получить родителя unsigned int GetChildCount(); //Получить количество потомков void AddChild(VDTree *Child); //Добавить потомок VDTree *GetChild(unsigned int ChildIndex); //Получить потомка по индексу void DeleteChild(unsigned int ChildIndex); //Удалить потомка по индексу }; class VDObject: public VDTree { //Класс графический объект private: unsigned int ObjectType; //Тип графического объекта void *Parameters; //Параметры графического объекта public: VDObject(); //Конструктор ~VDObject(); //Деструктор }; |
Листинг 1. Реализация структуры модуля визуализации.
К модулю визуализации САПР предъявляются требования, суть которых сводится к следующему:
Реализация базовых функций не представляет сложности, т.к. данные механизмы уже заложены в графических библиотеках.
Выбор объектов в OpenGL (Silicon graphics) реализован с помощью специального «буфера выбора» [13]. При этом, каждому графическому элементу присваивается уникальное имя – идентификатор. Все поименованные объекты хранятся в стеке имен. При рендеринге сцены включается режим «выбора» и все объекты, находящиеся под курсором, попадают в буфер выбора.
Препроцессор графического ядра выполняет предподготовку для вывода геометрии: 1) перевод данных в собственный «внутренний» формат представления; 2) генерализация (оптимизация) «сложных» поверхностей и деталей; 3) визуализация булевых операций. Как говорилось выше, наиболее подходящей структурой данных для модуля визуализации является структура в виде графа, именно к такой организации приводятся поступающие данные. Про оптимизацию и визуализацию булевых операций речь пойдет ниже.
Любой трехмерный объект в компьютерной графике, как известно, представляется в виде сети треугольников, представляющей собой триангуляцию (триангуляция – планарный граф, все конечные грани которого являются треугольниками) [3]. Суть методов оптимизации заключается в перестроении триангуляции и формирования сети треугольников большего размера, либо построения квадриангуляции (сетка прямоугольников) [6]. На рис. 4 изображен пример построения квадриангуляции (слева – триангуляция).
© ism-06-2.ru