绘制数据输出中的问题

时间:2015-04-01 17:43:34

标签: c++ qt

我有一个程序从外部源(现在是操纵杆)获取输入,然后将其绘制在图形上。该图显示最后60帧数据,大约1-2秒。

这里是数据输入:

nextDataPoint(double x){
    if (x > max){ max = x; }
    if (x < min){ min = x; }
    dataInput.enqueue(x) //dataInput is a QQueue<double>
    while (dataInput.size() > 60){
        dataInput.dequeue();
    }
    update(); //this triggers the paint event
}

这是图形函数

graph function:

//this draws the min line and the max line
QPainter painter(this);
int lineDist = 25;
QPen myPen(Qt::black, 3);
QPoint maxText(10,20);
painter.drawText(maxText, "max");
QPoint maxLineLeft(0, lineDist);
QPoint maxLineRight(width(), lineDist);
painter.drawLine(maxLineLeft, maxLineRight);
QPoint minText(10, height()-10);
painter.drawText(minText, "min");
QPoint minLineLeft(0, height()-lineDist);
QPoint minLineRight(width(), height()-lineDist);

//this draws the actual graph
myPen.setColor(Qt::blue);
myPen.setWidth(2);
painter.setPen(myPen);
double dist = (double)(heigh() - 2*lineDist);
int stepSize = (int)((double)width() / 60.0);
int heightStep = (max-min)/dist;
double x;
QPoint lastPoint(0,0);
QPoint nextPoint(0,0);
int i = 0;
if (!dataInput.empty()){ //checks that there is data
    if (dataInput.size() < 60) { //ignoring for sake of brevety
    } else {
        x = dataInput.at(i);
        x = max - x; // this inverts the data, necessary because (0,0) is the upper left corner
        x = (x-min)/heightStep;
        nextPoint.setX(0);
        nextPoint.setY(x+lineDist);
        for (i = 1; i < 60; i++){
            x = dataInput.at(i);
            x = max - x;
            x = (x-min)/heightStep;
            lastPoint = nextPoint;
            nextPoint.setX(i*stepSize);
            nextPoint.setY(x+lineDist);
            painter.drawLine(lastPoint, nextPoint);
        }
    }
}

因此,使用我正在测试的一个操纵杆,此程序可以正常工作。当我移动操纵杆时,程序在屏幕上列出的边界内绘制蓝线。 x输入为0到65535之间的数字,在稍微移动操纵杆后,系统会将其识别为最大值和最小值,然后按预期运行。

第二个&#34;操纵杆&#34;更少的操纵杆和更多的压力传感器。这输出x = 1023或x是介于5和9之间的某个数字。但是,在这种情况下,蓝线显示在与最大线相同的级别上,或者当数据输出为单个数字的x时,出现蓝线低于分钟我还没有弄清楚为什么会出现这种情况,第一个操纵杆也可以产生0的结果,但它永远不会低于最小线。可能导致这个特殊问题的原因是什么?

1 个答案:

答案 0 :(得分:0)

需要进行两项更改才能解决问题。

首先,stepSize和heightStep都从int更改为double。

第二节,

部分
x = dataInput.at(i);
x = max - x;
x = (x-min)/heightStep;
nextPoint.setX(0);
nextPoint.setY(x+lineDist);
for (i = 1; i < 60; i++){
    x = dataInput.at(i);
    x = max - x;
    x = (x-min)/heightStep;
    lastPoint = nextPoint;
    nextPoint.setX(i*stepSize);
    nextPoint.setY(x+lineDist);
    painter.drawLine(lastPoint, nextPoint);
}

更改为:

x = dataInput.at(i);
x = (x-min)/heightStep;
nextPoint.setX(0);
nextPoint.setY(dist-x+lineDist);
for (i = 1; i < 60; i++){
    x = dataInput.at(i);
    x = (x-min)/heightStep;
    lastPoint = nextPoint;
    nextPoint.setX(i*stepSize);
    nextPoint.setY(dist-x+lineDist);
    painter.drawLine(lastPoint, nextPoint);
}

这解决了问题,并使系统始终在最小和最大线之间绘制数据。