Символьная кривая 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 описывается векторной функцией
Символьная кривая приведена на рис. 1:
Рис. 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;
}