Кривая пересечения поверхностей MbSurfaceIntersectionCurve

Класс MbSurfaceIntersectionCurve объявлен в файле cur_surface_intersection.h.

Кривая пересечения поверхностей MbSurfaceIntersectionCurve описывается двумя кривыми MbSurfaceCurve curveOne и MbSurfaceCurve curveTwo на пересекающихся поверхностях, параметром построения buildType и точностью tolerance. У кривой есть ещё некоторые данные, которые не обязательны и служат для ускорения работы методов кривой.

Кривые curveOne(t) и curveTwo(t) имеют одинаковые области определения параметра t и совпадают в пространстве с некоторой известной точностью. Параметр buildType кривой пересечения описывает тип кривой и несет информацию о способе вычисления радиуса-вектора точки кривой. Параметр buildType принимает значения: cbt_Specific, cbt_Ordinary, cbt_Boundary, cbt_Tolerant. На рис. 1 приведены две поверхности и кривая их пересечения:

../../../../_images/O.4.24.1.png

Рис. 1

На рис. 2 и 3 приведены кривые на поверхностях, из которых строится кривая пересечения.

../../../../_images/O.4.24.2.png

Рис. 2

../../../../_images/O.4.24.3.png

Рис. 3

В общем случае кривая пересечения имеет тип cbt_Specific, двумерные кривые curveOne.curve и curveTwo.curve являются сплайнами и аппроксимируют пересечение поверхностей curveOne.surface и curveTwo.surface. Сплайны на поверхностях имеют согласованные контрольные точки. В контрольных точках сплайны на поверхностях curveOne и curveTwo совпадают и имеют одинаковые значения параметров. На участках между контрольными точками сплайнов кривая MbSurfaceIntersectionCurve также выдает точное значение радиуса-вектора точки. В общем случае точка кривой пересечения поверхностей вычисляется итерационным методом, использующим двумерные кривые curveOne.*curve* и curveTwo.*curve* в качестве начального приближения.

В частных случаях кривая пересечения имеет типы cbt_Ordinary, cbt_Boundary, cbt_Tolerant, а точка кривой пересечения поверхностей вычисляется как среднее арифметическое радиусов-векторов кривых curveOne(t) и curveTwo(t).

Если buildType = cbt_Ordinary, то кривая MbSurfaceIntersectionCurve точно описывает пересечение поверхностей, а кривые curveOne(t) и curveTwo(t) совпадают в пространстве. Примером такой кривой может служить кривая пересечения плоскости и цилиндрической поверхности, ось которой ортогональна плоскости, рис. 4.

../../../../_images/O.4.24.4.png

Рис. 4

На плоскости curveOne. curve является окружностью, а на цилиндрической поверхности curveTwo. curve является отрезком с параметрической длиной, равной параметрической длине двумерной кривой на плоскости. Равенство параметрических длин достигается построением на базе отрезка репараметризованной кривой MbReparamCurve.

Если buildType = cbt_Boundary, то кривая MbSurfaceIntersectionCurve описывает край поверхности, рис. 5. Для такой кривой выполняются равенства curveOne.*curve* = curveTwo.*curve* и curveOne.surface = curveTwo.surface.

../../../../_images/O.4.24.5.png

Рис. 5

Если buildType = cbt_Tolerant, то кривая MbSurfaceIntersectionCurve описывает пересечение поверхностей приближённо. Кривые curveOne*(*t) и curveTwo(*t*) совпадают в пространстве с точностью tolerance. Такие кривые строятся в тех случаях, когда другое построение невозможно, например, при необходимости пересечь две поверхности, касающиеся друг друга не точно, а с некоторым «шумом».

В методе PointOn( double & t, MbMatrix3D & r ) радиус-вектор кривой r описывается векторной функцией

\[\mathbf{r}(t) = 0.5 \left( \mathbf{curveOne.surface}(u_1, v_1) + \mathbf{curveTwo.surface}(u_2, v_2) \right),\]

где u1, v1 – координаты двумерной точки, начальное приближение которой вычисляется методом curveOne.*curve* –> PointOn( t, point1 ), u1 = point1.x, v1 = point1.y, u2, v2 – координаты двумерной точки, начальное приближение которой вычисляется методом curveTwo.*curve* –> PointOn( t, point2 ), u2 = point2.x, v2 = point2.y. Далее в общем случае (buildType = cbt_Specific) параметры u1, v1, u2, v2 уточняются итерационным методом, использующим уравнения

\[\mathbf{curveOne.surface}(u_1, v_1) = \mathbf{plane}(x, y),\]
\[\mathbf{curveTwo.surface}(u_2, v_2) = \mathbf{plane}(x, y),\]

где plane – плоскость, перпендикулярная отрезку, соединяющему две ближайшие контрольные точки кривой пересечения. Кривая пересечения в общем случае и контрольные точки, по которым построены кривые curveOne и curveTwo, приведены на рис. 6.

../../../../_images/O.4.24.6.png

Рис. 6

Область определения параметра кривой пересечения совпадает с областью определения общего параметра кривых curveOne* и curveTwo. Кривая пересечения поверхностей может быть периодической.

Кривая пересечения поверхностей среди своих данных содержит трёхмерную кривую spaceCurve, которая с точностью tolerance совпадает с кривой пересечения. Кривая spaceCurve используется для построения плоских проекций рёбер. Кривая spaceCurve является вспомогательным объектом и рассчитывается только при необходимости.