You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.7 KiB
119 lines
3.7 KiB
3 months ago
|
// David Eberly, Geometric Tools, Redmond WA 98052
|
||
|
// Copyright (c) 1998-2021
|
||
|
// Distributed under the Boost Software License, Version 1.0.
|
||
|
// https://www.boost.org/LICENSE_1_0.txt
|
||
|
// https://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
|
||
|
// Version: 4.0.2019.08.13
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <Mathematics/ParametricCurve.h>
|
||
|
#include <Mathematics/Polynomial1.h>
|
||
|
|
||
|
namespace gte
|
||
|
{
|
||
|
template <int N, typename Real>
|
||
|
class PolynomialCurve : public ParametricCurve<N, Real>
|
||
|
{
|
||
|
public:
|
||
|
// Construction and destruction. The default constructor creates a
|
||
|
// polynomial curve with all components set to the constant zero (all
|
||
|
// degree-0 polynomials). You can set these to other polynomials
|
||
|
// using member accessors.
|
||
|
PolynomialCurve(Real tmin, Real tmax)
|
||
|
:
|
||
|
ParametricCurve<N, Real>(tmin, tmax)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
PolynomialCurve(Real tmin, Real tmax,
|
||
|
std::array<Polynomial1<Real>, N> const& components)
|
||
|
:
|
||
|
ParametricCurve<N, Real>(tmin, tmax)
|
||
|
{
|
||
|
for (int i = 0; i < N; ++i)
|
||
|
{
|
||
|
SetPolynomial(i, components[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual ~PolynomialCurve()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
// Member access.
|
||
|
void SetPolynomial(int i, Polynomial1<Real> const& poly)
|
||
|
{
|
||
|
mPolynomial[i] = poly;
|
||
|
mDer1Polynomial[i] = mPolynomial[i].GetDerivative();
|
||
|
mDer2Polynomial[i] = mDer1Polynomial[i].GetDerivative();
|
||
|
mDer3Polynomial[i] = mDer2Polynomial[i].GetDerivative();
|
||
|
}
|
||
|
|
||
|
inline Polynomial1<Real> const& GetPolynomial(int i) const
|
||
|
{
|
||
|
return mPolynomial[i];
|
||
|
}
|
||
|
|
||
|
inline Polynomial1<Real> const& GetDer1Polynomial(int i) const
|
||
|
{
|
||
|
return mDer1Polynomial[i];
|
||
|
}
|
||
|
|
||
|
inline Polynomial1<Real> const& GetDer2Polynomial(int i) const
|
||
|
{
|
||
|
return mDer2Polynomial[i];
|
||
|
}
|
||
|
|
||
|
inline Polynomial1<Real> const& GetDer3Polynomial(int i) const
|
||
|
{
|
||
|
return mDer3Polynomial[i];
|
||
|
}
|
||
|
|
||
|
// Evaluation of the curve. The function supports derivative
|
||
|
// calculation through order 3; that is, order <= 3 is required. If
|
||
|
// you want/ only the position, pass in order of 0. If you want the
|
||
|
// position and first derivative, pass in order of 1, and so on. The
|
||
|
// output array 'jet' must have enough storage to support the maximum
|
||
|
// order. The values are ordered as: position, first derivative,
|
||
|
// second derivative, third derivative.
|
||
|
virtual void Evaluate(Real t, unsigned int order, Vector<N, Real>* jet) const override
|
||
|
{
|
||
|
for (int i = 0; i < N; ++i)
|
||
|
{
|
||
|
jet[0][i] = mPolynomial[i](t);
|
||
|
}
|
||
|
|
||
|
if (order >= 1)
|
||
|
{
|
||
|
for (int i = 0; i < N; ++i)
|
||
|
{
|
||
|
jet[1][i] = mDer1Polynomial[i](t);
|
||
|
}
|
||
|
|
||
|
if (order >= 2)
|
||
|
{
|
||
|
for (int i = 0; i < N; ++i)
|
||
|
{
|
||
|
jet[2][i] = mDer2Polynomial[i](t);
|
||
|
}
|
||
|
|
||
|
if (order == 3)
|
||
|
{
|
||
|
for (int i = 0; i < N; ++i)
|
||
|
{
|
||
|
jet[3][i] = mDer3Polynomial[i](t);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
std::array<Polynomial1<Real>, N> mPolynomial;
|
||
|
std::array<Polynomial1<Real>, N> mDer1Polynomial;
|
||
|
std::array<Polynomial1<Real>, N> mDer2Polynomial;
|
||
|
std::array<Polynomial1<Real>, N> mDer3Polynomial;
|
||
|
};
|
||
|
}
|