Дифференциальная геометрия

Подписаться на эту рубрику по RSS

Дифференциальные свойства кривой в 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);
    }
  }