123
This commit is contained in:
91
CryAnimation/BSplineKnots.h
Normal file
91
CryAnimation/BSplineKnots.h
Normal 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;
|
||||
};
|
||||
Reference in New Issue
Block a user