12 May 12:37
problem with QwtRasterData value(double x, double y)
From: Dmitry Khaneft <dimitrian <at> bk.ru>
Subject: problem with QwtRasterData value(double x, double y)
Newsgroups: gmane.comp.graphics.qwt.general
Date: 2008-05-12 10:39:23 GMT
Subject: problem with QwtRasterData value(double x, double y)
Newsgroups: gmane.comp.graphics.qwt.general
Date: 2008-05-12 10:39:23 GMT
Hallo. This is almost copy of class SpectromData by Matthias Pospiech. I tried to use it in the same
purposes. Below the code as I use it. Data in a array are transferred from QList from other class. This QList
contains only one element. In comments actually transferred values are shown.
A problem that I see distort picture on a plot. I think I made a mistake with filling of array or something
else. Where is my mistake?
**********************header**********************
class SpectrogramData: public QwtRasterData
{
private:
double *m_Array;
struct structMinMax{
double min;
double max;
};
structMinMax m_RangeX;
structMinMax m_RangeY;
structMinMax m_RangeZ;
struct structXY{
double x;
double y;
};
structXY m_DataSize;
structXY m_RealToArray;
public:
// Constructor giving back the QwtRasterData Constructor
SpectrogramData(): QwtRasterData()
{
m_Array = NULL;
}
~SpectrogramData()
{
if (m_Array != NULL)
delete [] m_Array;
}
virtual QwtRasterData *copy() const
{
SpectrogramData *clone = new SpectrogramData();
clone->setInterval(m_RangeZ.min, m_RangeZ.max);
clone->setBoundingRect(QwtDoubleRect(m_RangeX.min, m_RangeY.min, m_RangeX.max, m_RangeY.max));
clone->setData(m_Array, m_DataSize.x, m_DataSize.y);
return clone;
}
virtual QwtDoubleInterval range() const
{
return QwtDoubleInterval(m_RangeZ.min, m_RangeZ.max);
}
void setData(double * Array, int sizex, int sizey)
{
m_DataSize.x = sizex;
m_DataSize.y = sizey;
int size = sizex * sizey;
if (m_Array != NULL)
delete [] m_Array;
m_Array = new double [size];
memcpy(m_Array, Array, size * sizeof(double));
m_RealToArray.x = (m_RangeX.max - m_RangeX.min) / m_DataSize.x;
m_RealToArray.y = (m_RangeY.max - m_RangeY.min) / m_DataSize.y;
}
void setRect(const double minX, const double maxX, const double minY, const double maxY)
{
m_RangeX.min = minX;
m_RangeX.max = maxX;
m_RangeY.min = minY;
m_RangeY.max = maxY;
}
void setInterval(const double minZ, const double maxZ)
{
m_RangeZ.min = minZ;
m_RangeZ.max = maxZ;
}
int ArrPos(const int x, const int y) const
{
return y + m_DataSize.y * x;
}
double value(double x, double y) const
{
int xpos = (int)((x - m_RangeX.min) * m_RealToArray.x);
int ypos = (int)((y - m_RangeY.min) * m_RealToArray.y);
return m_Array[ArrPos(xpos, ypos)];//m_Array[(int)((m_RangeY.max) * y + x)];//(int)(x+y);//
}
};
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
virtual ~MainWindow();
void setData(double *Array, int sizex, int sizey);
void setRect(const double minX, const double maxX, const double minY, const double maxY);
void setInterval(const double minZ, const double maxZ);
void setDataRange(double minZ, double maxZ);
void setDataAutoRange();
public slots:
void s_plot();
void s_initData();
private:
QwtLinearColorMap m_colorMap;
QwtPlotSpectrogram * m_spectrogram;
QwtScaleWidget *m_rightAxis;
SpectrogramData m_RasterData;
QwtDoubleInterval m_DataRange;
void initColorMap();
void initColorBar();
void initZoomer();
<definitions of QwtPlot, Gui, etc>
};
**********************cpp**********************
#include <QtGui>
#include "mainwindow.h"
MainWindow::MainWindow()
{
<gui definition>
m_spectrogram = new QwtPlotSpectrogram();
initColorMap();
}
MainWindow::~MainWindow()
{
}
void MainWindow::setData(double * Array, int sizex, int sizey)
{
m_RasterData.setData(Array, sizex, sizey);
m_spectrogram->setData(m_RasterData);
setDataAutoRange();
initColorBar();
initZoomer();
}
void MainWindow::setRect(const double minX, const double maxX, const double minY, const double maxY)
{
m_RasterData.setRect(minX, maxX, minY, maxY);
plot->setAxisScale(QwtPlot::xBottom,minX, maxX);
plot->setAxisScale(QwtPlot::yLeft, minY, maxY);
}
void MainWindow::setInterval(const double minZ, const double maxZ)
{
m_RasterData.setInterval(minZ, maxZ);
}
void MainWindow::initColorMap()
{
m_colorMap = QwtLinearColorMap(Qt::darkCyan, Qt::red);
m_colorMap.addColorStop(0.25, Qt::cyan);
m_colorMap.addColorStop(0.5, Qt::green);
m_colorMap.addColorStop(0.75, Qt::yellow);
m_spectrogram->setColorMap(m_colorMap);
}
void MainWindow::setDataRange(double minZ, double maxZ)
{
m_DataRange = QwtDoubleInterval(minZ, maxZ);
}
void MainWindow::initColorBar()
{
m_rightAxis = plot->axisWidget(QwtPlot::yRight);
m_rightAxis->setTitle("Intensity");
m_rightAxis->setColorBarEnabled(true);
m_rightAxis->setColorMap(m_DataRange, m_spectrogram->colorMap());
plot->setAxisScale(QwtPlot::yRight,m_DataRange.minValue(),m_DataRange.maxValue());
plot->enableAxis(QwtPlot::yRight);
}
void MainWindow::s_initData()
{
data.dataContainerIterator = data.dataContainer.begin();
double arrayZ[(1 + data.dataContainerIterator->yMax) * (1 + data.dataContainerIterator->xMax)];
//double arrayZ[256 * 256];
int count = 0;
while(data.dataContainerIterator != data.dataContainer.end())
{
for(int y = 0; y<=data.dataContainerIterator->yMax; y++)
//for(int y = 0; y<=255; y++)
{
for(int x = 0; x<=data.dataContainerIterator->xMax; x++)
//for(int x = 0; x<=255; x++)
{
arrayZ[count] = data.dataContainerIterator->dataVector.at(count).z;
//arrayZ[count] = x + y;
++count;
}
}
data.dataContainerIterator++;
}
data.dataContainerIterator = data.dataContainer.begin();
while(data.dataContainerIterator != data.dataContainer.end())
{
setInterval(data.dataContainerIterator->zMin,data.dataContainerIterator->zMax);
//setInterval(0,510);
setRect(data.dataContainerIterator->xMin,
data.dataContainerIterator->xMax,
data.dataContainerIterator->yMin,
data.dataContainerIterator->yMax);
//setRect(0,255,0,255);
setData(&arrayZ[0],data.dataContainerIterator->xMax, data.dataContainerIterator->yMax);
//setData(&arrayZ[0],255,255);
data.dataContainerIterator++;
}
s_plot();
}
void MainWindow::s_plot()
{
m_spectrogram->attach(plot);
plot->replot();
}
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
RSS Feed