Дифференциальные свойства кривой в OpenCascade
Дифференциальные свойства кривой в библиотеке OpenCascade можно вычислить следующим образом (сценарий Draw):
pload MODELING # format: degree, number of knots, knot with mult, pole with w bsplinecurve bc 2 3 0 3 1 1 2 3 10 0 7 1 7 0 7 1 3 0 8 1 0 0 7 1 front; fit # XOZ plane set param 1.5 cvalue bc $param x y z; point p x y z localprop bc $param
Скопируйте этот скрипт в консоль Draw, чтобы увидеть результат.
Команда cvalue вычисляет значение кривой по параметру param. Команда localprop вычисляет дифференциальные свойства, такие как кривизна и соприкасающаяся окружность (показана зеленым цветом на снимке с экрана). Чтобы увидеть реализацию функции localprop на C++, даем следующую команду в Draw:
getsource localprop
Консоль укажет, где искать реализацию: /src/GeomliteTest/GeomliteTest_CurveCommands.cxx. Приведем кусок кода здесь для удобства:
//-------------------------------------------- // Code snippet to build an osculating circle //-------------------------------------------- Handle(Geom_Circle) osculatingCircle; // This is the result // CURVE is your curve being analyzed GeomLProp_CLProps CLProp( CURVE, 2, Precision::Confusion() ); CLProp.SetParameter(t_onCurve); // Pass your parameter on curve here // if ( CLProp.IsTangentDefined() ) { const double K = CLProp.Curvature(); if ( Abs(K) > Precision::Confusion() ) { const double r_onCurve = 1/Abs(K); // Radius of curvature // Calculate the center of curvature gp_Pnt center_onCurve; CLProp.CentreOfCurvature(center_onCurve); // Build the osculating circle manually gp_Dir tang_onCurve, norm_onCurve; CLProp.Tangent(tang_onCurve); CLProp.Normal(norm_onCurve); gp_Dir axDir_ofCircle = norm_onCurve ^ tang_onCurve; // Cross product gp_Ax2 ax_ofCircle(center_onCurve, axDir_ofCircle, norm_onCurve); // Construct the osculating circle finally osculatingCircle = new Geom_Circle(ax_ofCircle, r_onCurve); } }