[dasher] Weight the pushes by their respective LP_TWO_PUSH_ parameters.
- From: Patrick Welche <pwelche src gnome org>
- To: svn-commits-list gnome org
- Subject: [dasher] Weight the pushes by their respective LP_TWO_PUSH_ parameters.
- Date: Wed, 17 Jun 2009 14:40:54 -0400 (EDT)
commit 6d4cd4cc3461024a8dd097e4cbf7994bb847f405
Author: Alan Lawrence <acl33 inf phy cam ac uk>
Date: Wed Jun 17 19:40:26 2009 +0100
Weight the pushes by their respective LP_TWO_PUSH_ parameters.
ChangeLog | 1 +
Src/DasherCore/TwoPushDynamicFilter.cpp | 43 ++++++++++++++++++++-----------
Src/DasherCore/TwoPushDynamicFilter.h | 2 +-
3 files changed, 30 insertions(+), 16 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index af3eb1f..10d5c58 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
* Implement new two-push dynamic mode (TwoPushDynamicFilter.{h,cpp}).
Also added dynamic button lag to two-button dynamic mode.
+ * Weight the pushes by their respective LP_TWO_PUSH_ parameters.
2009-06-17 Alan Lawrence <acl33 inf phy cam ac uk>
diff --git a/Src/DasherCore/TwoPushDynamicFilter.cpp b/Src/DasherCore/TwoPushDynamicFilter.cpp
index df30642..be6b124 100644
--- a/Src/DasherCore/TwoPushDynamicFilter.cpp
+++ b/Src/DasherCore/TwoPushDynamicFilter.cpp
@@ -122,9 +122,7 @@ void CTwoPushDynamicFilter::HandleEvent(Dasher::CEvent * pEvent)
double dOuter = GetLongParameter(LP_TWO_PUSH_OUTER);
m_dLogUpMul = log(dOuter / (double)GetLongParameter(LP_TWO_PUSH_UP));
m_dLogDownMul = log(dOuter / (double)GetLongParameter(LP_TWO_PUSH_DOWN));
- m_dSqrtUpDist = exp(m_dLogUpMul / 2.0);
- m_dSqrtDownDist = exp(m_dLogDownMul / 2.0);
-//cout << "bitsUp " << m_dLogUpMul << " bitsDown " << m_dLogDownMul << " upDist " << m_dSqrtUpDist << " downDist " << m_dSqrtDownDist << "\n";
+//cout << "bitsUp " << m_dLogUpMul << " bitsDown " << m_dLogDownMul << "\n";
} //and fallthrough
case LP_TWO_PUSH_TOLERANCE:
case LP_MAX_BITRATE:
@@ -160,10 +158,12 @@ void CTwoPushDynamicFilter::HandleEvent(Dasher::CEvent * pEvent)
}
else
{
- m_aaiGuideAreas[0][0] = 2048 - GetLongParameter(LP_TWO_PUSH_UP) * exp(m_dMaxShortTwoPushTime / 2.0) * m_dSqrtUpDist;
- m_aaiGuideAreas[0][1] = 2048 - GetLongParameter(LP_TWO_PUSH_UP) * exp(m_dMinShortTwoPushTime / 2.0) * m_dSqrtUpDist;
- m_aaiGuideAreas[1][0] = 2048 + GetLongParameter(LP_TWO_PUSH_DOWN) * exp(m_dMinLongTwoPushTime / 2.0) * m_dSqrtDownDist;
- m_aaiGuideAreas[1][1] = 2048 + GetLongParameter(LP_TWO_PUSH_DOWN) * exp(m_dMaxLongTwoPushTime / 2.0) * m_dSqrtDownDist;
+ double dUp(GetLongParameter(LP_TWO_PUSH_UP)), dDown(GetLongParameter(LP_TWO_PUSH_DOWN)),
+ dOuter(GetLongParameter(LP_TWO_PUSH_OUTER));
+ m_aaiGuideAreas[0][0] = 2048 - dUp * exp((m_dMaxShortTwoPushTime*dUp + m_dLogUpMul*dOuter) / (dOuter+dUp));
+ m_aaiGuideAreas[0][1] = 2048 - dUp * exp((m_dMinShortTwoPushTime*dUp + m_dLogUpMul*dOuter) / (dOuter+dUp));
+ m_aaiGuideAreas[1][0] = 2048 + dDown * exp((m_dMinLongTwoPushTime*dDown + m_dLogDownMul*dOuter) / (dOuter+dDown));
+ m_aaiGuideAreas[1][1] = 2048 + dDown * exp((m_dMaxLongTwoPushTime*dDown + m_dLogDownMul*dOuter) / (dOuter+dDown));
}
break;
}
@@ -212,20 +212,33 @@ bool CTwoPushDynamicFilter::TimerImpl(int iTime, CDasherView *m_pDasherView, CDa
if (!isRunning(myState)) DASHER_ASSERT(false);
if (myState == 1) // button pushed
{
- double dLogGrowth(m_pDasherModel->GetNats());
- double dUpDist = exp(dLogGrowth/2.0) * m_dSqrtUpDist * GetLongParameter(LP_TWO_PUSH_UP);
- double dDownDist = exp(dLogGrowth/2.0)*m_dSqrtDownDist*GetLongParameter(LP_TWO_PUSH_DOWN);
+ double dLogGrowth(m_pDasherModel->GetNats()), dOuter(GetLongParameter(LP_TWO_PUSH_OUTER)),
+ dUp(GetLongParameter(LP_TWO_PUSH_UP)), dDown(GetLongParameter(LP_TWO_PUSH_DOWN));
+
+ //to move to point currently at outer marker: set m_aiTarget to dOuter==exp( log(dOuter/dUp) ) * dUp
+ // (note that m_dLogUpMul has already been set to log(dOuter/dUp)...)
+ //to move to point that _was_ at inner marker: set to exp(dLogGrowth) * dUp
+ //to move to midpoint - weighting both equally - set to exp( (log(dOuter/dup)+dLogGrowth)/2.0 ) * dUp
+ //we move to a WEIGHTED average, with the weights being given by dUp, dDown, and dOuter...
+ double dUpBits = (m_dLogUpMul * dOuter + dLogGrowth * dUp) / (dOuter + dUp);
+ double dDownBits = (m_dLogDownMul * dOuter + dLogGrowth * dDown) / (dOuter + dDown);
+
+ // (note it's actually slightly more complicated even than that, we have to add in m_dLagBits too!)
+
+ double dUpDist = exp( dUpBits ) * dUp;
+ double dDownDist = exp( dDownBits ) * dDown;
m_aiTarget[0] = dUpDist * exp(m_dLagBits);
m_aiTarget[1] = -dDownDist * exp(m_dLagBits);
if (GetBoolParameter(BP_FIXED_MARKERS))
{
- m_bDecorationChanged |= doSet(m_aiMarker[0], 2048 - GetLongParameter(LP_TWO_PUSH_UP)*exp(m_dLagBits + dLogGrowth));
- m_bDecorationChanged |= doSet(m_aiMarker[1], 2048 + GetLongParameter(LP_TWO_PUSH_DOWN)*exp(m_dLagBits + dLogGrowth));
+ m_bDecorationChanged |= doSet(m_aiMarker[0], 2048 - exp(m_dLagBits + dLogGrowth) * dUp);
+ m_bDecorationChanged |= doSet(m_aiMarker[1], 2048 + exp(m_dLagBits + dLogGrowth) * dDown);
}
else
{
- m_bDecorationChanged |= doSet(m_aiMarker[0], 2048 - dUpDist * exp(m_dLagBits/2.0));
- m_bDecorationChanged |= doSet(m_aiMarker[1], 2048 + dDownDist * exp(m_dLagBits/2.0));
+ //apply amount of lag corresponding to the first (inner) push only
+ m_bDecorationChanged |= doSet(m_aiMarker[0], 2048 - dUpDist * exp(m_dLagBits * (dUp/(dOuter+dUp))));
+ m_bDecorationChanged |= doSet(m_aiMarker[1], 2048 + dDownDist * exp(m_dLagBits * (dDown/(dOuter+dUp))));
}
if (dLogGrowth > m_dMaxLongTwoPushTime)
{
@@ -239,7 +252,7 @@ bool CTwoPushDynamicFilter::TimerImpl(int iTime, CDasherView *m_pDasherView, CDa
m_bDecorationChanged |= doSet(m_iActiveMarker, 1 /*down*/);
else m_bDecorationChanged |= doSet(m_iActiveMarker, -1 /*in middle (neither/both) or too short*/);
}
- m_pDasherModel->OneStepTowards(100, 2048, iTime, pAdded, pNumDeleted);
+ return m_pDasherModel->OneStepTowards(100, 2048, iTime, pAdded, pNumDeleted);
}
void CTwoPushDynamicFilter::Activate() {
diff --git a/Src/DasherCore/TwoPushDynamicFilter.h b/Src/DasherCore/TwoPushDynamicFilter.h
index 38b027c..4f72c57 100644
--- a/Src/DasherCore/TwoPushDynamicFilter.h
+++ b/Src/DasherCore/TwoPushDynamicFilter.h
@@ -43,7 +43,7 @@ class CTwoPushDynamicFilter : public CDynamicFilter /*long push, but do our own
virtual void HandleEvent(Dasher::CEvent * pEvent);
private:
- double m_dLogUpMul, m_dLogDownMul, m_dSqrtUpDist, m_dSqrtDownDist, m_dLagBits;
+ double m_dLogUpMul, m_dLogDownMul, m_dLagBits;
double m_dMinShortTwoPushTime, m_dMaxShortTwoPushTime,
m_dMinLongTwoPushTime, m_dMaxLongTwoPushTime;
int m_aiMarker[2];
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]