Dmitry Khaneft | 12 May 12:37
Picon

problem with QwtRasterData value(double x, double y)

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

Gmane