Сплайн на плоскости

В этом разделе описывается сплайн 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();
    }
    Def<double> getParFromX ( double x ) const;
    Def<double> getParFromY ( double y ) const;
    double getX ( double par ) const
    {
        return c.x + ( b.x + a.x * par ) * par;
    }
    double getY ( double par ) const
    {
        return c.y + ( b.y + a.y * par ) * par;
    }
    double getLength ( double par = 1 ) const;
    double getCurvature ( double par ) const;
    double getCurvatureAvg () const;
};

Имеются две функции getPoint. Одна из них возвращает точку кривой с указанной нормалью, если такая есть, а вторая возвращает точку по параметру в диапазоне от 0 ( точка p1 ) до 1 ( точка p2 ). Функция getNormal возвращает нормаль к кривой. Функции getParFromX и getParFromY находят значение параметра ( если оно существует ) для заданных координат x или y. Функции getX и getY возвращают значения координат точки кривой по параметру. Функция getLength находит длину дуги от 0 до значения par. Функция getCurvature вычисляет кривизну в указанной точке, а функция getCurvatureAvg возвращает среднюю кривизну дуги на интервале [0, 1].

Пример использования этого класса можно посмотреть в приложении DEMO.

Описание класса Vector2d находится здесь.
Описание шаблона классов Def находится здесь.

Исходники находятся в approx2d.cpp

Наверх