1 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
3 * Copyright (C) 1997 Josef Wilgen
4 * Copyright (C) 2002 Uwe Rathmann
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the Qwt License, Version 1.0
8 *****************************************************************************/
10 #ifndef QWT_SCALE_ENGINE_H
11 #define QWT_SCALE_ENGINE_H
13 #include "qwt_global.h"
14 #include "qwt_scale_div.h"
15 #include "qwt_interval.h"
20 \brief Arithmetic including a tolerance
22 class QWT_EXPORT QwtScaleArithmetic
25 static double ceilEps( double value
, double intervalSize
);
26 static double floorEps( double value
, double intervalSize
);
28 static double divideEps( double interval
, double steps
);
30 static double divideInterval( double interval
,
31 int numSteps
, uint base
);
35 \brief Base class for scale engines.
37 A scale engine tries to find "reasonable" ranges and step sizes
40 The layout of the scale can be varied with setAttribute().
42 Qwt offers implementations for logarithmic and linear scales.
45 class QWT_EXPORT QwtScaleEngine
50 \sa setAttribute(), testAttribute(), reference(),
51 lowerMargin(), upperMargin()
59 //! Build a scale which includes the reference() value.
60 IncludeReference
= 0x01,
62 //! Build a scale which is symmetric to the reference() value.
66 The endpoints of the scale are supposed to be equal the
67 outmost included values plus the specified margins
69 If this attribute is *not* set, the endpoints of the scale will
70 be integer multiples of the step size.
74 //! Turn the scale upside down.
79 typedef QFlags
<Attribute
> Attributes
;
81 explicit QwtScaleEngine( uint base
= 10 );
82 virtual ~QwtScaleEngine();
84 void setBase( uint base
);
87 void setAttribute( Attribute
, bool on
= true );
88 bool testAttribute( Attribute
) const;
90 void setAttributes( Attributes
);
91 Attributes
attributes() const;
93 void setReference( double reference
);
94 double reference() const;
96 void setMargins( double lower
, double upper
);
97 double lowerMargin() const;
98 double upperMargin() const;
101 Align and divide an interval
103 \param maxNumSteps Max. number of steps
104 \param x1 First limit of the interval (In/Out)
105 \param x2 Second limit of the interval (In/Out)
106 \param stepSize Step size (Return value)
108 virtual void autoScale( int maxNumSteps
,
109 double &x1
, double &x2
, double &stepSize
) const = 0;
112 \brief Calculate a scale division
114 \param x1 First interval limit
115 \param x2 Second interval limit
116 \param maxMajorSteps Maximum for the number of major steps
117 \param maxMinorSteps Maximum number of minor steps
118 \param stepSize Step size. If stepSize == 0.0, the scaleEngine
121 \return Calculated scale division
123 virtual QwtScaleDiv
divideScale( double x1
, double x2
,
124 int maxMajorSteps
, int maxMinorSteps
,
125 double stepSize
= 0.0 ) const = 0;
127 void setTransformation( QwtTransform
* );
128 QwtTransform
*transformation() const;
131 bool contains( const QwtInterval
&, double val
) const;
132 QList
<double> strip( const QList
<double>&, const QwtInterval
& ) const;
134 double divideInterval( double interval
, int numSteps
) const;
136 QwtInterval
buildInterval( double v
) const;
144 \brief A scale engine for linear scales
146 The step size will fit into the pattern
147 \f$\left\{ 1,2,5\right\} \cdot 10^{n}\f$, where n is an integer.
150 class QWT_EXPORT QwtLinearScaleEngine
: public QwtScaleEngine
153 QwtLinearScaleEngine( uint base
= 10 );
154 virtual ~QwtLinearScaleEngine();
156 virtual void autoScale( int maxSteps
,
157 double &x1
, double &x2
, double &stepSize
) const;
159 virtual QwtScaleDiv
divideScale( double x1
, double x2
,
160 int numMajorSteps
, int numMinorSteps
,
161 double stepSize
= 0.0 ) const;
165 QwtInterval
align( const QwtInterval
&, double stepSize
) const;
168 const QwtInterval
&, double stepSize
, int maxMinSteps
,
169 QList
<double> ticks
[QwtScaleDiv::NTickTypes
] ) const;
171 QList
<double> buildMajorTicks(
172 const QwtInterval
&interval
, double stepSize
) const;
174 void buildMinorTicks( const QList
<double>& majorTicks
,
175 int maxMinorSteps
, double stepSize
,
176 QList
<double> &minorTicks
, QList
<double> &mediumTicks
) const;
180 \brief A scale engine for logarithmic scales
182 The step size is measured in *decades*
183 and the major step size will be adjusted to fit the pattern
184 \f$\left\{ 1,2,3,5\right\} \cdot 10^{n}\f$, where n is a natural number
187 \warning the step size as well as the margins are measured in *decades*.
190 class QWT_EXPORT QwtLogScaleEngine
: public QwtScaleEngine
193 QwtLogScaleEngine( uint base
= 10 );
194 virtual ~QwtLogScaleEngine();
196 virtual void autoScale( int maxSteps
,
197 double &x1
, double &x2
, double &stepSize
) const;
199 virtual QwtScaleDiv
divideScale( double x1
, double x2
,
200 int numMajorSteps
, int numMinorSteps
,
201 double stepSize
= 0.0 ) const;
204 QwtInterval
align( const QwtInterval
&, double stepSize
) const;
207 const QwtInterval
&, double stepSize
, int maxMinSteps
,
208 QList
<double> ticks
[QwtScaleDiv::NTickTypes
] ) const;
210 QList
<double> buildMajorTicks(
211 const QwtInterval
&interval
, double stepSize
) const;
213 void buildMinorTicks( const QList
<double>& majorTicks
,
214 int maxMinorSteps
, double stepSize
,
215 QList
<double> &minorTicks
, QList
<double> &mediumTicks
) const;
218 Q_DECLARE_OPERATORS_FOR_FLAGS( QwtScaleEngine::Attributes
)