AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaaaaaaaaa.........
Мучился два дня, но все же сделал!!!
Обратите внимания на вертикальную нижнею и верхнею оси! Интервал на верхней оси не равномерный, а пропорциональный 1/T !!!
Юзать так:
C++ (Qt)
#include <qwtoverscaleengine.h>
.................
ui->qwtPlot->setAxisScaleEngine(QwtPlot::xTop,new QWtOverScaleEngine);
Все необходимые файлы в архиве!
Итак, наследник класса QwtLinearScaleEngine
qwtoverscaleengine.h
C++ (Qt)
#ifndef QWTOVERSCALEENGINE_H
#define QWTOVERSCALEENGINE_H
#include <qwt_scale_engine.h>
#include <qwt_scale_map.h>
class QWtOverScaleEngine : public QwtLinearScaleEngine
{
public:
QWtOverScaleEngine():QwtLinearScaleEngine(){}
QwtScaleTransformation* transformation() const;
};
class QwtOverTransformation : public QwtScaleTransformation
{
public:
enum Type{overX};
QwtOverTransformation(Type type):QwtScaleTransformation(QwtScaleTransformation::Other){if(type==overX){overType=true;}};
double xForm(double x, double s1, double s2, double p1, double p2) const;
QwtScaleTransformation* copy() const;
bool overType;
Type type() const{if(overType==overX){return overX;}}
};
#endif // QWTOVERSCALEENGINE_H
qwtoverscaleengine.cpp
C++ (Qt)
#include "qwtoverscaleengine.h"
#include <qwt_scale_engine.h>
#include <qwt_scale_map.h>
QwtScaleTransformation* QWtOverScaleEngine::transformation() const{
return new QwtOverTransformation(QwtOverTransformation::overX);
}//transformation
double QwtOverTransformation::xForm(double x, double s1, double s2, double p1, double p2) const{
if(type()==overX){ [color=red] /// DELETE number 273 !!! , i am using kelvin temperature! 1 / T[/color]
double deltaT=1/(s1+273)-1/(x+273);
double a=deltaT/(1/(s1+273)-1/(s2+273));
return p1+(p2-p1)/(s2-s1)*(s2-s1)*a;
} //if type
}//xFrom
QwtScaleTransformation* QwtOverTransformation::copy() const{
QwtScaleTransformation *transformation=new QwtOverTransformation(overX);
return transformation;
}//copy
/// DELETE number 273 !!! , i am using kelvin temperature! 1 / T