.. role:: blue :class: blue Символьная кривая MbCharacterCurve3D ==================================== .. _MbCharacterCurve3D_Character_Curve: .. версия ядра: Класс :blue:`MbCharacterCurve3D` объявлен в файле *cur_character_curve3d.h*. Символьная кривая описывается координатными функциями *xFunction*, *yFunction*, *zFunction*, локальной системой координат :ref:`MbPlacement3D ` **position** функций, матрицей трансформации **transform**, граничными значениями области определения параметра кривой *tmin* и *tmax*, признаком периодичности кривой *closed* и типом системы координат (декартова, цилиндрическая, сферическая) *coordinateType*, в которой заданы координатные функции. У кривой есть ещё некоторые данные, которые не обязательны и служат для ускорения работы методов кривой. Координатные функции *xFunction*\(t), *yFunction*\(t), *zFunction*\(t) символьной кривой представляют собой скалярные функции общего параметра *t* и заданы в виде символьных выражений. Для каждого символьного выражения выполнен лексический анализ и построено дерево, которое вычисляет значение символьного выражения для заданного параметра и производные символьного выражения по параметру. Параметр кривой *t* принимает значения на отрезке: *tmin* ≤ *t* ≤ *tmax*. В методе :blue:`PointOn`\( double & *t*, :ref:`MbCartPoint3D ` & **r**) радиус-вектор кривой **r** описывается векторной функцией .. math:: \mathbf{r}(t) = [xFunction(t)\ yFunction(t)\ zFunction(t)]. Символьная кривая приведена на рис. 1: .. figure:: /MODELER/CURVES/pictures/O.4.13.1.png :width: 15cm :align: center Рис. 1 Кривая может быть периодической. Символьные выражения на области определения кривой должны описывать непрерывные конечные и однозначные функции. Синтаксический анализатор входных выражений распознает базовые математические операции с учётом приоритетов и скобок: сложение (+), вычитание (-), умножение (*), деление (/), возведение в степень (^), а также унарный минус (-). Операции осуществляются над переменными, константами и функциями. Синтаксический анализатор распознаёт имена основных математических функций, которые приведены в таблице 1: .. list-table:: :widths: 30 70 :header-rows: 1 * - **Имя функции** - **Описание** * - sin - синус * - cos - косинус * - tan - тангенс * - sind - синус, входной аргумент задаётся в градусах * - cosd - косинус, входной аргумент задаётся в градусах * - tand - тангенс, входной аргумент задаётся в градусах * - asin - арксинус * - acos - арккосинус * - atan - арктангенс * - asind - арксинус, значение выходного параметра в градусах * - acosd - арккосинус, значение выходного параметра в градусах * - atand - арктангенс, значение выходного параметра в градусах * - sqrt - квадратный корень * - exp - экспонента * - ln - натуральный логарифм * - lg - десятичный логарифм * - deg - функция конвертации радиан в градусы * - rad - функция конвертации градусов в радианы * - abs - модуль Неименованные константы (числа) могут быть заданы как числа с плавающей точкой (строка из цифр, разделённых точкой), либо в формате целого числа. В символьных выражениях возможно использование именованных констант, приведённых в таблице 2: .. list-table:: :widths: 30 70 :header-rows: 1 * - **Имя константы** - **Описание** * - M_PI - *π* — отношение длины окружности к её диаметру * - M_PI_2 - *π / 2* * - M_PI_4 - *π / 4* * - M_SQRT2 - *√2* * - M_E - *e* — экспонента * - M_FI - *φ* — число золотого сечения * - M_RADDEG - *180 / π* — коэффициент перевода радиан в градусы * - M_DEGRAD - *π / 180* — коэффициент перевода градусов в радианы Именем переменной аналитического выражения может являться последовательность строковых и числовых литералов (первый символ — литерал строкового типа), которая не совпадает с именами функций и именами констант. Ограничения при создании символьной кривой: - максимальная длина переменной — 512 символов; - максимальная длина выражения — 2048 символов; - отсутствие операций интегрирования, дифференцирования, вычисления пределов функций; - отсутствие возможности упрощения математических выражений (например, сокращения дробей). Ввиду имеющихся ограничений верное вычисление значения аналитического выражения может быть получено для относительно простых математических выражений и функций. Например, значение отношения *sin*\ (\ *x*\ )/\ *x* в нуле может быть вычислено неверно. Ниже приведён пример кода, демонстрирующий возможность создания символьной трёхмерной кривой. .. code-block:: cpp MbCharacterCurve3D * CreateAnalyticalCurve3D() { MbCharacterCurve3D * curve( nullptr ); // Строковые представления заданных координатных функций. string_t xFunction = _T( "100*cos(t)-20*cos(4*t)" ); string_t yFunction = _T( "100*sin(t)-20*sin(4*t)" ); string_t zFunction = _T( "t*10" ); string_t argument = _T( "t" ); double t1 = 0.0, t2 = 5.0 * M_PI; // Создание аналитических координатных функций с помощью фабрики функций. MbFunctionFactory factory; SPtr x( factory.CreateAnalyticalFunction( xFunction, argument, t1, t2, true ) ); SPtr y( factory.CreateAnalyticalFunction( yFunction, argument, t1, t2, true ) ); SPtr z( factory.CreateAnalyticalFunction( zFunction, argument, t1, t2, true ) ); if ( x != nullptr && y != nullptr && z != nullptr ) { MbCartPoint3D point( 0.0, 0.0, 0.0 ); // Начало локальной системы координат. MbVector3D axisX( 1.0, 0.0, 0.0 ); MbVector3D axisY( 0.0, 1.0, 0.0 ); MbPlacement3D place( point, axisX, axisY ); // Локальная система координат. MbeLocalSystemType3D cs = ls_CartesianSystem; // Тип локальной системы координат. // Создание символьной трёхмерной кривой. curve = new MbCharacterCurve3D( *x, *y, *z, cs, place, t1, t2 ); } return curve; }