61 lines
1.3 KiB
C++
61 lines
1.3 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
|
|
#ifndef APPARENT_VELOCITY_HELPER_H
|
|
#define APPARENT_VELOCITY_HELPER_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
inline float CalcDistance(float x, float y) { return x - y; }
|
|
|
|
inline float CalcDistance(const Vector &a, const Vector &b) {
|
|
return a.DistTo(b);
|
|
}
|
|
|
|
template <class T>
|
|
class CDefaultCalcDistance {
|
|
public:
|
|
static inline float CalcDistance(const T &a, const T &b) {
|
|
return ::CalcDistance(a, b);
|
|
}
|
|
};
|
|
|
|
class CCalcDistance2D {
|
|
public:
|
|
static inline float CalcDistance(const Vector &a, const Vector &b) {
|
|
return (a - b).Length2D();
|
|
}
|
|
};
|
|
|
|
template <class T, class Functor = CDefaultCalcDistance<T> >
|
|
class CApparentVelocity {
|
|
public:
|
|
CApparentVelocity(const T &t0) {
|
|
m_LastTime = -1;
|
|
m_LastValue = t0;
|
|
}
|
|
|
|
float AddSample(float time, T value) {
|
|
float flRet = 0;
|
|
if (m_LastTime != -1) {
|
|
flRet =
|
|
Functor::CalcDistance(value, m_LastValue) / (time - m_LastTime);
|
|
}
|
|
|
|
m_LastTime = time;
|
|
m_LastValue = value;
|
|
|
|
return flRet;
|
|
}
|
|
|
|
private:
|
|
T m_LastValue;
|
|
float m_LastTime;
|
|
};
|
|
|
|
#endif // APPARENT_VELOCITY_HELPER_H
|