This commit is contained in:
romkazvo
2023-08-07 19:29:24 +08:00
commit 34d6c5d489
4832 changed files with 1389451 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
//////////////////////////////////////////////////////////////////////
//
// CryEngine Source code
//
// File:BSplineknots.h
// Declaration of class BSplineKnots
//
// History:
// 06/17/2002 :Created by Sergiy Migdalskiy <sergiy@crytek.de>
//
//////////////////////////////////////////////////////////////////////
#pragma once
//////////////////////////////////////////////////////////////
// class BSplineKnots
//
// This class represents the array of knots used to calculate
// basis functions of the given degree over the range
// [knot[degree] .. knot [N-degree]] , N being the total number of knots
//
// NOTE:
// order == degree+1
// There are always N-degree-1 control points
// This class incorporates neither control point nor degree info
//////////////////////////////////////////////////////////////
class BSplineKnots
{
public:
// the abscissae and ordinates
typedef float Time;
typedef float Value;
// standard scaling between Max and BSpline knot times: max time = g_nStdTicksPerSecond * bspline time
//enum {g_nStdTicksPerSecond = 160};
// allocates the array of the given number of knots, does NOT initialize the knots
BSplineKnots(int numKnots);
~BSplineKnots(void);
Time& operator [] (int nKnot)
{
assert (nKnot >= 0 && nKnot < m_numKnots);
return m_pKnots[nKnot];
}
Time operator [] (int nKnot) const
{
assert (nKnot >= 0 && nKnot < m_numKnots);
return m_pKnots[nKnot];
}
// searches and returns the interval to which the given time belongs.
// each pair of knots defines interval [k1,k2)
// -1 is before the 0-th knot, numKnots() is after the last knot
int findInterval (Time fTime)const;
// number of knots
int numKnots() const
{
return m_numKnots;
}
// returns the i-th basis function of degree d, given the time t
Value getBasis (int i, int d, Time t) const;
// returns the i-th basis function of degree d, given the time t and a hint, in which interval to search for it
Value getBasis (int i, int d, Time t, int nIntervalT) const;
// returns the time where the i-th given basis reaches its maximum
Time getBasisPeak (int i/*nStartKnot*/, int d/*nDegree*/);
// returns the i-th basis d-th derivative discontinuity at knot k
// (amplitude of the delta function)
Value getDelta (int i, int d, int k) const;
// Returns the P (product) penalty for knot closeness, as defined by Mary J. Lindstrom "Penalized Estimation of Free Knot Splines" 1999,
// logarithmic form
double getKnotProductPenalty(int nStartKnot, int nEndKnot);
protected:
// returns the value of the basis function of degree d, given the time t
// the knots of the basis function start at pKnotBegin, and the first knot before t is pKnotBeforeT
Value getBasis (const Time* pKnotBegin, int d, Time t, const Time* pKnotBeforeT)const;
// number of knots
int m_numKnots;
// the array of knots
// no assumption is made about the multiplicity of knots
Time *m_pKnots;
};