Добавление и удаление геометрических объектов

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

Каждый геометрический объект, объявленный в системе ограничений, получает свой уникальный идентификатор – дескриптор типа GCM_geom, а его геометрический тип (GCM_g_type) остается неизменным в течении жизни объекта. Ниже приведены вызовы API C3D Solver, добавляющие геометрические объекты в систему.

Точка добавляется с помощью вызова

GCM_geom GCM_AddPoint(GCM_system gSys, const MbCartPoint3D & pVal)  

Результатом функции является дескриптор геометрической точки с типом GCM_POINT, принадлежащей системе ограничений gSys .Параметр pVal задает начальные значения координат точки <x,y,z>.

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

GCM_geom GCM_AddGeom(GCM_system gSys, const GCM_g_record & gRec)

Результатом вызова является дескриптор геометрического объекта, зарегистрированного в системе gSys. Параметры геометрического объекта задаются полями структуры GCM_g_record:

  • gRec.type задает геометрический тип объекта (GCM_g_type);

  • gRec.origin задает положение объекта, начало его ЛСК;

  • gRec.axisZ задает вектор оси Z ЛСК;

  • gRec.axisX задает вектор оси X ЛСК;

  • gRec.axisY задает вектор оси Y ЛСК;

  • gRec.radiusA и gRec.radiusB задают скалярные параметры радиусных объектов.

Подробнее о представлении данных в структуре GCM_g_record изложено в параграфе Представление геометрических объектов.

Для удобства и правильного заполнения структуры GCM_g_record в API компонента GCM предусмотрены вспомогательные функции, приведенные ниже:

Функция

GCM_g_record GCM_Point(const MbCartPoint3D &)   

фактически конвертирует значение координат трехмерной точки из типа данных MbCartPoint3D в GCM_g_record, воспринимаемой функцией GCM_AddGeom.

GCM_g_record GCM_Line(const MbCartPoint3D & org, const MbVector3D & axisZ)  

возвращает запись прямой по точке и направляющему вектору.

GCM_g_record GCM_Plane(const MbCartPoint3D & org, const MbVector3D & axisZ)

возвращает запись о плоскости, заданной точкой и вектором нормали.

Функция для получения записи конуса:

GCM_g_record GCM_Cone(const MbCartPoint3D & centre, const MbVector3D & axis
                                  , double radiusA
                                  , double radiusB) 

Входные параметры:

  • centre – центр окружности-основания конуса,

  • axis – направляющий вектор оси конуса,

  • radiusA – радиус основания конуса,

  • radiusB – радиус сечения конуса (малый радиус).

Предполагается, что параметры конуса описывают воображаемый усеченный конус, высота которого всегда равна единице длины, т.е. имеет единичное расстояние между поперечным сечением радиуса radiusA и сечением радиуса radiusB (см. иллюстрацию в таблице 1).

Функция для получения записи цилиндра:

GCM_g_record GCM_Cylinder(const MbCartPoint3D & centre, const MbVector3D & axis
                                    , double radius)    

Входные параметры:

  • centre – точка на оси цилиндра;

  • axis – направляющий вектор оси конуса;

  • radius – радиус цилиндра.

Функция для получения записи окружности:

GCM_g_record GCM_Circle(const MbCartPoint3D & centre, const MbVector3D & axis
                                    , double radius)    

Входные параметры:

  • centre – координаты центра окружности;

  • axis – направляющий вектор оси окружности;

  • radius – радиус окружности.

Функция для получения записи тора:

GCM_g_record GCM_Torus(const MbCartPoint3D & centre, const MbVector3D & axis
                                   , double majorR
                                   , double minorR) 

Входные параметры:

  • centre – координаты центра тора;

  • axis – направление оси вращения тора;

  • majorR – расстояние от цента тора до центра образующей окружности тора;

  • minorR – радиус образующей окружности тора.

Функция для получения записи сферы:

GCM_g_record GCM_Sphere(const MbCartPoint3D & centre, double radius)

Входные параметры:

  • centre – центр сферы;

  • radius – радиус сферы.

Функция для получения записи прямоугольной правой (right-handed) ЛСК:

GCM_g_record GCM_SolidLCS(const MbCartPoint3D & org, const MbVector3D & axisZ
                                   , const MbVector3D & axisX)

Входные параметры:

  • org – начало системы координат;

  • axisZ – орт Z;

  • axisX – орт X.

Результатом функции является запись ЛСК в виде четверки <O Z X Y>, где ось Z ориентирована по векторному произведению X◦Y, что соответствует правосторонней ориентации тройки X-Y-Z (right-handed rule). Запись ЛСК имеет геометрический тип GCM_LCS.

Другой метод создания записи ЛСК имеет тоже имя, но принимает в качестве аргумента значение MbPlacement3D:

GCM_g_record GCM_SolidLCS(const MbPlacement3D &)

Данный метод допускает создание как правосторонней, так и левосторонней СК.

Результат, который возвращает функция GCM_SolidLCS, используется для задания в системе ограничений твердого тела (кластера) с помощью вызовов GCM_AddGeom или GCM_SubGeom.

Для получения пустой записи GCM_g_record, которая может быть использована для конструирования значения по умолчанию, можно применить вызов:

GCM_g_record GCM_NullGeom(void).    

Ниже приведён фрагмент кода, демонстрирующий создание системы, включающей сферу sph с центром в начале координат и радиусом 10.0, а также цилиндр cyl с центром в точке <10, 0, 0>, ориентированный вдоль оси Z и имеющий тот же радиус.

GCM_system gSys = GCM_CreateSystem();
const MbCartPoint3D cylPos( 10.0, 0.0, 0.0 );
/*
Register two geoms, sphere and cylinder.
*/
GCM_geom sph = GCM_AddGeom(gSys, GCM_Sphere(MbCartPoint3D::origin, 10.0));
GCM_geom cyl = GCM_AddGeom(gSys, GCM_Cylinder(cylPos, MbVector3D::zAxis, 10.0));
...
...
/*
Finalize the constraint system to free its located memory.
*/
GCM_RemoveSystem(gSys);

Кроме вызова GCM_AddGeom в решателе предусмотрен другой метод для регистрации геометрических объектов, предусматривающий абстракцию твердого тела, а именно геометрически-жесткие множества, имеющие собственную ЛСК. Такие подмножество называется кластером. Для создания кластера необходимо объявить его ЛСК с помощью запроса:

GCM_geom lcs = GCM_AddGeom(gSys, GCM_SolidLCS(org, axisZ, axisX))

Значения org, axisZ, axisX задают позицию и ориентацию кластера (его ЛСК). Полученный дескриптор lcs будет задавать ЛСК геометрически-жесткого множества, элементы которого объявляются с помощью вызова:

GCM_geom GCM_SubGeom(GCM_system gSys, GCM_geom lcs, const GCM_g_record & gRec)

Входные параметры:

  • gSys – система геометрических ограничений;

  • lcs – дескриптор ЛСК кластера;

  • gRec – запись параметров геометрического объекта, заданного в ЛСК кластера.

Функция возвращает дескриптор геометрического объекта, принадлежащего кластеру. Характерная особенность объекта, принадлежащего кластеру в том, что его положение в пространстве подчинено ЛСК кластера, таким образом подчиненный объект меняет свое положение вместе с ЛСК кластера. Это основное его отличие от геометрических объектов, созданных методом GCM_AddGeom. Более подробно о работе с кластерами рассмотрено в параграфе Кластеризация геометрической сцены, моделирование сборок.

Геометрические объекты, возвращаемые функциями GCM_SubGeom, как и GCM_AddGeom, могут участвовать в ограничениях и размерах, т.е. могут быть аргументами ограничения.

Удаление геометрических объектов осуществляется вызовом

void GCM_RemoveGeom(GCM_system gSys, GCM_geom g)    

Данный метод удаляет геометрический объект из системы и делает его дескриптор g не действительным. Если геометрический объект на момент вызова является аргументом одного из ограничений, то он фактически остается в системе, но его неизбежное удаление откладывается до тех пор, пока не будет удалено последнее из ограничений, в которых он участвует. Таким образом, пользователь API GCM может освобождать геометрический объект, как только он стал не нужен для приложения, не заботясь о том есть ли ограничения, которые его удерживают.