2018-11-25 21:53:26 +08:00
/*
2019-01-12 23:01:55 +08:00
Copyright ( c ) 2008 - 2019 Jan W . Krieger ( < jan @ jkrieger . de > )
2018-11-25 21:53:26 +08:00
This software is free software : you can redistribute it and / or modify
it under the terms of the GNU Lesser General Public License ( LGPL ) as published by
2019-02-08 00:24:46 +08:00
the Free Software Foundation , either version 2.1 of the License , or
2018-11-25 21:53:26 +08:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU Lesser General Public License ( LGPL ) for more details .
You should have received a copy of the GNU Lesser General Public License ( LGPL )
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include <QString>
# include <QPainter>
# include <QPair>
2018-12-28 05:52:00 +08:00
# include "jkqtplotter/jkqtpbaseelements.h"
# include "jkqtplotter/jkqtpbaseplotter.h"
2018-11-26 03:25:44 +08:00
# include "jkqtplottertools/jkqtptools.h"
# include "jkqtplottertools/jkqtp_imexport.h"
2018-12-19 00:13:18 +08:00
# include "jkqtplottertools/jkqtpimagetools.h"
2018-11-25 21:53:26 +08:00
2019-02-08 00:24:46 +08:00
# ifndef JKQTPGRAPHSBASE_H
# define JKQTPGRAPHSBASE_H
2018-11-25 21:53:26 +08:00
// forward declarations
2019-01-20 23:15:10 +08:00
class JKQTPlotter ;
2019-01-20 17:49:29 +08:00
class JKQTPDatastore ;
2018-11-25 21:53:26 +08:00
2019-01-20 23:15:10 +08:00
/** \brief this virtual base class of every element, which is part of a JKQTPlotter plot and may appear in its key
2018-12-28 05:52:00 +08:00
* ( basically any type of graph , except overlay elements ! )
2019-01-13 01:53:16 +08:00
* \ ingroup jkqtplotter_basegraphs
2018-11-25 21:53:26 +08:00
*
2018-12-28 05:52:00 +08:00
* Each possible graph is represented by a child of this class . So additional plots may be created by
2019-01-20 17:49:29 +08:00
* deriving new JKQTPGraph classes . To do so implement / overwrite these functions :
2018-11-25 21:53:26 +08:00
* - void draw ( JKQTPEnhancedPainter & painter ) ;
* - void drawKeyMarker ( JKQTPEnhancedPainter & painter , QRectF & rect ) ;
* - bool getXMinMax ( double & minx , double & maxx , double & smallestGreaterZero ) ;
2019-02-03 21:04:48 +08:00
* - bool getYMinMax ( double & miny , double & maxy , double & smallestGreaterZero ) ;
2019-04-22 19:27:50 +08:00
* - QColor getKeyLabelColor ( ) const = 0 ;
2019-02-03 21:04:48 +08:00
* .
2018-12-28 05:52:00 +08:00
*
* Optionally you may also overwrite these functions to draw elements outside the actual plot area ( like e . g . colorbars ) :
* - void getOutsideSize ( JKQTPEnhancedPainter & painter , int & leftSpace , int & rightSpace , int & topSpace , int & bottomSpace ) ;
* - void drawOutside ( JKQTPEnhancedPainter & painter , QRect leftSpace , QRect rightSpace , QRect topSpace , QRect bottomSpace ) ;
2018-11-25 21:53:26 +08:00
* .
*
2019-02-03 21:04:48 +08:00
* In addition this class provudes protected
* functions that do coordinate transforms based on the current coordinate system , of the paren
* JKQTPlotter ( i . e . using the axes JKQTPLott : xAxis and JKQTPlotter : : yAxis as basis for the plotting ) .
*
* \ see \ ref jkqtplotter_graphsgroup_classstructure
2018-11-25 21:53:26 +08:00
*/
2019-02-03 21:04:48 +08:00
class JKQTP_LIB_EXPORT JKQTPPlotElement : public QObject {
2018-11-25 21:53:26 +08:00
Q_OBJECT
public :
/** \brief class constructor */
2019-01-20 17:49:29 +08:00
explicit JKQTPPlotElement ( JKQTBasePlotter * parent = nullptr ) ;
2018-11-25 21:53:26 +08:00
/** \brief class constructor */
2019-01-20 23:15:10 +08:00
explicit JKQTPPlotElement ( JKQTPlotter * parent ) ;
2018-11-25 21:53:26 +08:00
/** \brief default wirtual destructor */
2019-02-03 21:04:48 +08:00
virtual ~ JKQTPPlotElement ( ) = default ;
2018-11-25 21:53:26 +08:00
/** \brief plots the graph to the plotter object specified as parent */
virtual void draw ( JKQTPEnhancedPainter & painter ) = 0 ;
2018-12-28 05:52:00 +08:00
2018-11-25 21:53:26 +08:00
/** \brief plots a key marker inside the specified rectangle \a rect */
virtual void drawKeyMarker ( JKQTPEnhancedPainter & painter , QRectF & rect ) = 0 ;
2018-12-28 05:52:00 +08:00
2018-11-25 21:53:26 +08:00
/** \brief returns an image with a key marker inside */
QImage generateKeyMarker ( QSize size = QSize ( 16 , 16 ) ) ;
/** \brief get the maximum and minimum x-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
virtual bool getXMinMax ( double & minx , double & maxx , double & smallestGreaterZero ) = 0 ;
/** \brief get the maximum and minimum y-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
virtual bool getYMinMax ( double & miny , double & maxy , double & smallestGreaterZero ) = 0 ;
/** \brief returns the color to be used for the key label */
2019-04-22 19:27:50 +08:00
virtual QColor getKeyLabelColor ( ) const = 0 ;
2018-11-25 21:53:26 +08:00
2019-02-03 21:04:48 +08:00
/** \brief sets the title of the plot (for display in key!).
*
* \ note If no title is supplied , no key entry is drawn . */
virtual void setTitle ( const QString & __value ) ;
/*! \brief returns the the title of the plot */
virtual QString getTitle ( ) const ;
/*! \brief sets whether the graph is visible in the plot */
void virtual setVisible ( bool __value ) ;
/*! \brief returns whether the graph is visible in the plot */
bool virtual isVisible ( ) const ;
2019-04-22 19:27:50 +08:00
/*! \brief sets whether the graph is drawn in a highlighted style in the plot */
void virtual setHighlighted ( bool __value ) ;
/*! \brief returns whether the graph is shown in a highlighted style in the plot */
bool virtual isHighlighted ( ) const ;
2018-11-25 21:53:26 +08:00
/** \brief returns the parent painter class */
2019-01-20 17:49:29 +08:00
inline JKQTBasePlotter * getParent ( ) { return parent ; }
2018-11-25 21:53:26 +08:00
/** \brief sets the parent painter class */
2019-01-20 17:49:29 +08:00
virtual void setParent ( JKQTBasePlotter * parent ) ;
2018-11-25 21:53:26 +08:00
/** \brief sets the parent painter class */
2019-01-20 23:15:10 +08:00
virtual void setParent ( JKQTPlotter * parent ) ;
2018-11-25 21:53:26 +08:00
/*! \brief if the graph plots outside the actual plot field of view (e.g. color bars, scale bars, ...)
\ note If you want to draw outside , then you ' ll also have to implement drawOutside ( )
*/
virtual void getOutsideSize ( JKQTPEnhancedPainter & painter , int & leftSpace , int & rightSpace , int & topSpace , int & bottomSpace ) ;
/*! \brief plots outside the actual plot field of view (e.g. color bars, scale bars, ...)
\ note If you want to draw outside , then you ' ll also have to implement getOutsideSize ( ) , so enough space is reserved
The four value supplied tell the method where to draw ( inside one of the rectangles ) .
*/
virtual void drawOutside ( JKQTPEnhancedPainter & painter , QRect leftSpace , QRect rightSpace , QRect topSpace , QRect bottomSpace ) ;
protected :
2018-12-28 05:52:00 +08:00
2018-11-25 21:53:26 +08:00
2019-02-03 21:04:48 +08:00
/** \brief tool routine that transforms an x-coordinate (plot coordinate --> pixels) for this plot element */
2018-12-28 05:52:00 +08:00
virtual double transformX ( double x ) const ;
2019-02-03 21:04:48 +08:00
/** \brief tool routine that transforms a y-coordinate (plot coordinate --> pixels) for this plot element */
2018-12-28 05:52:00 +08:00
virtual double transformY ( double y ) const ;
2019-02-03 21:04:48 +08:00
/** \brief tool routine that backtransforms an x-coordinate (pixels --> plot coordinate) for this plot element */
2018-12-28 05:52:00 +08:00
virtual double backtransformX ( double x ) const ;
2019-02-03 21:04:48 +08:00
/** \brief tool routine that backtransforms a y-coordinate (pixels --> plot coordinate) for this plot element */
2018-12-28 05:52:00 +08:00
virtual double backtransformY ( double y ) const ;
2019-02-03 21:04:48 +08:00
/** \brief tool routine that transforms a QPointF according to the parent's transformation rules (plot coordinate --> pixels) */
2018-12-28 05:52:00 +08:00
inline QPointF transform ( const QPointF & x ) {
return QPointF ( transformX ( x . x ( ) ) , transformY ( x . y ( ) ) ) ;
}
2018-11-25 21:53:26 +08:00
2019-02-03 21:04:48 +08:00
/** \brief tool routine that back-transforms a QPointF according to the parent's transformation rules (pixels --> plot coordinate) */
2018-12-28 05:52:00 +08:00
inline QPointF backTransform ( const QPointF & x ) {
return QPointF ( backtransformX ( x . x ( ) ) , backtransformY ( x . y ( ) ) ) ;
}
2018-11-25 21:53:26 +08:00
2019-02-03 21:04:48 +08:00
/** \brief tool routine that transforms a QPointF according to the parent's transformation rules (plot coordinate --> pixels) */
2018-11-25 21:53:26 +08:00
inline QPointF transform ( double x , double y ) {
return transform ( QPointF ( x , y ) ) ;
}
2019-02-03 21:04:48 +08:00
/** \brief tool routine that back-transforms a QPointF according to the parent's transformation rules (pixels --> plot coordinate) */
2018-11-25 21:53:26 +08:00
inline QPointF backTransform ( double x , double y ) {
return backTransform ( QPointF ( x , y ) ) ;
}
2019-02-03 21:04:48 +08:00
/** \brief tool routine that transforms a QVector<QPointF> according to the parent's transformation rules (plot coordinate --> pixels) */
2018-11-25 21:53:26 +08:00
QVector < QPointF > transform ( const QVector < QPointF > & x ) ;
/** \brief tool routine that transforms a QVector<QPointF> according to the parent's transformation rules
2019-02-03 21:04:48 +08:00
* and returns a ( non - closed ) path consisting of lines ( plot coordinate - - > pixels ) */
2018-11-25 21:53:26 +08:00
QPainterPath transformToLinePath ( const QVector < QPointF > & x ) ;
/** \brief tool routine that transforms a QVector<QPointF> according to the parent's transformation rules
2019-02-03 21:04:48 +08:00
* and returns a polygon ( plot coordinate - - > pixels ) */
2018-11-25 21:53:26 +08:00
inline QPolygonF transformToPolygon ( const QVector < QPointF > & x ) {
return QPolygonF ( transform ( x ) ) ;
}
2019-02-03 21:04:48 +08:00
/** \brief the plotter object this object belongs to */
JKQTBasePlotter * parent ;
/** \brief title of the plot (for display in key!). If no title is supplied, no key entry is drawn. */
QString title ;
/** \brief indicates whether the graph is visible in the plot */
bool visible ;
2019-04-22 19:27:50 +08:00
/** \brief indicates whether the graph is shown in a "highlghted" in the plot */
bool highlighted ;
/** \brief internal storage for the used parent plot style */
int parentPlotStyle ;
2018-12-28 05:52:00 +08:00
} ;
/** \brief this virtual base class of the (data-column based) graphs,
2019-01-20 23:15:10 +08:00
* which are part of a JKQTPlotter plot and which use the coordinate system
2019-01-26 03:16:04 +08:00
* of the JKQTPlotter ( i . e . the two coordinate axes getXAxis ( ) and getYAxis ( ) )
2018-12-28 05:52:00 +08:00
* as basis for the graphs
2019-01-13 01:53:16 +08:00
* \ ingroup jkqtplotter_basegraphs
2018-12-28 05:52:00 +08:00
*
2019-02-03 21:04:48 +08:00
* This class adds features to work with data columns .
* - There are two properties datarange_start and datarange_end . By default they are - 1 and therefore ignored .
* if they are ! = - 1 the plotter only displays the datapoints with the indexes [ datarange_start . . datarange_end ]
* although there might be more data points available ( range [ 0 . . maxDataPoints ] ) . The datarange is cut at the
* full range , i . e . if datarange_end > maxDataPoints the plotter displays [ datarange_start . . maxDataPoints ] .
* - Also there is a virtual function usesColumn ( ) which checks whether a given column is used by this graph .
* Override this function in your derived graphs to indicate to JKQTPlotter / JKQTBasePlotter , which columns
* from the internal JKQTPDatastore are actually used . This information can be used e . g . for graph - specific data - export .
* .
2018-12-28 05:52:00 +08:00
*
2019-02-03 21:04:48 +08:00
* \ see \ ref jkqtplotter_graphsgroup_classstructure
2018-12-28 05:52:00 +08:00
*/
2019-02-03 21:04:48 +08:00
class JKQTP_LIB_EXPORT JKQTPGraph : public JKQTPPlotElement {
2018-12-28 05:52:00 +08:00
Q_OBJECT
public :
/** \brief class constructor */
2019-01-20 17:49:29 +08:00
explicit JKQTPGraph ( JKQTBasePlotter * parent = nullptr ) ;
2018-12-28 05:52:00 +08:00
/** \brief class constructor */
2019-01-20 23:15:10 +08:00
explicit JKQTPGraph ( JKQTPlotter * parent ) ;
2018-12-28 05:52:00 +08:00
/** \brief default wirtual destructor */
2019-02-03 21:04:48 +08:00
virtual ~ JKQTPGraph ( ) = default ;
2018-12-28 05:52:00 +08:00
2019-02-03 21:04:48 +08:00
/** \brief returns \c true if the given column is used by the graph
*
* This virtual function indicates whether a given column is used by this graph .
* Override this function in your derived graphs to indicate to JKQTPlotter / JKQTBasePlotter , which columns
* from the internal JKQTPDatastore are actually used . This information can be used e . g . for graph - specific data - export .
*/
2018-12-28 05:52:00 +08:00
virtual bool usesColumn ( int column ) const ;
protected :
/** \brief this function is used to plot error inidcators before plotting the graphs.
*
* By default this function does nothing . But children of this class may overwrite it to implement
* drawing error indicators .
*/
virtual void drawErrorsBefore ( JKQTPEnhancedPainter & /*painter*/ ) ;
/** \brief this function is used to plot error inidcators after plotting the graphs.
*
* By default this function does nothing . But children of this class may overwrite it to implement
* drawing error indicators .
*/
virtual void drawErrorsAfter ( JKQTPEnhancedPainter & /*painter*/ ) ;
2018-11-25 21:53:26 +08:00
/** \brief get the maximum and minimum value of the given column
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
bool getDataMinMax ( int column , double & minx , double & maxx , double & smallestGreaterZero ) ;
2019-02-03 21:04:48 +08:00
protected :
2019-01-20 17:49:29 +08:00
friend class JKQTPGraphErrors ;
2018-11-25 21:53:26 +08:00
} ;
2019-01-20 23:15:10 +08:00
/** \brief this is the virtual base class of all JKQTPPlotElement's in a JKQTPlotter plot that
2018-12-28 05:52:00 +08:00
* represent geometric forms or annotations . They have extended coordinate transform capabilities , because
* in addition to using the plot coordinates , you can also choose to use different other
* coordinate systems
2019-01-13 01:53:16 +08:00
* \ ingroup jkqtplotter_basegraphs
2018-12-28 05:52:00 +08:00
*
2019-02-03 21:04:48 +08:00
* \ see \ ref jkqtplotter_graphsgroup_classstructure
*
2018-12-28 05:52:00 +08:00
*/
2019-02-03 21:04:48 +08:00
class JKQTP_LIB_EXPORT JKQTPPlotObject : public JKQTPPlotElement {
2018-12-28 05:52:00 +08:00
Q_OBJECT
public :
/** \brief class constructor */
2019-01-20 17:49:29 +08:00
explicit JKQTPPlotObject ( JKQTBasePlotter * parent = nullptr ) ;
2018-12-28 05:52:00 +08:00
/** \brief class constructor */
2019-01-20 23:15:10 +08:00
explicit JKQTPPlotObject ( JKQTPlotter * parent ) ;
2018-12-28 05:52:00 +08:00
/** \brief default wirtual destructor */
2019-01-20 17:49:29 +08:00
virtual ~ JKQTPPlotObject ( ) ;
2018-12-28 05:52:00 +08:00
protected :
} ;
2019-01-20 17:49:29 +08:00
/*! \brief This virtual JKQTPGraph descendent may be used as base for all graphs that use at least two columns
2018-11-25 21:53:26 +08:00
that specify x and y coordinates for the single plot points .
2019-01-13 01:53:16 +08:00
\ ingroup jkqtplotter_basegraphs
2018-11-25 21:53:26 +08:00
2019-02-03 21:04:48 +08:00
This class implements basic management facilities for the data columns :
- setXColumn ( ) , setYColumn ( ) to set the columns to be used for the graph data
- setDataSortOrder ( ) to specify whether and how the data should be sorted before drawing
\ image html jkqtplotter_unsorted . png " Unsorted Data "
\ image html jkqtplotter_sortedx . png " Data sorted along x-axis (DataSortOrder::SortedX) "
.
. . . and overrides / implements the functions :
- getXMinMax ( )
- getYMinMax ( )
- usesColumn ( )
2018-11-25 21:53:26 +08:00
.
*/
2019-02-03 21:04:48 +08:00
class JKQTP_LIB_EXPORT JKQTPXYGraph : public JKQTPGraph {
2018-11-25 21:53:26 +08:00
Q_OBJECT
public :
2019-02-03 21:04:48 +08:00
/** \brief specifies how to sort the data in a JKQTPXYGraph before drawing
*
* \ image html jkqtplotter_unsorted . png " Unsorted Data "
*
* \ image html jkqtplotter_sortedx . png " Data sorted along x-axis (DataSortOrder::SortedX) "
*/
2018-11-25 21:53:26 +08:00
enum DataSortOrder {
2019-02-03 21:04:48 +08:00
Unsorted = 0 , /*!< \brief the data for a JKQTPXYGraph is not sorted before drawing */
SortedX = 1 , /*!< \brief the data for a JKQTPXYGraph is sorted so the x-values appear in ascending before drawing */
SortedY = 2 /*!< \brief the data for a JKQTPXYGraph is sorted so the y-values appear in ascending before drawing */
2018-11-25 21:53:26 +08:00
} ;
/** \brief class constructor */
2019-01-20 17:49:29 +08:00
JKQTPXYGraph ( JKQTBasePlotter * parent = nullptr ) ;
2018-11-25 21:53:26 +08:00
/** \brief class constructor */
2019-01-20 23:15:10 +08:00
JKQTPXYGraph ( JKQTPlotter * parent ) ;
2018-11-25 21:53:26 +08:00
/** \brief get the maximum and minimum x-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
2018-12-28 05:52:00 +08:00
virtual bool getXMinMax ( double & minx , double & maxx , double & smallestGreaterZero ) override ;
2018-11-25 21:53:26 +08:00
/** \brief get the maximum and minimum y-value of the graph
*
* The result is given in the two parameters which are call - by - reference parameters !
*/
2018-12-28 05:52:00 +08:00
virtual bool getYMinMax ( double & miny , double & maxy , double & smallestGreaterZero ) override ;
2018-11-25 21:53:26 +08:00
2019-01-20 17:49:29 +08:00
/** \copydoc JKQTPGraph::usesColumn() */
2018-12-28 05:52:00 +08:00
virtual bool usesColumn ( int column ) const override ;
2018-11-25 21:53:26 +08:00
2019-02-08 00:24:46 +08:00
/*! \copydoc xColumn
\ see see xColumn for details */
2019-01-26 20:00:40 +08:00
inline virtual void setXColumn ( int __value )
2019-01-10 04:23:24 +08:00
{
this - > xColumn = __value ;
}
2019-02-08 00:24:46 +08:00
/*! \copydoc xColumn
\ see see xColumn for details */
2019-01-26 20:00:40 +08:00
inline virtual int getXColumn ( ) const
2019-01-10 04:23:24 +08:00
{
return this - > xColumn ;
}
2019-01-26 20:00:40 +08:00
/*! \brief sets the property xColumn ( \copybrief xColumn ) to the specified \a __value, where __value is static_cast'ed from size_t to int.
2019-01-25 05:49:10 +08:00
\ details Description of the parameter xColumn is : < BLOCKQUOTE > \ copydoc xColumn < / BLOCKQUOTE >
2019-02-08 00:24:46 +08:00
\ see xColumn for more information */
2019-01-26 20:00:40 +08:00
inline virtual void setXColumn ( size_t __value ) { this - > xColumn = static_cast < int > ( __value ) ; }
2019-02-08 00:24:46 +08:00
/*! \copydoc yColumn
\ see see yColumn for details */
2019-01-26 20:00:40 +08:00
inline virtual void setYColumn ( int __value )
2019-01-10 04:23:24 +08:00
{
this - > yColumn = __value ;
}
2019-02-08 00:24:46 +08:00
/*! \copydoc yColumn
\ see see yColumn for details */
2019-01-26 20:00:40 +08:00
inline virtual int getYColumn ( ) const
2019-01-10 04:23:24 +08:00
{
return this - > yColumn ;
}
2019-01-26 20:00:40 +08:00
/*! \brief sets the property yColumn ( \copybrief yColumn ) to the specified \a __value, where __value is static_cast'ed from size_t to int.
2019-01-25 05:49:10 +08:00
\ details Description of the parameter yColumn is : < BLOCKQUOTE > \ copydoc yColumn < / BLOCKQUOTE >
2019-02-08 00:24:46 +08:00
\ see yColumn for more information */
2019-01-26 20:00:40 +08:00
inline virtual void setYColumn ( size_t __value ) { this - > yColumn = static_cast < int > ( __value ) ; }
2019-02-08 00:24:46 +08:00
/*! \copydoc sortData
\ see see sortData for details */
2019-04-22 23:19:52 +08:00
inline virtual void setDataSortOrder ( DataSortOrder __value )
2019-01-10 04:23:24 +08:00
{
this - > sortData = __value ;
}
2019-02-08 00:24:46 +08:00
/*! \copydoc sortData
\ see see sortData for details */
2019-02-03 21:04:48 +08:00
inline virtual DataSortOrder getDataSortOrder ( ) const
2019-01-10 04:23:24 +08:00
{
return this - > sortData ;
}
2019-01-26 20:00:40 +08:00
/*! \brief sets the property sortData ( \copybrief sortData ) to the specified \a __value. \details Description of the parameter sortData is: <BLOCKQUOTE>\copydoc sortData </BLOCKQUOTE> \see sortData for more information */
2019-02-03 21:04:48 +08:00
void setDataSortOrder ( int __value ) ;
2018-11-25 21:53:26 +08:00
protected :
/** \brief the column that contains the x-component of the datapoints */
int xColumn ;
/** \brief the column that contains the y-component of the datapoints */
int yColumn ;
/** \brief if \c !=Unsorted, the data is sorted before plotting */
DataSortOrder sortData ;
/** \brief this array contains the order of indices, in which to access the data in the data columns */
QVector < int > sortedIndices ;
virtual void intSortData ( ) ;
2018-12-28 05:52:00 +08:00
/** \brief returns the index of the i-th datapoint (where i is an index into the SORTED datapoints)
*
* This function can beu used to get the correct datapoint after sorting the datapoints ,
* As sorting is done by sorting an index and not reordering the data in the columns themselves .
2019-02-03 21:04:48 +08:00
*
* \ see setDataSortOrder ( ) , getDataSortOrder ( )
2018-12-28 05:52:00 +08:00
* */
2019-02-03 21:04:48 +08:00
inline int getDataIndex ( int i ) {
2018-11-25 21:53:26 +08:00
if ( sortData = = Unsorted ) return i ;
return sortedIndices . value ( i , i ) ;
}
} ;
2019-01-20 17:49:29 +08:00
/*! \brief This virtual JKQTPGraph descendent may be used as base for all graphs that use at least one column
2018-11-25 21:53:26 +08:00
of data
2019-01-13 01:53:16 +08:00
\ ingroup jkqtplotter_basegraphs
2018-11-25 21:53:26 +08:00
2019-02-03 21:04:48 +08:00
\ see \ ref jkqtplotter_graphsgroup_classstructure
2018-11-25 21:53:26 +08:00
*/
2019-02-03 21:04:48 +08:00
class JKQTP_LIB_EXPORT JKQTPSingleColumnGraph : public JKQTPGraph {
2018-11-25 21:53:26 +08:00
Q_OBJECT
public :
2019-02-03 21:04:48 +08:00
/** \brief specifies how to sort the data for a JKQTPSingleColumnGraph before drawing
*
* \ image html jkqtplotter_unsorted . png " Unsorted Data "
*
* \ image html jkqtplotter_sortedx . png " Data sorted along x-axis (DataSortOrder::SortedX) "
*/
2018-11-25 21:53:26 +08:00
enum DataSortOrder {
2019-02-03 21:04:48 +08:00
Unsorted = 0 , /*!< \brief the data for a JKQTPSingleColumnGraph is not sorted before drawing */
Sorted = 1 /*!< \brief the data for a JKQTPSingleColumnGraph is sorted (in ascending order) before drawing */
2018-11-25 21:53:26 +08:00
} ;
2019-01-20 23:15:10 +08:00
2019-02-03 21:04:48 +08:00
/** \brief specifies whether the data for a JKQTPSingleColumnGraph represent x-axis or y-axis values */
2019-01-20 23:15:10 +08:00
enum class DataDirection {
2019-02-03 21:04:48 +08:00
X , /*!< \brief the data for a JKQTPSingleColumnGraph is data belonging to the x-axis of the plot */
Y /*!< \brief the data for a JKQTPSingleColumnGraph is data belonging to the y-axis of the plot */
2019-01-20 23:15:10 +08:00
} ;
2018-11-25 21:53:26 +08:00
/** \brief class constructor */
2019-01-20 17:49:29 +08:00
JKQTPSingleColumnGraph ( JKQTBasePlotter * parent = nullptr ) ;
2019-01-20 23:15:10 +08:00
JKQTPSingleColumnGraph ( JKQTPlotter * parent ) ;
2018-11-25 21:53:26 +08:00
2019-02-08 00:24:46 +08:00
/*! \copydoc dataColumn
\ see see dataColumn for details */
2019-04-22 19:27:50 +08:00
void setDataColumn ( int __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc dataColumn
\ see see dataColumn for details */
2019-04-22 19:27:50 +08:00
int getDataColumn ( ) const ;
2019-01-26 20:00:40 +08:00
/*! \brief sets the property dataColumn ( \copybrief dataColumn ) to the specified \a __value, where __value is static_cast'ed from size_t to int.
2019-01-25 05:49:10 +08:00
\ details Description of the parameter dataColumn is : < BLOCKQUOTE > \ copydoc dataColumn < / BLOCKQUOTE >
2019-02-08 00:24:46 +08:00
\ see dataColumn for more information */
2019-04-22 19:27:50 +08:00
void setDataColumn ( size_t __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc sortData
\ see see sortData for details */
2019-04-22 23:19:52 +08:00
void setDataSortOrder ( DataSortOrder __value ) ;
2019-02-08 00:24:46 +08:00
/*! \copydoc sortData
\ see see sortData for details */
2019-04-22 19:27:50 +08:00
DataSortOrder getDataSortOrder ( ) const ;
2019-01-26 20:00:40 +08:00
/*! \brief sets the property sortData ( \copybrief sortData ) to the specified \a __value. \details Description of the parameter sortData is: <BLOCKQUOTE>\copydoc sortData </BLOCKQUOTE> \see sortData for more information */
2019-02-03 21:04:48 +08:00
void setDataSortOrder ( int __value ) ;
2018-11-25 21:53:26 +08:00
2019-04-22 19:27:50 +08:00
/*! \copydoc dataDirection
\ see see dataDirection for details */
void setDataDirection ( DataDirection __value ) ;
/*! \copydoc dataDirection
\ see see dataDirection for details */
DataDirection getDataDirection ( ) const ;
2019-01-20 17:49:29 +08:00
/** \copydoc JKQTPGraph::usesColumn() */
2018-12-28 05:52:00 +08:00
virtual bool usesColumn ( int c ) const override ;
2018-11-25 21:53:26 +08:00
protected :
/** \brief the column that contains the datapoints */
int dataColumn ;
2019-04-22 19:27:50 +08:00
/** \brief interpret the data from dataColumn either as X- or Y-data */
DataDirection dataDirection ;
2018-11-25 21:53:26 +08:00
/** \brief if \c !=Unsorted, the data is sorted before plotting */
DataSortOrder sortData ;
/** \brief this array contains the order of indices, in which to access the data in the data columns */
QVector < int > sortedIndices ;
virtual void intSortData ( ) ;
2018-12-28 05:52:00 +08:00
/** \brief returns the index of the i-th datapoint (where i is an index into the SORTED datapoints)
*
* This function can beu used to get the correct datapoint after sorting the datapoints ,
* As sorting is done by sorting an index and not reordering the data in the columns themselves .
* */
2019-04-22 19:27:50 +08:00
inline int getDataIndex ( int i ) {
2018-11-25 21:53:26 +08:00
if ( sortData = = Unsorted ) return i ;
return sortedIndices . value ( i , i ) ;
}
2018-12-28 05:52:00 +08:00
2018-11-25 21:53:26 +08:00
} ;
2019-02-08 00:24:46 +08:00
# endif // JKQTPGRAPHSBASE_H