Построение деформируемого тела
Построение деформируемого тела выполняется в четыре последовательных этапа, каждый из которых реализуется отдельной функцией. Цель – получить тело result, в котором выбранные грани исходного тела solid заменены на деформируемые грани. Вызов функции последующего этапа без успешного завершения предыдущего приводит к неопределённому поведению.
Этап 1. Подготовка граней к деформации
На первом этапе задают объект параметров типа NurbsValues и вызывают одну из функций ModifiedNurbsItem() – либо вариант с массивом граней faces, либо вариант с одной гранью face. В результате получают тело result, в котором указанные грани исходного тела solid заменены на NURBS-поверхности, пригодные для дальнейшей модификации. После успешного выполнения данного этапа следует перейти к этапу 2 – вызову функции GetControlSurface().
Функция
MbResultType ModifiedNurbsItem( MbSolid & solid,
MbeCopyMode sameShell,
const NurbsValues & p,
const RPArray<MbFace> & faces,
const MbSNameMaker & names,
MbSolid *& result )
выполняет замену выбранных граней тела деформируемыми гранями для последующего редактирования.
Входными параметрами функции являются:
solid – исходное тело;
sameShell – вариант копирования исходного тела;
p – объект с параметрами преобразования;
faces – заменяемые грани тела;
names – именователь операции.
Выходным параметром функции является построенное тело result.
При удачной работе функция возвращает rt_Success, в противном случае функция возвращает код ошибки из перечисления MbResultType (см. mb_operation_result.h).
Функция объявлена в файле action_direct.h.
При создании объекта p с параметрами модификации используется следующий конструктор параметров (см. op_shell_parameter.h):
ud, vd – порядок NURBS-копии по u и по v;
uc, vc – количество контрольных точек по u и по v;
umin, umax, vmin, vmax – диапазоны параметров по u и v для деформирования грани;
uapprox, vapprox – флаги возможного построения приближенной поверхности, а не точной.
NurbsValues( size_t ud, size_t uc, double umin, double umax, bool uapprox,
size_t vd, size_t vc, double vmin, double vmax, bool vapprox )
: uParameters( ud, uc, umin, umax, uapprox )
, vParameters( vd, vc, vmin, vmax, vapprox )
{}
Объект p хранит два набора параметров типа MbNurbsParameters: uParameters и vParameters необходимые для построения NURBS-поверхностей. Параметры ud, uc, umin, umax, uapprox задают поля uParameters, а параметры vd, vc, vmin, vmax, vapprox – поля vParameters.
Рассматриваемая функция выполняет копирование тела solid (в зависимости от параметра sameShell) и подготовку копии тела для дальнейшего деформирования указанных граней исходного тела.
Параметр solid содержит исходное тело, в котором указанные грани будут заменены на деформируемые грани на базе NURBS-поверхностей.
Параметр sameShell управляет передачей граней, рёбер и вершин от исходного тела solid построенному телу result и может принимать одно из четырех значений:
cm_Same = 0 (тело не копируется);
cm_KeepHistory (исходная оболочка и её копия имеют общие базовые поверхности, вершины и неизменённые операцией грани);
cm_KeepSurface (исходное тело и его копия имеют общие базовые поверхности);
cm_Copy (исходное тело и его копия не имеют общих данных).
Перечисление MbeCopyMode объявлено в файле mb_enum.h и подробно описано в параграфе Копирование множества граней MbFaceShell.
Параметр faces содержит множество граней тела solid, которые будут заменены на деформируемые грани на базе NURBS-поверхностей в построенном теле result.
Параметр names используется для именования новых граней, рёбер, вершин и версионирования операции.
Функция
MbResultType ModifiedNurbsItem( MbSolid & solid,
MbeCopyMode sameShell,
const NurbsValues & params,
const MbFace & face,
const MbSNameMaker & names,
MbSolid *& result )
выполняет замену одной грани тела деформируемой гранью для последующего редактирования. Данная функция отличается от вышеописанной только четвёртым параметром, который содержит не множество граней, а одну заменяемую грань face.
Функция объявлена в файле action_direct.h.
Построенное тело result внешне может быть похожим на исходное тело solid, но в отличие от исходного тела имеет NURBS-поверхности, доступные для модификации. На рис. 1 слева приведено исходное цилиндрическое тело solid, боковая грань которого является цилиндром MbCylinderSurface, справа приведено тело result с боковой гранью, базирующейся на NURBS-поверхности. Контрольные точки NURBS-поверхности также приведены на рисунке справа:
Рис. 1
Функции ModifiedNurbsItem() добавляют в журнал построенного тела строитель MbModifiedNurbsItem, который содержит все необходимые данные для выполнения операции. Строитель MbModifiedNurbsItem объявлен в файле cr_modified_nurbs_.h.
Этап 2. Получение базовой NURBS-поверхности грани
На втором этапе, при необходимости, для выбранной грани face тела result вызывают функцию GetControlSurface() и получают копию базовой NURBS-поверхности грани, которую можно изменять независимо от тела. После успешного выполнения данного этапа следует перейти к этапу 3 – вызову функции FaceControlPoints().
Функция
MbSurface * GetControlSurface( const MbFace & face )
выполняет построение деформируемой NURBS-поверхности на базе исходной грани face для дальнейшего редактирования.
Входным параметром функции является исходная грань face.
Функция объявлена в файле action_direct.h.
Функция возвращает ненулевой указатель на поверхность, если грань face базируется на NURBS-поверхности. Это требование будет выполняться после успешной работы функций ModifiedNurbsItem(). Функция возвращает указатель на копию базовой поверхности грани face, а не на саму базовую поверхность грани. Далее у возвращаемой поверхности можно модифицировать множество контрольных точек и их веса.
Этап 3. Получение контрольных точек грани
На третьем этапе, если требуется управлять формой грани через её контрольные точки, для грани face вызывают функцию FaceControlPoints() и получают матрицу контрольных точек и их весов. Пользователь изменяет координаты контрольных точек и/или их веса в соответствии с требуемой деформацией. После успешного выполнения данного этапа следует перейти к этапу 4 – вызову функции NurbsModification().
Функция
MbResultType FaceControlPoints( const MbFace & face,
Array2<MbCartPoint3D> & controlPoints,
Array2<double> & result )
выдаёт множество контрольных точек поверхности грани и множество их весов.
Входным параметром функции является исходная грань face.
Выходными параметрами функции являются:
controlPoints – контрольные точки грани;
result – веса контрольных точек.
Функция объявлена в файле action_direct.h.
Функция возвращает rt_Success, если грань face базируется на NURBS-поверхности, в противном случае возвращается код ошибки из перечисления MbResultType (см. mb_operation_result.h). Изменяя положение контрольных точек controlPoints и изменяя веса result контрольных точек, можно менять форму поверхности. Рассматриваемую функцию следует использовать после успешной работы функций ModifiedNurbsItem(), описанных выше.
Контрольные точки controlPoints передаются в виде прямоугольной матрицы, строки которой соответствуют первому параметру NURBS-поверхности, а столбцы соответствуют второму параметру NURBS-поверхности. То есть точки, лежащие в одной строке прямоугольной матрицы controlPoints, расположены вдоль координатной линии поверхности с фиксированным вторым параметром NURBS-поверхности, а точки, лежащие в одном столбце прямоугольной матрицы controlPoints, расположены вдоль координатной линии поверхности с фиксированным первым параметром NURBS-поверхности. На рис. 2 приведены контрольные точки на фоне координатных линий поверхности:
Рис. 2
Прямоугольная матрица result весов соответствует прямоугольной матрице контрольных точек controlPoints.
На рис. 3 слева приведена грань face и контрольные точки controlPoints ее поверхности, справа приведены отредактированные контрольные точки controlPoints для последующей модификации грани face:
Рис. 3
Этап 4. Применение деформации к телу
На четвёртом этапе деформацию применяют к телу с помощью одной из функций NurbsModification(). В варианте с поверхностью передают модифицированную поверхность faceSurface и неподвижные узлы. В варианте с контрольными точками передают изменённые контрольные точки, веса и узлы. В обоих случаях на выходе получают модифицированное тело result с изменённой формой выбранной грани.
Функция
MbResultType NurbsModification( MbSolid & solid,
MbeCopyMode sameShell,
MbFace * face,
MbSurface & faceSurface,
Array2<bool> & fixedPoints,
const MbSNameMaker & names,
MbSolid *& result )
выполняет деформирование заданной грани исходного тела путём подстановки присланной поверхности в изменяемую грань.
Входными параметрами функции являются:
solid – исходное тело;
sameShell – вариант копирования исходного тела;
face – изменяемая грань тела;
faceSurface – новая NURBS-поверхность для грани;
fixedPoints – неподвижные узлы (если указатель fixedPoints равен nullptr, все контрольные точки считаются подвижными);
names – именователь операции.
Выходным параметром функции является построенное модифицированное тело result.
При удачной работе функция возвращает rt_Success, в противном случае возвращается код ошибки из перечисления MbResultType (см. mb_operation_result.h).
Функция объявлена в файле action_direct.h.
Рассматриваемая функция копирует тело solid и подставляет присланную поверхность faceSurface в копию грани face тела solid.
Поверхность faceSurface должна быть NURBS-поверхностью. Параметр fixedPoints представляет собой прямоугольную матрицу, строки и столбцы которой соответствуют строкам и столбцам матрицы контрольных точек NURBS-поверхности faceSurface. Элементы матрицы со значением true определяют неподвижные контрольные точки NURBS-поверхности.
Функция
MbResultType NurbsModification( MbSolid & solid,
MbeCopyMode sameShell,
MbFace * face,
const Array2<MbCartPoint3D> & controlPoints,
const Array2<double> & weights,
Array2<bool> * fixedPoints,
const MbSNameMaker & names,
MbSolid *& result )
выполняет деформирование указанной грани исходного тела по заданным контрольным точкам и их весам.
Входными параметрами функции являются:
solid – исходное тело;
sameShell – вариант копирования исходного тела;
face – изменяемая грань тела;
controlPoints – заданные контрольные точки изменяемой грани;
weights – веса контрольных точек;
fixedPoints – неподвижные узлы (если указатель fixedPoints равен nullptr, все контрольные точки считаются подвижными);
names – именователь операции.
Выходным параметром функции является построенное тело result.
При удачной работе функция возвращает rt_Success, в противном случае возвращается код ошибки из перечисления MbResultType (см. mb_operation_result.h).
Функция объявлена в файле action_direct.h.
Рассматриваемую функцию следует использовать после успешной работы функций ModifiedNurbsItem(), GetControlSurface() и FaceControlPoints(), описанных выше. Функции ModifiedNurbsItem() подготавливают грани для модификации.
На рис. 4 приведено исходное цилиндрическое тело solid, боковая грань которого базируется на NURBS-поверхности, и у которой подлежат модификации контрольные точки. Также на рисунке приведено тело result с модифицированной боковой гранью, контрольные точки controlPoints которой приведены на рис. 3:
Рис. 4
Функции NurbsModification() добавляют в журнал построенного тела строитель MbNurbsModification, который содержит все необходимые данные для выполнения операции. Строитель MbNurbsModification объявлен в файле cr_modified_nurbs_.h.