Построение тела вращения
Функция
MbResultType RevolutionSolid( const MbSweptData & sweptData,
const MbAxis3D & axis,
const RevolutionValues & params,
const MbSNameMaker & operNames,
RPArray<MbSNameMaker> & contoursNames,
MbSolid *& result );
выполняет построение тела вращения.
Входными параметрами функции являются:
sweptData – данные об образующих кривых;
axis – ось вращения;
params – объект, содержащий параметры вращения;
operNames – именователь операции;
contoursNames – именователи сегментов образующего контура.
Выходным параметром функции является построенное тело (оболочка) result.
Функция возвращает код результата операции из перечисления MbResultType (см. mb_operation_result.h).
Функция объявлена в файле action_solid.h.
Тело вращения относится к разновидности тел движения, которые получаются путем движения образующей кривой вдоль направляющей кривой. Направляющей кривой тела вращения служит окружность или ее дуга. Тело вращения строится путем вращения одной или нескольких кривых вокруг оси axis.
Параметр sweptData содержит информацию об образующих кривых. Классы MbSweptData и RevolutionValues описаны в файле op_swept_parameter.h. Образующие кривые могут представлять собой двумерные контуры contours на поверхности surface или контуры в пространстве contours3D. В частном случае поверхность surface может представлять собой плоскость. Ориентация контуров contours может быть произвольной. Контуры contours могут быть вложены друг в друга.
Вращение кривых может выполняться в прямом направлении относительно оси axis, в обратном направлении относительно оси axis и в обоих направлениях. Вращение в прямом направлении выполняется против часовой стрелки при взгляде навстречу оси axis. Параметры построения в каждом направлении задают объекты MbSweptSide.
Параметр params содержит два объекта класса MbSweptSide – side1 и side2, в которых находятся параметры вращения в прямом и обратном направлении.
Способ вращения задается в поле way объекта класса MbSweptSide:
при way = sw_scalarValue вращение выполняется на угол scalarValue в направлении side1 или side2. Угол вращения задается в радианах;
при way = sw_surface вращение выполняется до поверхности side1.surface или side2.surface при side1.distance равном нулю или side2.distance равном нулю соответственно;
при way = sw_surface и distance не равным нулю вращение выполняется до эквидистантной поверхности к side1.surface или до эквидистантной поверхности к side2.surface соответственно;
при way = sw_shell вращение выполняется до ближайшего объекта (тела) в направлении side1 или side2.
Параметры params.thickness1 и params.thickness2 определяют толщину стенки тонкостенного тела. Параметр params.thickness1 задает отступ наружу от образующей кривой, а параметр params.thickness2 задает отступ внутрь от образующей кривой.
Параметр params.shellClosed управляет замкнутостью построенного тела.
Параметр params.checkSelfInt сообщает о необходимости проверки результата построения на самопересечение. По умолчанию params.checkSelfInt = false, проверка не выполняется.
Параметр params.shape управляет формой построенного тела. При params.shape = 1 построенное тело имеет топологию тора, при params.shape = 0 построенное тело имеет топологию сферы. Если образующая — незамкнутая плоская кривая и ось вращения лежит в плоскости кривой, то возможно построение тела вращения с топологией типа сферы. В этом случае образующая достраивается до оси вращения.
На рис. 1 приведены данные, используемые при построении, и схема наследования параметров построения тела вращения RevolutionValues & params.
Рис. 1
Параметры operNames и contoursNames обеспечивают именование граней, ребер и вершин построенного тела.
На рис. 2 приведен двумерный контур contour, плоская поверхность surface (MbPlane) и ось вращения axis.
Рис. 2
На рис. 3 приведено замкнутое тело, построенное вращением по заданным параметрам контура, показанного на рис. 2.
Рис. 3
На рис. 4 приведено замкнутое тонкостенное тело, построенное вращением по заданным параметрам контура, показанного на рис. 2.
Рис. 4
На рис. 5 приведено незамкнутое тело, построенное вращением по заданным параметрам контура, показанного на рис. 2. Параметры построения тела, показанного на рис. 3, отличаются от параметров построения тела, показанного на рис. 5, только величиной params.shellClosed.
Рис. 5
На рис. 6 приведен двумерный контур contour, плоская поверхность surface (MbPlane) и две поверхности surface1 и surface2, которые будут использоваться при построении тела вращения. Для построения необходимо, чтобы поверхности surface1 и surface2 полностью перекрывали путь движения контура в соответствующем направлении. При этом следует учитывать параметры params.thickness1, params.thickness2. Тело вращения обрезается заданными поверхностями (если params.side1.distance или params.side2.distance равны нулю) или эквидистантными к ним поверхностями (если params.side1.distance или params.side2.distance не равны нулю).
Рис. 6
На рис. 7 приведено тело, построенное вращением контура, показанного на рис. 6, с опциями «До поверхности» (params.side1(2).way = sw_surface), в качестве которых заданы surface1 и surface2.
Рис. 7
На рис. 8 приведено тонкостенное тело, построенное вращением контура, показанного на рис. 6, с опциями «До поверхности», в качестве которых заданы surface1 и surface2. Тело вращения обрезается заданными поверхностями.
Рис. 8
Двумерный контур может располагаться на плоской или криволинейной поверхности. Например, тело можно построить вращением контура на криволинейной поверхности, полученного от цикла одной из граней твердого тела, показанного на рис. 9.
Рис. 9
На рис. 10 приведено замкнутое тело, полученное вращением контура на криволинейной поверхности, приведенной на рис. 9.
Рис. 10
На рис. 11 приведено замкнутое тонкостенное тело, полученное вращением контура на криволинейной поверхности, приведенной на рис. 9.
Рис. 11
На рис. 12 приведено незамкнутое тело, полученное вращением контура на криволинейной поверхности, приведенной на рис. 9.
Рис. 12
Если на одной поверхности расположено множество не пересекающихся двумерных контуров, то рассматриваемая функция определяет внешние контуры и вложенные в них внутренние контуры, причем вложение может быть многократным. На рис. 13 приведено множество не пересекающихся двумерных контуров contours и плоская поверхность surface (MbPlane).
Рис. 13
На рис. 14 приведено замкнутое тело, состоящее из нескольких частей, построенное вращением множества контуров, показанного на рис. 13.
Рис. 14
На рис. 15 приведено замкнутое тонкостенное тело, состоящее из нескольких частей, построенное вращением множества контуров, показанного на рис. 13.
Рис. 15
На рис. 16 приведены два трехмерных контура.
Рис. 16
На рис. 17 приведено двусвязное тонкостенное замкнутое тело, полученное вращением трехмерных контуров, приведенных на рис. 16.
Рис. 17
На рис. 18 приведены два незамкнутых тела, полученных вращением трехмерных контуров, приведенных на рис. 16. Построение выполнено для каждого контура отдельно.
Рис. 18
При построении операции вращения до конструктивной плоскости с вырожденной областью определения оболочка будет построена до ближайшего пересечения с указанной плоскостью.
В случае, если плоскость имеет невырожденные границы, то часть плоскости, до которой будет построено вращение, определяется по положению центра тяжести контура, ограничивающего плоскость, относительно проекции оси вращения на плоскость.
Функция построения тела вращения RevolutionSolid() добавляет в журнал построенного тела строитель MbCurveRevolutionSolid, который содержит все необходимые для построения тела данные. Строитель MbCurveRevolutionSolid объявлен в файле cr_revolution_solid.h.
В тестовом приложении test.exe построение тела вращения выполняется командами меню «Создать->Тело->На базе кривых->Вращением поверхностной кривой» и «Создать->Тело->На базе кривых->Вращением трехмерной кривой».