|
В этом разделе описывается сплайн 2-го порядка, который задаётся двумя точками ( концы сплайна ) и двумя нормалями в этих точках ( необязательно единичными ):
class Spline2d
{
Vector2d a, b, c;
mutable bool isDef;
mutable Def<double> curv;
mutable double aa, ab, bb, aaa, abc;
public:
Spline2d () {}
Spline2d ( const Vector2d & p1, const Vector2d & p2, const Vector2d & n1, const Vector2d & n2 );
Def<Vector2d> getPoint ( const Vector2d & norm ) const;
Vector2d getPoint ( double par ) const
{
return c + ( b + a * par ) * par;
}
Vector2d getNormal ( double par ) const
{
return ( b + a * ( par + par ) ).rightPerpendicular().setNorm2();
}
double getLength ( double par = 1 ) const;
double getCurvature ( double par ) const;
double getCurvatureAvg () const;
};
Имеются две функции getPoint. Одна из них возвращает точку кривой с указанной нормалью, если такая есть, а вторая возвращает точку по параметру в диапазоне от 0 ( точка p1 ) до 1 ( точка p2 ). Функция getNormal возвращает нормаль, функция getLength - длину, функция getCurvature - кривизну кривой по параметру, а функция getCurvatureAvg - среднюю кривизну дуги. Пример использования этого класса можно посмотреть в приложении DEMO.
Описание класса Vector2d находится здесь.
Исходники находятся в approx2d.cpp Наверх |