예제 #1
0
void BSpline::setCoefficients(const DenseVector &coefficients)
{
    if (coefficients.size() != getNumBasisFunctions())
        throw Exception("BSpline::setControlPoints: Incompatible size of coefficient vector.");

    this->coefficients = coefficients;
    checkControlPoints();
}
예제 #2
0
BSpline::BSpline(DenseVector coefficients, std::vector<std::vector<double>> knotVectors, std::vector<unsigned int> basisDegrees)
    : Function(knotVectors.size()),
      basis(BSplineBasis(knotVectors, basisDegrees)),
      coefficients(coefficients),
      knotaverages(computeKnotAverages())
{
    setCoefficients(coefficients);

    checkControlPoints();
}
예제 #3
0
/*
 * Constructors for multivariate B-spline using explicit data
 */
BSpline::BSpline(std::vector<std::vector<double>> knotVectors, std::vector<unsigned int> basisDegrees)
    : Function(knotVectors.size()),
      basis(BSplineBasis(knotVectors, basisDegrees)),
      coefficients(DenseVector::Zero(1)),
      knotaverages(computeKnotAverages())
{
    // Initialize coefficients to ones
    setCoefficients(DenseVector::Ones(basis.getNumBasisFunctions()));

    checkControlPoints();
}
예제 #4
0
void BSpline::setControlPoints(const DenseMatrix &controlPoints)
{
    if (controlPoints.cols() != numVariables + 1)
        throw Exception("BSpline::setControlPoints: Incompatible size of control point matrix.");

    int nc = controlPoints.rows();

    knotaverages = controlPoints.block(0, 0, nc, numVariables);
    coefficients = controlPoints.block(0, numVariables, nc, 1);

    checkControlPoints();
}
예제 #5
0
PSpline::PSpline(const DataTable &samples, double lambda)
    : lambda(lambda)
{
    // Check data
    assert(samples.isGridComplete());

    std::vector< std::vector<double> > xdata = samples.getTableX();

    numVariables = samples.getNumVariables();

    // Assuming a cubic spline
    std::vector<unsigned int> basisDegrees(samples.getNumVariables(), 3);
    basis = BSplineBasis(xdata, basisDegrees, KnotVectorType::FREE);
    computeControlPoints(samples);

    init();

    checkControlPoints();
}