从 QPolygonF 获取最后 n 个元素

Posted

技术标签:

【中文标题】从 QPolygonF 获取最后 n 个元素【英文标题】:Get last n elements from QPolygonF 【发布时间】:2017-12-02 17:59:07 【问题描述】:

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

在下面的代码块中,我从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&lt; QString, int&gt; 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)
...

谢谢

【问题讨论】:

您的标题具有误导性。似乎您只想显示矢量QPolygonF 的最后一个n 元素,其中m_Points 不包含std::map 的最后一个n 元素 【参考方案1】:

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

正如所写,您应该改用std::vector,然后您可以访问使用std::vector::end 迭代器添加的最后五个元素 (cplusplus doc link)。根据您的需要,您可能需要将其分割成一个新向量,方法是使用 endconst_iterators 获取到您想要的元素并构造一个新向量:

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?

【讨论】:

我有点困惑如何使您的建议适应我上面的代码。 QwtPlot 仅接受 QPolygonF,即 QVector QVector 是从哪里来的?我在任何地方的代码示例中都看不到这一点。我建议你用 std::vector 替换 std::map。 doc.qt.io/qt-5/qpolygonf.html#details 我使用std::map 创建基于键值对的容器。键是我的传感器 (sensorId),每个传感器都有不同的值 (m_Value)。如果我使用std::vector,则容器包含键或值。【参考方案2】:

答案很简单:不要存储超过 5 个点。或者,更确切地说,始终在m_Points 中准确存储 5 个最近的点。将所有数据放在一个结构中可能也有助于参考的位置。因此:

class Class : public QObject 
  Q_OBJECT
  std::map<QString, SensorData> m_data;
public:
  struct SensorData 
    QPolygonF points5;
    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);

【讨论】:

以上是关于从 QPolygonF 获取最后 n 个元素的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MongoDB 集合中获取具有匹配键的最后 N 个元素

如何从 MongoDB 集合中获取具有匹配键的最后 N 个元素

无法使用 graphene_django 从 GraphQL 获取最后 n 个元素

从列表(表)末尾获取第 n 个元素

获取pyspark数组类型列的最后n个元素

使用 Linq 获取集合的最后 N 个元素?