You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
346 lines
8.6 KiB
346 lines
8.6 KiB
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** |
|
* Qwt Widget Library |
|
* Copyright (C) 1997 Josef Wilgen |
|
* Copyright (C) 2002 Uwe Rathmann |
|
* |
|
* This library is free software; you can redistribute it and/or |
|
* modify it under the terms of the Qwt License, Version 1.0 |
|
*****************************************************************************/ |
|
|
|
#include "qwt_series_data.h" |
|
#include "qwt_math.h" |
|
|
|
static inline QRectF qwtBoundingRect( const QPointF &sample ) |
|
{ |
|
return QRectF( sample.x(), sample.y(), 0.0, 0.0 ); |
|
} |
|
|
|
static inline QRectF qwtBoundingRect( const QwtPoint3D &sample ) |
|
{ |
|
return QRectF( sample.x(), sample.y(), 0.0, 0.0 ); |
|
} |
|
|
|
static inline QRectF qwtBoundingRect( const QwtPointPolar &sample ) |
|
{ |
|
return QRectF( sample.azimuth(), sample.radius(), 0.0, 0.0 ); |
|
} |
|
|
|
static inline QRectF qwtBoundingRect( const QwtIntervalSample &sample ) |
|
{ |
|
return QRectF( sample.interval.minValue(), sample.value, |
|
sample.interval.maxValue() - sample.interval.minValue(), 0.0 ); |
|
} |
|
|
|
static inline QRectF qwtBoundingRect( const QwtSetSample &sample ) |
|
{ |
|
double minY = sample.set[0]; |
|
double maxY = sample.set[0]; |
|
|
|
for ( int i = 1; i < sample.set.size(); i++ ) |
|
{ |
|
if ( sample.set[i] < minY ) |
|
minY = sample.set[i]; |
|
if ( sample.set[i] > maxY ) |
|
maxY = sample.set[i]; |
|
} |
|
|
|
double minX = sample.value; |
|
double maxX = sample.value; |
|
|
|
return QRectF( minX, minY, maxX - minX, maxY - minY ); |
|
} |
|
|
|
static inline QRectF qwtBoundingRect( const QwtOHLCSample &sample ) |
|
{ |
|
const QwtInterval interval = sample.boundingInterval(); |
|
return QRectF( interval.minValue(), sample.time, interval.width(), 0.0 ); |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle of a series subset |
|
|
|
Slow implementation, that iterates over the series. |
|
|
|
\param series Series |
|
\param from Index of the first sample, <= 0 means from the beginning |
|
\param to Index of the last sample, < 0 means to the end |
|
|
|
\return Bounding rectangle |
|
*/ |
|
|
|
template <class T> |
|
QRectF qwtBoundingRectT( |
|
const QwtSeriesData<T>& series, int from, int to ) |
|
{ |
|
QRectF boundingRect( 1.0, 1.0, -2.0, -2.0 ); // invalid; |
|
|
|
if ( from < 0 ) |
|
from = 0; |
|
|
|
if ( to < 0 ) |
|
to = static_cast<int>(series.size()) - 1; |
|
|
|
if ( to < from ) |
|
return boundingRect; |
|
|
|
int i; |
|
for ( i = from; i <= to; i++ ) |
|
{ |
|
const QRectF rect = qwtBoundingRect( series.sample( i ) ); |
|
if ( rect.width() >= 0.0 && rect.height() >= 0.0 ) |
|
{ |
|
boundingRect = rect; |
|
i++; |
|
break; |
|
} |
|
} |
|
|
|
for ( ; i <= to; i++ ) |
|
{ |
|
const QRectF rect = qwtBoundingRect( series.sample( i ) ); |
|
if ( rect.width() >= 0.0 && rect.height() >= 0.0 ) |
|
{ |
|
boundingRect.setLeft( qMin( boundingRect.left(), rect.left() ) ); |
|
boundingRect.setRight( qMax( boundingRect.right(), rect.right() ) ); |
|
boundingRect.setTop( qMin( boundingRect.top(), rect.top() ) ); |
|
boundingRect.setBottom( qMax( boundingRect.bottom(), rect.bottom() ) ); |
|
} |
|
} |
|
|
|
return boundingRect; |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle of a series subset |
|
|
|
Slow implementation, that iterates over the series. |
|
|
|
\param series Series |
|
\param from Index of the first sample, <= 0 means from the beginning |
|
\param to Index of the last sample, < 0 means to the end |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF qwtBoundingRect( |
|
const QwtSeriesData<QPointF> &series, int from, int to ) |
|
{ |
|
return qwtBoundingRectT<QPointF>( series, from, to ); |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle of a series subset |
|
|
|
Slow implementation, that iterates over the series. |
|
|
|
\param series Series |
|
\param from Index of the first sample, <= 0 means from the beginning |
|
\param to Index of the last sample, < 0 means to the end |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF qwtBoundingRect( |
|
const QwtSeriesData<QwtPoint3D> &series, int from, int to ) |
|
{ |
|
return qwtBoundingRectT<QwtPoint3D>( series, from, to ); |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle of a series subset |
|
|
|
The horizontal coordinates represent the azimuth, the |
|
vertical coordinates the radius. |
|
|
|
Slow implementation, that iterates over the series. |
|
|
|
\param series Series |
|
\param from Index of the first sample, <= 0 means from the beginning |
|
\param to Index of the last sample, < 0 means to the end |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF qwtBoundingRect( |
|
const QwtSeriesData<QwtPointPolar> &series, int from, int to ) |
|
{ |
|
return qwtBoundingRectT<QwtPointPolar>( series, from, to ); |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle of a series subset |
|
|
|
Slow implementation, that iterates over the series. |
|
|
|
\param series Series |
|
\param from Index of the first sample, <= 0 means from the beginning |
|
\param to Index of the last sample, < 0 means to the end |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF qwtBoundingRect( |
|
const QwtSeriesData<QwtIntervalSample>& series, int from, int to ) |
|
{ |
|
return qwtBoundingRectT<QwtIntervalSample>( series, from, to ); |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle of a series subset |
|
|
|
Slow implementation, that iterates over the series. |
|
|
|
\param series Series |
|
\param from Index of the first sample, <= 0 means from the beginning |
|
\param to Index of the last sample, < 0 means to the end |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF qwtBoundingRect( |
|
const QwtSeriesData<QwtOHLCSample>& series, int from, int to ) |
|
{ |
|
return qwtBoundingRectT<QwtOHLCSample>( series, from, to ); |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle of a series subset |
|
|
|
Slow implementation, that iterates over the series. |
|
|
|
\param series Series |
|
\param from Index of the first sample, <= 0 means from the beginning |
|
\param to Index of the last sample, < 0 means to the end |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF qwtBoundingRect( |
|
const QwtSeriesData<QwtSetSample>& series, int from, int to ) |
|
{ |
|
return qwtBoundingRectT<QwtSetSample>( series, from, to ); |
|
} |
|
|
|
/*! |
|
Constructor |
|
\param samples Samples |
|
*/ |
|
QwtPointSeriesData::QwtPointSeriesData( |
|
const QVector<QPointF> &samples ): |
|
QwtArraySeriesData<QPointF>( samples ) |
|
{ |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle |
|
|
|
The bounding rectangle is calculated once by iterating over all |
|
points and is stored for all following requests. |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF QwtPointSeriesData::boundingRect() const |
|
{ |
|
if ( d_boundingRect.width() < 0.0 ) |
|
d_boundingRect = qwtBoundingRect( *this ); |
|
|
|
return d_boundingRect; |
|
} |
|
|
|
/*! |
|
Constructor |
|
\param samples Samples |
|
*/ |
|
QwtPoint3DSeriesData::QwtPoint3DSeriesData( |
|
const QVector<QwtPoint3D> &samples ): |
|
QwtArraySeriesData<QwtPoint3D>( samples ) |
|
{ |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle |
|
|
|
The bounding rectangle is calculated once by iterating over all |
|
points and is stored for all following requests. |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF QwtPoint3DSeriesData::boundingRect() const |
|
{ |
|
if ( d_boundingRect.width() < 0.0 ) |
|
d_boundingRect = qwtBoundingRect( *this ); |
|
|
|
return d_boundingRect; |
|
} |
|
|
|
/*! |
|
Constructor |
|
\param samples Samples |
|
*/ |
|
QwtIntervalSeriesData::QwtIntervalSeriesData( |
|
const QVector<QwtIntervalSample> &samples ): |
|
QwtArraySeriesData<QwtIntervalSample>( samples ) |
|
{ |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle |
|
|
|
The bounding rectangle is calculated once by iterating over all |
|
points and is stored for all following requests. |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF QwtIntervalSeriesData::boundingRect() const |
|
{ |
|
if ( d_boundingRect.width() < 0.0 ) |
|
d_boundingRect = qwtBoundingRect( *this ); |
|
|
|
return d_boundingRect; |
|
} |
|
|
|
/*! |
|
Constructor |
|
\param samples Samples |
|
*/ |
|
QwtSetSeriesData::QwtSetSeriesData( |
|
const QVector<QwtSetSample> &samples ): |
|
QwtArraySeriesData<QwtSetSample>( samples ) |
|
{ |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle |
|
|
|
The bounding rectangle is calculated once by iterating over all |
|
points and is stored for all following requests. |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF QwtSetSeriesData::boundingRect() const |
|
{ |
|
if ( d_boundingRect.width() < 0.0 ) |
|
d_boundingRect = qwtBoundingRect( *this ); |
|
|
|
return d_boundingRect; |
|
} |
|
|
|
/*! |
|
Constructor |
|
\param samples Samples |
|
*/ |
|
QwtTradingChartData::QwtTradingChartData( |
|
const QVector<QwtOHLCSample> &samples ): |
|
QwtArraySeriesData<QwtOHLCSample>( samples ) |
|
{ |
|
} |
|
|
|
/*! |
|
\brief Calculate the bounding rectangle |
|
|
|
The bounding rectangle is calculated once by iterating over all |
|
points and is stored for all following requests. |
|
|
|
\return Bounding rectangle |
|
*/ |
|
QRectF QwtTradingChartData::boundingRect() const |
|
{ |
|
if ( d_boundingRect.width() < 0.0 ) |
|
d_boundingRect = qwtBoundingRect( *this ); |
|
|
|
return d_boundingRect; |
|
}
|
|
|