Russian Qt Forum
Ноябрь 18, 2024, 20:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QwtPlot логарифмическая шкала и не только.  (Прочитано 5799 раз)
Ubuntu_linux
Гость
« : Январь 14, 2011, 18:56 »

Как поменять шкалу на логарифмическую и 1/X масштабом ?
Что то не могу понять Непонимающий
QwtScaleTransformation
Посмотрел инфу по класу, но не понял что к чему. Непонимающий
Записан
Ubuntu_linux
Гость
« Ответ #1 : Январь 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
 
 

« Последнее редактирование: Январь 18, 2011, 01:03 от Ubuntu_linux » Записан
Ubuntu_linux
Гость
« Ответ #2 : Январь 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/х пока не выходит.



« Последнее редактирование: Январь 18, 2011, 01:02 от Ubuntu_linux » Записан
Ubuntu_linux
Гость
« Ответ #3 : Январь 18, 2011, 21:03 »

Что некто такого не делал?
Записан
Ubuntu_linux
Гость
« Ответ #4 : Январь 20, 2011, 01:29 »

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

« Последнее редактирование: Январь 20, 2011, 02:26 от Ubuntu_linux » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.205 секунд. Запросов: 21.