从QPolygonF获取最后n个元素

时间:2017-12-02 17:59:08

标签: c++ qt qwt

我有一个std::map< QString, QPolygonF>,其中包含三个QStrings(sensorId),每个传感器都有一些数据QVector< QPointF>,这些数据是连续生成的,并以cv::Mat编写。< / p>

在下面的代码块中,我为每个传感器从cv::Mat获取数据并将其保存在std::map< QString, double> m_Value;中,并将值推送到std::map< QString, QPolygonF> m_Points。我只为每个传感器收集数据5次。之后,我将我的积分发送给其他班级,以便用QwtPlot来形象化。

std::map<QString, QPolygonF> m_Points
std::map<QString, double>  m_Value;
std::map<QString, int> m_Index;

for(int i= 0; i< 5 ++i)
{
  m_Value[sensorId]= dataMat.at<double>(i);
  m_Points[sensorId].push_back(QPointF((double)m_Index[sensorId], 
  m_Value[sensorId]));
  m_Index[sensorId]++;
}

qDebug()<<" POINTS: " << toolId << m_Points[toolId];
emit updateDataSignal(m_Points); 

使用std::map< QString, int> m_Index;我继续/增加发送点的数量。

只有一个循环的for循环输出如下:

POINTS: 
sensor1 QPolygonF(0, pointValue) QPolygonF(1, pointValue) QPolygonF(2, pointValue) QPolygonF(3, pointValue) QPolygonF(4, pointValue)
sensor2 QPolygonF(0, pointValue) QPolygonF(1, pointValue) QPolygonF(2, pointValue) QPolygonF(3, pointValue) QPolygonF(4, pointValue)
sensor3 QPolygonF(0, pointValue) QPolygonF(1, pointValue) QPolygonF(2, pointValue) QPolygonF(3, pointValue) QPolygonF(4, pointValue)

第二次循环:

sensor1 QPolygonF(0, pointValue) QPolygonF(1, pointValue) QPolygonF(2, pointValue) QPolygonF(3, pointValue) QPolygonF(4, pointValue) QPolygonF(5, newPointValue) QPolygonF(6, newPointValue) QPolygonF(7, newPointValue) QPolygonF(8, newPointValue) QPolygonF(9, newPointValue)
sensor2 ...
sensor3 ...

一段时间后,我有数千个积分,而Qwtplot通过实时绘图/更新减慢了速度。因此,我只想发送,例如我的地图最后5分。

输出,例如对于传感器1应该看起来像:

第一个循环:

sensor1 QPolygonF(0, pointValue) QPolygonF(1, pointValue) QPolygonF(2, pointValue) QPolygonF(3, pointValue) QPolygonF(4, pointValue)

第二个循环:

sensor1 QPolygonF(5, newPointValue) QPolygonF(6, newPointValue) QPolygonF(7, newPointValue) QPolygonF(8, newPointValue) QPolygonF(9, newPointValue)

第三循环:

sensor1 QPolygonF(10, newPointValue) QPolygonF(11, newPointValue) QPolygonF(12, newPointValue) QPolygonF(13, newPointValue) QPolygonF(14, newPointValue)
...

谢谢

2 个答案:

答案 0 :(得分:0)

我不认为您的示例代码是正确的,因为您没有将map用于其预期目的 - 即以O(1)查找时间存储键值对。

如上所述,您应该使用std::vector代替,然后您可以使用std::vector::end迭代器访问添加的最后五个元素 (cplusplus doc link)。根据您的需要,您可能需要将其切片为新的向量,方法是使用endconst_iterator添加到您想要的元素并构建新的向量:

vector<T>::const_iterator last = myVec.end() - 1;
vector<T>::const_iterator first = last - 5;
vector<T> newVec(first, last);

此方法取自另一个堆栈溢出问题:Best way to extract a subvector from a vector?

答案 1 :(得分:0)

答案很简单:不要超过5分。或者,相反,始终在m_Points中准确存储5个最近的点。它可能也有助于引用的局部性将所有数据集中在一个结构中。因此:

class Class : public QObject {
  Q_OBJECT
  std::map<QString, SensorData> m_data;
public:
  struct SensorData {
    QPolygonF points{5};
    qreal value;
    int index;
  };
  void method(const QString &sensorId, const cv::Mat<double> &matrix);
  Q_SIGNAL void updateDataSignal(const QPolygonF &);
};    

void Class::method(const QString &sensorId, const cv::Mat<double> &matrix) {
  auto &data = m_data[sensorId]; // cache the lookup
  for(int i=0; i<data.points.size(); ++i) {
    data.value = matrix.at<double>(i);
    data.points[i] = {(qreal)data.index, data.value};
    data.index++;
  }
  emit updateDataSignal(data.points);
}