#include <mouse_smoother.h>
Nevrax France
Definition at line 44 of file mouse_smoother.h.
Public Member Functions | |
| CMouseSmoother (double samplingPeriod=0.2) | |
| double | getSamplingPeriod () const |
| void | reset () |
| CVector2f | samplePos (const CVector2f &wantedPos, double date) |
| void | setSamplingPeriod (double period) |
Private Attributes | |
| bool | _Init |
| CSample | _Sample [4] |
| double | _SamplingPeriod |
|
|
Definition at line 53 of file mouse_smoother.cpp. References _Init, _SamplingPeriod, and nlassert.
00054 {
00055 nlassert(samplingPeriod > 0);
00056 _SamplingPeriod = samplingPeriod;
00057 _Init = false;
00058 }
|
|
|
Definition at line 54 of file mouse_smoother.h. References _SamplingPeriod.
00054 { return _SamplingPeriod; }
|
|
|
Definition at line 136 of file mouse_smoother.cpp. References _Init. Referenced by setSamplingPeriod().
00137 {
00138 _Init = false;
00139 }
|
|
||||||||||||
|
Definition at line 72 of file mouse_smoother.cpp. References _Init, _SamplingPeriod, NLMISC::BuildHermiteVector(), NLMISC::clamp(), NLMISC::CMouseSmoother::CSample::Date, min, NLMISC::CMouseSmoother::CSample::Pos, uint, NLMISC::CVector2f::x, and NLMISC::CVector2f::y.
00073 {
00074 if (!_Init)
00075 {
00076 _Sample[0] = _Sample[1] = _Sample[2] = _Sample[3] = CSample(date, wantedPos);
00077 _Init = true;
00078 }
00079 else
00080 {
00081 // see if enough time has elapsed since last sample
00082 if (date - _Sample[3].Date >= _SamplingPeriod)
00083 {
00084 uint numSamples = (uint) floor((date - _Sample[3].Date) / _SamplingPeriod);
00085 numSamples = std::min(numSamples, (uint) 4);
00086 for(uint k = 0; k < numSamples; ++k)
00087 {
00088 // add a new sample
00089 _Sample[0] = _Sample[1];
00090 _Sample[1] = _Sample[2];
00091 _Sample[2] = _Sample[3];
00092 _Sample[3] = CSample(date, wantedPos);
00093 }
00094 }
00095 else if (date == _Sample[3].Date)
00096 {
00097 // update cur pos
00098 _Sample[3] = CSample(date, wantedPos);
00099 }
00100 }
00101 if (_Sample[1].Pos.x == _Sample[2].Pos.x &&
00102 _Sample[1].Pos.y == _Sample[2].Pos.y
00103 )
00104 {
00105 // special case : if pointer hasn't moved, allow a discontinuity of speed
00106 return _Sample[2].Pos;
00107 }
00108 double evalDate = date - 2 * _SamplingPeriod;
00109 clamp(evalDate, _Sample[1].Date, _Sample[2].Date);
00110 CVector2f t0;
00111 double dt = _Sample[2].Date - _Sample[1].Date;
00112 if (_Sample[2].Date != _Sample[0].Date)
00113 {
00114 t0 = (float) dt * (_Sample[2].Pos - _Sample[0].Pos) / (float) (_Sample[2].Date - _Sample[0].Date);
00115 }
00116 else
00117 {
00118 t0= NLMISC::CVector::Null;
00119 }
00120 CVector2f t1;
00121 if (_Sample[3].Date != _Sample[1].Date)
00122 {
00123 t1 = (float) dt * (_Sample[3].Pos - _Sample[1].Pos) / (float) (_Sample[3].Date - _Sample[1].Date);
00124 }
00125 else
00126 {
00127 t1= NLMISC::CVector::Null;
00128 }
00129 NLMISC::CVector2f result;
00130 if (dt == 0) return _Sample[2].Pos;
00131 BuildHermiteVector(_Sample[1].Pos, _Sample[2].Pos, t0, t1, result, (float) ((evalDate - _Sample[1].Date) / dt));
00132 return result;
00133 }
|
|
|
Change the sampling period. The longer it lasts, the more smooth the movement. NB : this reset the smoother Definition at line 62 of file mouse_smoother.cpp. References _SamplingPeriod, nlassert, and reset().
00063 {
00064 if (period == _SamplingPeriod) return;
00065 reset();
00066 nlassert(_SamplingPeriod > 0);
00067 _SamplingPeriod = period;
00068 }
|
|
|
Definition at line 75 of file mouse_smoother.h. Referenced by CMouseSmoother(), reset(), and samplePos(). |
|
|
4 samples are needed to compute smoothed position : Sample 0 & 2 are used to compute tangent at sample 1 Sample 1 & 3 are used to compute tangent at sample 2 Definition at line 80 of file mouse_smoother.h. |
|
|
Definition at line 74 of file mouse_smoother.h. Referenced by CMouseSmoother(), getSamplingPeriod(), samplePos(), and setSamplingPeriod(). |
1.3.6