Название: QwtPlot логарифмическая шкала и не только.
Отправлено: Ubuntu_linux от Январь 14, 2011, 18:56
Как поменять шкалу на логарифмическую и 1/X масштабом ? Что то не могу понять ??? QwtScaleTransformation (http://qwt.sourceforge.net/class_qwt_scale_transformation.html) Посмотрел инфу по класу, но не понял что к чему. ???
Название: Re: QwtPlot логарифмическая шкала и не только.
Отправлено: Ubuntu_linux от Январь 17, 2011, 13:47
Как поменять шкалу на логарифмическую я понял, для этого надо сделать так: C++ (Qt) ui->qwtPlot->setAxisScaleEngine(QwtPlot::xTop, new QwtLog10ScaleEngine());
Все работает, но при попитке унаследоватся от QwtScaleEngine() и переопредилить трансформацию ,чтоб с шкали 1/X сделать просто Х. C++ (Qt) virtual double xForm (double x, double s1, double s2, double p1, double p2) const
C++ (Qt) class QwtOverEngine : public QwtScaleEngine { public: QwtOverEngine(): QwtScaleEngine(){}; double xForm(double x,double s1,double s2,double p1,double p2) const {return p1+ (s2-s1)/(p2-p1)*(x-s1);} }; #endif // QWTOVERENGINE_H
Название: Re: QwtPlot логарифмическая шкала и не только.
Отправлено: Ubuntu_linux от Январь 17, 2011, 19:59
Как поменять шкалу на логарифмическую я понял, для этого надо сделать так: C++ (Qt) ui->qwtPlot->setAxisScaleEngine(QwtPlot::xTop, new QwtLog10ScaleEngine());
Для логарифма и линейной функции: C++ (Qt) QwtPlot::Axis axis = my_axis->axis(); QwtScaleTransformation *st = axisScaleEngine(axis)->transformation(); QwtScaleTransformation::Type xformType = st->type(); if (xformType != QwtScaleTransformation::Log10) setAxisScaleEngine(axis, new QwtLog10ScaleEngine()); if (xformType != QwtScaleTransformation::Linear) setAxisScaleEngine(axis, new QwtLinearScaleEngine());
А сделать 1/х пока не выходит.
Название: Re: QwtPlot логарифмическая шкала и не только.
Отправлено: Ubuntu_linux от Январь 18, 2011, 21:03
Что некто такого не делал?
Название: Re: QwtPlot логарифмическая шкала и не только.
Отправлено: Ubuntu_linux от Январь 20, 2011, 01:29
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaaaaaaaaa......... Мучился два дня, но все же сделал!!! ;D Обратите внимания на вертикальную нижнею и верхнею оси! Интервал на верхней оси не равномерный, а пропорциональный 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
|