Множество граней MbFaceShell

Класс MbFaceShell объявлен в файле topology_faceset.h.

Множество граней MbFaceShell является наследником топологического объекта MbTopItem. Структура данных MbFaceShell содержит множество граней RPArray<MbFace> faceSet и признак замкнутости closed множества граней. У множества граней есть ещё некоторые данные, которые не обязательны и служат для ускорения работы методов множества граней.

Множество граней, как правило, описывает связный кусок поверхности моделируемого объекта. Связанные между собой грани множества удовлетворяют определённым условиям, а именно: грани стыкуются между собой по общим рёбрам, в каждом ребре стыкуются только две грани, причём грани стыкуются так, что внешняя сторона одной грани переходит во внешнюю сторону другой грани, и образуемая стыкующимися гранями общая поверхность не должна иметь самопересечений.

На рис. 1 приведено множество связанных между собой граней. Все рёбра граней входят в два цикла, у всех рёбер указатели facePlus и faceMinus не равны нулю, а кривые MbSurfaceIntersectionCurve, на которых построены рёбра граней, имеют curveOne.surface != curveTwo.surface.

../../../../_images/O.7.8.1.png

Рис. 1

Грани, приведённые на рисунке, образуют общую замкнутую поверхность, внешняя сторона каждой грани переходит во внешнюю сторону соседней грани. У множества граней, не имеющего ни одного краевого ребра, признак closed принимает значение true.

Если хотя бы одна грань множества имеет хотя бы одно краевое ребро, то признак closed множества граней принимает значение false. На рис. 2 приведено множество граней, некоторые из которых имеют краевые рёбра. Краевые рёбра входят только в один цикл и у краевых рёбер грани только один из указателей facePlus или faceMinus не равен нулю, а кривые MbSurfaceIntersectionCurve, на которых построены рёбра, имеют curveOne.surface == curveTwo.surface и параметр buildType = cbt_Boundary. Полюсное ребро не является краевым, так как не образует край.

../../../../_images/O.7.8.2.png

Рис. 2

Связное множество граней называют замкнутой оболочкой, если грани множества не имеют края. Если стыкующиеся друг с другом грани имеют хотя бы одно краевое ребро, то такое связное множество граней называют незамкнутой оболочкой. Подчеркнём, что замкнутая оболочка и незамкнутая оболочка представляют собой связное множество стыкующихся друг с другом граней.

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

../../../../_images/O.7.8.3.png

Рис. 3

Формально на грани множества не наложено никаких ограничений. Множество граней может состоять из отдельных граней. На рис. 4 приведено множество не связанных между собой граней. Каждая грань, приведённая на рис., образует отдельную оболочку, все рёбра граней являются краевыми.

../../../../_images/O.7.8.4.png

Рис. 4

Основными методами оболочки являются методы преобразования её в пространстве:

void Move( const MbVector3D & v, MbRegTransform * iReg = NULL ),

void Rotate( const MbAxis3D & axis, double angle, MbRegTransform * iReg = NULL ),

void Transform( const MbMatrix3D & m, MbRegTransform * iReg = NULL ),

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

bool DistanceToBound( const MbCartPoint3D &, …),

bool PointClassification( const MbCartPoint3D &, …).

Незамкнутая оболочка описывает только часть граничной поверхности моделируемого объекта. Незамкнутые оболочки используются для поверхностного моделирования. Если к замкнутой оболочке добавить множество точек, лежащих внутри неё, то мы получим твердое тело. Замкнутые оболочки используются для твердотельного моделирования. Обрезка и стыковка граней выполняется одновременно с построением оболочки. Это обеспечивают методы геометрического ядра C3D. На базе замкнутых и незамкнутых оболочек строятся объекты геометрической модели.