2017-04-03 63 views
0

波形圖..有在邏輯某些功能問題。我使用QPainter在邏輯上嘗試了一個波形圖。波形圖繪製完美,但有一條線繪製..任何人都可以幫助我解決這個問題。波圖(在邏輯功能的問題)在QT

//dialog.cpp

#include "dialog.h" 
#include "ui_dialog.h" 
#include <QtMath> 
#include <QDebug> 
#include <QDialog> 
#include <QTGui> 
#include <QtCore> 


Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 
{ 
    ui->setupUi(this); 
} 

Dialog::~Dialog() 
{ 
    delete ui; 
} 

void Dialog::paintEvent(QPaintEvent *e) 
{ 
    e->accept(); 

    float scale = 40; 
    //boolean negativeX = true; 
    float width = 500; 
    float height = 108; 

    QPainter painter(this); 

    QPen linepen(Qt::red); 
    linepen.setWidth(2); 
    QPoint p1; 
    QPoint p2; 

    painter.setPen(linepen); 

    float xx, yy, dx=4, x0=width/2, y0=height/2; 

    //float iMax = (width - x0)/dx; 
    float iMax = 63; 

    //float iMin = negativeX ? -x0/dx : 0; 
    float iMin = -63; 

    for (int i=iMin;i<=iMax;i++) { 
      float x = x0+xx; 
      float y = y0-yy; 
     p1.setX(x); 
     p1.setY(y); 

     xx = dx*i; 
     float xscl = xx/scale; 
     yy = scale * qCos(3* xscl); 

      x = x0+xx; 
      y = y0-yy; 

     p2.setX(x); 
     p2.setY(y); 

     painter.drawLine(p1, p2); 

    } 

    } 

// dialog.h

protected: 
    void paintEvent(QPaintEvent *e); 

// main.cpp中

QApplication a(argc, argv); 
Dialog w; 
w.show(); 

enter image description here

+0

我試過這一個,初始化xx和yy後,使用p1.x和p1.y將無法工作移動到p1概念..所以我使用循環迭代修改p1.x和p1.y的迭代 –

+0

請不要對你的問題進行大規模的修改,以免使答案失效。它擊敗了SO的全部目的。如果你想做出這樣的改變,它應該是一個*新的問題,你應該在你理解了你當前的問題的答案之後再提問。已經回滾。 – paxdiablo

回答

0

確保(一),如果這是什麼導致你的問題,因爲你不確定的行爲(指什麼可能發生),但第一次循環,使用xxyy已經被賦予了價值,才:

float xx, yy, ...     // will be arbitrary value. 
float iMax = 63; 
float iMin = -63; 
for (int i=iMin;i<=iMax;i++) { 
    float x = x0+xx;    // shouldn't be using them here. 
    float y = y0-yy; 

    p1.setX(x); 
    p1.setY(y); 

    xx = dx*i;      // not set until here. 
    float xscl = xx/scale; 
    yy = scale * qCos(3* xscl); 

可能在使用前他們初始化爲零的簡單情況,因爲這很可能是最佳的初始點偏移。


的(a)這當然可行,它是此由於xx和初始值yy可以使得它設置初始點到直線的最右端的情況。

這意味着初始畫線,遠不是一個小的線形成所述餘弦波的一部分,將是從該點到該波的最左邊的點。你可以通過簡單地把一個break作爲for循環中的最後陳述,看到的是直線時出現的唯一檢查。

你可以通過實際調試代碼,要麼把一個斷點在xy計算,看到什麼xxyy值,或每次使用它們的時間之前打印出來檢查。調試技能是你的武器庫中非常寶貴的工具。

如果是這樣的話,在循環開始前設置xxyy爲零應該絕對解決您的問題。

+0

p1.x和p1.y是移動繪製線條的概念,但是我在初始化波形圖後使用循環不起作用。所以我使用之前初始化..但如何刪除該直線.. –

+0

@Senthil,我已經告訴過你如何刪除直線。我已經在附錄中更清楚地說明了它爲什麼會發生。請重新閱讀答案。 – paxdiablo

+0

謝謝,我已經在for循環之前初始化float x和y。它會正常工作.. –