Символьная кривая MbCharacterCurve3D

Класс MbCharacterCurve3D объявлен в файле cur_character_curve3d.h.

Символьная кривая описывается координатными функциями xFunction, yFunction, zFunction, локальной системой координат MbPlacement3D position функций, матрицей трансформации transform, граничными значениями области определения параметра кривой tmin и tmax, признаком периодичности кривой closed и типом системы координат (декартова, цилиндрическая, сферическая) coordinateType, в которой заданы координатные функции. У кривой есть ещё некоторые данные, которые не обязательны и служат для ускорения работы методов кривой.

Координатные функции xFunction(t), yFunction(t), zFunction(t) символьной кривой представляют собой скалярные функции общего параметра t и заданы в виде символьных выражений. Для каждого символьного выражения выполнен лексический анализ и построено дерево, которое вычисляет значение символьного выражения для заданного параметра и производные символьного выражения по параметру. Параметр кривой t принимает значения на отрезке: tmin ≤ t ≤ tmax.

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

\[\mathbf{r}(t) = [xFunction(t)\ yFunction(t)\ zFunction(t)].\]

Символьная кривая приведена на рис. 1:

../../../../_images/O.4.13.1.png

Рис. 1

Кривая может быть периодической. Символьные выражения на области определения кривой должны описывать непрерывные конечные и однозначные функции.

Синтаксический анализатор входных выражений распознает базовые математические операции с учётом приоритетов и скобок: сложение (+), вычитание (-), умножение (*), деление (/), возведение в степень (^), а также унарный минус (-). Операции осуществляются над переменными, константами и функциями.

Синтаксический анализатор распознаёт имена основных математических функций, которые приведены в таблице 1:

Имя функции

Описание

sin

синус

cos

косинус

tan

тангенс

sind

синус, входной аргумент задаётся в градусах

cosd

косинус, входной аргумент задаётся в градусах

tand

тангенс, входной аргумент задаётся в градусах

asin

арксинус

acos

арккосинус

atan

арктангенс

asind

арксинус, значение выходного параметра в градусах

acosd

арккосинус, значение выходного параметра в градусах

atand

арктангенс, значение выходного параметра в градусах

sqrt

квадратный корень

exp

экспонента

ln

натуральный логарифм

lg

десятичный логарифм

deg

функция конвертации радиан в градусы

rad

функция конвертации градусов в радианы

abs

модуль

Неименованные константы (числа) могут быть заданы как числа с плавающей точкой (строка из цифр, разделённых точкой), либо в формате целого числа.

В символьных выражениях возможно использование именованных констант, приведённых в таблице 2:

Имя константы

Описание

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 в нуле может быть вычислено неверно.

Ниже приведён пример кода, демонстрирующий возможность создания символьной трёхмерной кривой.

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<MbFunction> x( factory.CreateAnalyticalFunction( xFunction, argument, t1, t2, true ) );
    SPtr<MbFunction> y( factory.CreateAnalyticalFunction( yFunction, argument, t1, t2, true ) );
    SPtr<MbFunction> 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;
}