Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Ubuntu_linux от Январь 14, 2011, 18:56



Название: 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