ArffWidgetSpeed.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // ArffWidgetSpeed.cpp
  2. #include "ArffWidgetSpeed.h"
  3. #include "EquirectangularToFovSpeed.cpp"
  4. #include "GazeSpeed.h"
  5. #include <algorithm>
  6. #include <iostream>
  7. #define RELATION360 "GAZE_360"
  8. #define MAX_SPEED 200.0
  9. using namespace std;
  10. // PUBLIC SLOTS:
  11. void ArffWidgetSpeed::HandleToggleView()
  12. {
  13. ArffWidgetBase::HandleToggleView();
  14. if (m_vSpeed.size() != m_vSecondSpeed.size() || !m_FovDisplayed)
  15. return;
  16. if (m_pSpeed == &m_vSpeed)
  17. m_pSpeed = &m_vSecondSpeed;
  18. else
  19. m_pSpeed = &m_vSpeed;
  20. update();
  21. }
  22. // PUBLIC:
  23. ArffWidgetSpeed::ArffWidgetSpeed(double filterWindow) : ArffWidgetBase(), m_pSpeed(&m_vSpeed), m_FovDisplayed(false)
  24. {
  25. m_speedWindow = filterWindow;
  26. }
  27. // PROTECTED:
  28. void ArffWidgetSpeed::SetData(Arff &arff, int attToPaint, double maxValue)
  29. {
  30. ArffWidgetBase::SetData(arff, attToPaint, maxValue);
  31. if (IsArff360())
  32. {
  33. EquirectangularToFovSpeed eqToSpeed(m_pArff, m_speedWindow);
  34. // Always get head+eye speed because the provided ARFF is converted to
  35. // hold the data to display in x,y
  36. m_vSpeed = eqToSpeed.GetHeadPlusEyeSpeed();
  37. NormalizeSpeed(m_vSpeed);
  38. m_vSecondSpeed = eqToSpeed.GetEyeFovSpeed();
  39. NormalizeSpeed(m_vSecondSpeed);
  40. m_vHeadSpeed = eqToSpeed.GetHeadSpeed();
  41. NormalizeSpeed(m_vHeadSpeed);
  42. }
  43. else
  44. {
  45. GazeSpeed gazeSpeed(m_pArff, m_speedWindow);
  46. m_vSpeed = gazeSpeed.GetSpeed();
  47. NormalizeSpeed(m_vSpeed);
  48. }
  49. }
  50. void ArffWidgetSpeed::SetFovData(Arff &arff, double maxValue)
  51. {
  52. ArffWidgetBase::SetFovData(arff, maxValue);
  53. DisplayFov();
  54. }
  55. void ArffWidgetSpeed::DisplayFov()
  56. {
  57. m_FovDisplayed = true;
  58. }
  59. void ArffWidgetSpeed::DisplayHead()
  60. {
  61. EquirectangularToFovSpeed eqToSpeed(m_pArff, m_speedWindow);
  62. m_vSpeed = eqToSpeed.GetHeadSpeed();
  63. NormalizeSpeed(m_vSpeed);
  64. m_vHeadSpeed.clear();
  65. }
  66. // PROTECTED:
  67. void ArffWidgetSpeed::PaintLine(QPainter *painter)
  68. {
  69. QRect geom = geometry();
  70. painter->setPen(QPen(Qt::black, 4.0*geom.height()/1000.0));
  71. PaintSpeed(*m_pSpeed, painter);
  72. painter->setPen(QPen(Qt::darkRed, 4.0*geom.height()/1000.0));
  73. PaintSpeed(m_vHeadSpeed, painter);
  74. PaintSpeedLines(painter);
  75. }
  76. // PRIVATE:
  77. void ArffWidgetSpeed::PaintSpeed(const vector<double> &vSpeed, QPainter *painter)
  78. {
  79. if (vSpeed.empty())
  80. return;
  81. QRect geom = geometry();
  82. QPoint points[m_intervalLength];
  83. for (int i=0; i<m_intervalLength; i++)
  84. {
  85. //double x = (double)geom.width()*((*m_pEqArff)[m_pointerStart+i][m_timeInd] - (double)m_winStartTime)/(double)(m_windowDuration);
  86. double x = (double)geom.width()*((*m_pArff)[m_pointerStart+i][m_timeInd] - (double)m_winStartTime)/(double)(m_windowDuration);
  87. points[i].setX((int)x);
  88. points[i].setY((double)vSpeed[m_pointerStart+i]*(double)geom.height()/m_windowMaxVal);
  89. }
  90. painter->translate(0, geom.height());
  91. painter->scale(1,-1);
  92. painter->drawPolyline(points,m_intervalLength);
  93. painter->translate(0, geom.height());
  94. painter->scale(1,-1);
  95. }
  96. void ArffWidgetSpeed::PaintSpeedLines(QPainter *painter)
  97. {
  98. vector<double> percentage {0.025, 0.05, 0.1, 0.2, 0.4, 0.7, 1};
  99. QRect geom = geometry();
  100. double boxHeight = 0.02*geom.height();
  101. QPoint points[2];
  102. for (auto perc:percentage)
  103. {
  104. // draw speed line
  105. painter->setPen(QPen(Qt::darkCyan, 2.0*geom.height()/1000.0));
  106. points[0].setX(0);
  107. points[1].setX(geom.width());
  108. points[0].setY((double)geom.height() * (1 - TransformPercentage(perc)));
  109. points[1].setY(points[0].y());
  110. painter->drawPolyline(points, 2);
  111. // draw text
  112. points[0].setX(geom.width() - 6 * boxHeight);
  113. points[0].setY((double)geom.height() * (1 - TransformPercentage(perc)));
  114. points[1].setX(geom.width());
  115. points[1].setY((double)geom.height() * (1 - TransformPercentage(perc)) + boxHeight);
  116. QRect rect(points[0], points[1]);
  117. painter->setBrush(QBrush(QColor(255,255,255,255)));
  118. painter->drawRect(rect);
  119. QString label = QString::number(int(perc*MAX_SPEED)) + QString(" deg/sec");
  120. // scale font size
  121. QFont font = painter->font();
  122. font.setPointSize(boxHeight/1.5);
  123. painter->setFont(font);
  124. painter->setPen(QPen(Qt::black));
  125. painter->drawText(rect, Qt::AlignCenter, label);
  126. }
  127. }
  128. bool ArffWidgetSpeed::IsArff360()
  129. {
  130. string relation = m_pArff->GetRelation();
  131. transform(relation.begin(), relation.end(), relation.begin(), ::toupper);
  132. return relation == RELATION360;
  133. }
  134. void ArffWidgetSpeed::NormalizeSpeed(vector<double> &vSpeed)
  135. {
  136. for (double &value:vSpeed)
  137. value = value>MAX_SPEED?MAX_SPEED:value;
  138. m_windowMaxVal = MAX_SPEED;
  139. for (double &value:vSpeed)
  140. value = TransformPercentage(value / MAX_SPEED) * MAX_SPEED;
  141. }
  142. double ArffWidgetSpeed::TransformPercentage(double perc)
  143. {
  144. // Use exponential decay to spread percentages at the lower end. The smaller
  145. // the exponential multiplier the bigger the spread in the lower values
  146. double expMult = -2.5;
  147. double maxValMult = exp(expMult);
  148. double newPerc = (1 - exp(expMult*perc)) / (1 - maxValMult);
  149. return newPerc;
  150. }