.. role:: blue :class: blue Кривая пересечения поверхностей MbSurfaceIntersectionCurve =========================================================== .. _MbSurfaceIntersectionCurve_Surface_Intersection_Curve: .. версия ядра: Класс :blue:`MbSurfaceIntersectionCurve` объявлен в файле *cur_surface_intersection.h*. Кривая пересечения поверхностей MbSurfaceIntersectionCurve описывается двумя кривыми :blue:`MbSurfaceCurve` **curveOne** и :ref:`MbSurfaceCurve ` **curveTwo** на пересекающихся поверхностях, параметром построения **buildType** и точностью **tolerance**. У кривой есть ещё некоторые данные, которые не обязательны и служат для ускорения работы методов кривой. Кривые **curveOne**\(\ *t*) и **curveTwo**\(\ *t*) имеют одинаковые области определения параметра *t* и совпадают в пространстве с некоторой известной точностью. Параметр **buildType** кривой пересечения описывает тип кривой и несет информацию о способе вычисления радиуса-вектора точки кривой. Параметр **buildType** принимает значения: *cbt_Specific*, *cbt_Ordinary*, *cbt_Boundary*, *cbt_Tolerant*. На рис. 1 приведены две поверхности и кривая их пересечения: .. figure:: /MODELER/CURVES/pictures/O.4.24.1.png :width: 10cm :align: center Рис. 1 На рис. 2 и 3 приведены кривые на поверхностях, из которых строится кривая пересечения. .. figure:: /MODELER/CURVES/pictures/O.4.24.2.png :width: 10cm :align: center Рис. 2 .. figure:: /MODELER/CURVES/pictures/O.4.24.3.png :width: 10cm :align: center Рис. 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. .. figure:: /MODELER/CURVES/pictures/O.4.24.4.png :width: 10cm :align: center Рис. 4 На плоскости **curveOne**\. *curve* является окружностью, а на цилиндрической поверхности **curveTwo**\. *curve* является отрезком с параметрической длиной, равной параметрической длине двумерной кривой на плоскости. Равенство параметрических длин достигается построением на базе отрезка репараметризованной кривой :ref:`MbReparamCurve `. Если *buildType = cbt_Boundary*, то кривая MbSurfaceIntersectionCurve описывает край поверхности, рис. 5. Для такой кривой выполняются равенства *curveOne*.*curve* = *curveTwo*.*curve* и *curveOne.surface* = *curveTwo.surface*. .. figure:: /MODELER/CURVES/pictures/O.4.24.5.png :width: 10cm :align: center Рис. 5 Если *buildType = cbt_Tolerant*, то кривая MbSurfaceIntersectionCurve описывает пересечение поверхностей приближённо. Кривые *curveOne*(*t*) и **curveTwo**\(\*t*) совпадают в пространстве с точностью **tolerance**. Такие кривые строятся в тех случаях, когда другое построение невозможно, например, при необходимости пересечь две поверхности, касающиеся друг друга не точно, а с некоторым «шумом». В методе :blue:`PointOn`\( double & *t*, :blue:`MbMatrix3D` & *r* ) радиус-вектор кривой *r* описывается векторной функцией .. math:: \mathbf{r}(t) = 0.5 \left( \mathbf{curveOne.surface}(u_1, v_1) + \mathbf{curveTwo.surface}(u_2, v_2) \right), где *u*\ :sub:`1`, *v*\ :sub:`1` -- координаты двумерной точки, начальное приближение которой вычисляется методом *curveOne*.*curve* --\> :blue:`PointOn`\( *t*, *point1* ), *u*\ :sub:`1` = *point1.x*, *v*\ :sub:`1` = *point1.y*, *u*\ :sub:`2`, *v*\ :sub:`2` -- координаты двумерной точки, начальное приближение которой вычисляется методом *curveTwo*.*curve* --\> :blue:`PointOn`\( *t*, *point2* ), *u*\ :sub:`2` = *point2.x*, *v*\ :sub:`2` = *point2.y*. Далее в общем случае (*buildType = cbt_Specific*) параметры *u*\ :sub:`1`, *v*\ :sub:`1`, *u*\ :sub:`2`, *v*\ :sub:`2` уточняются итерационным методом, использующим уравнения .. math:: \mathbf{curveOne.surface}(u_1, v_1) = \mathbf{plane}(x, y), .. math:: \mathbf{curveTwo.surface}(u_2, v_2) = \mathbf{plane}(x, y), где **plane** -- плоскость, перпендикулярная отрезку, соединяющему две ближайшие контрольные точки кривой пересечения. Кривая пересечения в общем случае и контрольные точки, по которым построены кривые **curveOne** и **curveTwo**, приведены на рис. 6. .. figure:: /MODELER/CURVES/pictures/O.4.24.6.png :width: 10cm :align: center Рис. 6 Область определения параметра кривой пересечения совпадает с областью определения общего параметра кривых **curveOne*** и **curveTwo**. Кривая пересечения поверхностей может быть периодической. Кривая пересечения поверхностей среди своих данных содержит трёхмерную кривую **spaceCurve**, которая с точностью **tolerance** совпадает с кривой пересечения. Кривая **spaceCurve** используется для построения плоских проекций рёбер. Кривая **spaceCurve** является вспомогательным объектом и рассчитывается только при необходимости.