0

こんにちは、qwtspectrogram を使用して配列データをプロットしていますが、問題はスケーリングです。qwt スケールは間隔 x と y に分散され、軸はピクセルに依存します。たとえば、(500x500) のデータ セット ベクトルがあり、500mm x500mm をプロットしたい場合、ピクセル上で変換されるため完璧ですが、300mmx300mm のポイント数 500x500 をプロットしたい場合、それは混乱して表示されますプロット 500x500 x 軸と y 軸を管理する必要があることはわかっていますが、その方法がわかりません。少し遊んで、250mmx250mmの領域で500x500を表示することはできますが、他の領域ではできません。私のコードは以下のとおりです

class mydata: public QwtRasterData
{
    char filepath[35];
    QFile myfile;
    QVector<qint16> fileBuf;
    int pixel =500; // it represents the number of pixels in one row or column
    int dial =1000;
public:

mydata()
    {
    setInterval( Qt::XAxis, QwtInterval( 0, (pixel)-1 ) );
    setInterval( Qt::YAxis, QwtInterval( 0, (pixel)-1 ) );
    setInterval( Qt::ZAxis, QwtInterval( -dial, dial ) );

    {
     sprintf_s(filepath, "c:\\myfile.bin");

     myfile.setFileName(filepath);
     if(!myfile.open(QIODevice::ReadOnly)) return;

     QDataStream data(&myfile);
     data.setByteOrder(QDataStream::LittleEndian);

     while(!data.atEnd()) {
         qint16 x;
         data >> x;
         fileBuf.append(x);
     }

     myfile.close();
 }
}

virtual double value( double x, double y ) const//shifted
{
int x_pos = static_cast<int>(x);
int y_pos = static_cast<int>(y);
double c =  (fileBuf[ ((x_pos)+((pixel-(y_pos))*pixel))]);
return c;
}
}

要するに、私は異なる領域に対して同じ数のピクセルを持っていますが、プロットの軸の表現は同じです。

4

1 に答える 1

0

これは、スケールの double 値を文字列に変換し、代わりに表示するクラスです

class MyScaleDraw: public QwtScaleDraw
{
public:
    MyScaleDraw()
    {
        setTickLength( QwtScaleDiv::MajorTick, 10 );
        setTickLength( QwtScaleDiv::MinorTick, 2 );
        setTickLength( QwtScaleDiv::MediumTick, 0 );

        setLabelRotation( 0 );
        setLabelAlignment( Qt::AlignLeft | Qt::AlignVCenter );

        setSpacing( 10 );
    }

    virtual QwtText label( double value ) const
    {
        QwtText h=QwtText(QString::number(value*0.75); //use any scaling factor you want
        return h;
    }
};

プロットを作成した後、以下のコードを含めます

 d_plot->setAxisScaleDraw( QwtPlot::xBottom, new MyScaleDraw() );
 d_plot->setAxisScaleDraw( QwtPlot::yLeft, new MyScaleDraw() );

これは私の問題を解決しました

于 2014-09-21T07:29:31.520 に答える