Merged in f5soh/librepilot/update_credits (pull request #529)
[librepilot.git] / ground / gcs / src / libs / qwt / src / qwt_scale_engine.h
blob30e75fd1528594e587721aa06ddaf130118cb297
1 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
2 * Qwt Widget Library
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"
17 class QwtTransform;
19 /*!
20 \brief Arithmetic including a tolerance
22 class QWT_EXPORT QwtScaleArithmetic
24 public:
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 );
34 /*!
35 \brief Base class for scale engines.
37 A scale engine tries to find "reasonable" ranges and step sizes
38 for scales.
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
47 public:
48 /*!
49 Layout attributes
50 \sa setAttribute(), testAttribute(), reference(),
51 lowerMargin(), upperMargin()
54 enum Attribute
56 //! No attributes
57 NoAttribute = 0x00,
59 //! Build a scale which includes the reference() value.
60 IncludeReference = 0x01,
62 //! Build a scale which is symmetric to the reference() value.
63 Symmetric = 0x02,
65 /*!
66 The endpoints of the scale are supposed to be equal the
67 outmost included values plus the specified margins
68 (see setMargins()).
69 If this attribute is *not* set, the endpoints of the scale will
70 be integer multiples of the step size.
72 Floating = 0x04,
74 //! Turn the scale upside down.
75 Inverted = 0x08
78 //! Layout attributes
79 typedef QFlags<Attribute> Attributes;
81 explicit QwtScaleEngine( uint base = 10 );
82 virtual ~QwtScaleEngine();
84 void setBase( uint base );
85 uint base() const;
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
119 calculates one.
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;
130 protected:
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;
138 private:
139 class PrivateData;
140 PrivateData *d_data;
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
152 public:
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;
164 protected:
165 QwtInterval align( const QwtInterval&, double stepSize ) const;
167 void buildTicks(
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
185 including zero.
187 \warning the step size as well as the margins are measured in *decades*.
190 class QWT_EXPORT QwtLogScaleEngine: public QwtScaleEngine
192 public:
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;
203 protected:
204 QwtInterval align( const QwtInterval&, double stepSize ) const;
206 void buildTicks(
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 )
220 #endif