QWT 7.0.1
Loading...
Searching...
No Matches
qwt_series_data.h
1/******************************************************************************
2 * Qwt Widget Library
3 * Copyright (C) 1997 Josef Wilgen
4 * Copyright (C) 2002 Uwe Rathmann
5 *
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 *
9 * Modified by ChenZongYan in 2024 <czy.t@163.com>
10 * Summary of major modifications (see ChangeLog.md for full history):
11 * 1. CMake build system & C++11 throughout.
12 * 2. Core panner/ zoomer refactored:
13 * - QwtPanner → QwtCachePanner (pixmap-cache version)
14 * - New real-time QwtPlotPanner derived from QwtPicker.
15 * 3. Zoomer supports multi-axis.
16 * 4. Parasite-plot framework:
17 * - QwtFigure, QwtPlotParasiteLayout, QwtPlotTransparentCanvas,
18 * - QwtPlotScaleEventDispatcher, built-in pan/zoom on axis.
19 * 5. New picker: QwtPlotSeriesDataPicker (works with date axis).
20 * 6. Raster & color-map extensions:
21 * - QwtGridRasterData (2-D table + interpolation)
22 * - QwtLinearColorMap::stopColors(), stopPos() API rename.
23 * 7. Bar-chart: expose pen/brush control.
24 * 8. Amalgamated build: single QwtPlot.h / QwtPlot.cpp pair in src-amalgamate.
25 *****************************************************************************/
26
27#ifndef QWT_SERIES_DATA_H
28#define QWT_SERIES_DATA_H
29
30#include "qwt_global.h"
31#include "qwt_samples.h"
32#include "qwt_point_3d.h"
33
34#include <qvector.h>
35#include <qrect.h>
36
37class QwtPointPolar;
38
65template< typename T >
67{
68public:
71
73 virtual ~QwtSeriesData();
74
75#ifndef QWT_PYTHON_WRAPPER
76
78 virtual size_t size() const = 0;
79
85 virtual T sample(size_t i) const = 0;
86
99 virtual QRectF boundingRect() const = 0;
100
101#else
102 // Needed for generating the python bindings, but not for using them !
103 virtual size_t size() const
104 {
105 return 0;
106 }
107 virtual T sample(size_t i) const
108 {
109 return T();
110 }
111 virtual QRectF boundingRect() const
112 {
113 return cachedBoundingRect;
114 }
115#endif
116
128 virtual void setRectOfInterest(const QRectF& rect);
129
130protected:
132 mutable QRectF cachedBoundingRect;
133
134private:
135 QwtSeriesData< T >& operator=(const QwtSeriesData< T >&);
136};
137
138template< typename T >
139QwtSeriesData< T >::QwtSeriesData() : cachedBoundingRect(0.0, 0.0, -1.0, -1.0)
140{
141}
142
143template< typename T >
147
148template< typename T >
150{
151}
152
159template< typename T >
161{
162public:
165
178
180 const QVector< T > samples() const;
181
183 virtual size_t size() const QWT_OVERRIDE;
184
191 virtual T sample(size_t index) const QWT_OVERRIDE;
192
193protected:
196};
197
198template< typename T >
202
203template< typename T >
207
208template< typename T >
210{
211 m_samples = std::move(samples);
212}
213
214template< typename T >
216{
217 QwtSeriesData< T >::cachedBoundingRect = QRectF(0.0, 0.0, -1.0, -1.0);
218 m_samples = samples;
219}
220
221template< typename T >
223{
224 QwtSeriesData< T >::cachedBoundingRect = QRectF(0.0, 0.0, -1.0, -1.0);
225 m_samples = std::move(samples);
226}
227
228template< typename T >
230{
231 return m_samples;
232}
233
234template< typename T >
236{
237 return m_samples.size();
238}
239
240template< typename T >
242{
243 return m_samples[ static_cast< int >(i) ];
244}
245
247class QWT_EXPORT QwtPointSeriesData : public QwtArraySeriesData< QPointF >
248{
249public:
251
252 virtual QRectF boundingRect() const QWT_OVERRIDE;
253};
254
256class QWT_EXPORT QwtPoint3DSeriesData : public QwtArraySeriesData< QwtPoint3D >
257{
258public:
260
261 virtual QRectF boundingRect() const QWT_OVERRIDE;
262};
263
265class QWT_EXPORT QwtIntervalSeriesData : public QwtArraySeriesData< QwtIntervalSample >
266{
267public:
269
270 virtual QRectF boundingRect() const QWT_OVERRIDE;
271};
272
274class QWT_EXPORT QwtSetSeriesData : public QwtArraySeriesData< QwtSetSample >
275{
276public:
278
279 virtual QRectF boundingRect() const QWT_OVERRIDE;
280};
281
283class QWT_EXPORT QwtVectorFieldData : public QwtArraySeriesData< QwtVectorFieldSample >
284{
285public:
287
288 virtual QRectF boundingRect() const QWT_OVERRIDE;
289};
290
294class QWT_EXPORT QwtTradingChartData : public QwtArraySeriesData< QwtOHLCSample >
295{
296public:
298
299 virtual QRectF boundingRect() const QWT_OVERRIDE;
300};
301
302QWT_EXPORT QRectF qwtBoundingRect(const QwtSeriesData< QPointF >&, size_t from = 0, size_t to = 0);
303
304QWT_EXPORT QRectF qwtBoundingRect(const QwtSeriesData< QwtPoint3D >&, size_t from = 0, size_t to = 0);
305
306QWT_EXPORT QRectF qwtBoundingRect(const QwtSeriesData< QwtPointPolar >&, size_t from = 0, size_t to = 0);
307
308QWT_EXPORT QRectF qwtBoundingRect(const QwtSeriesData< QwtIntervalSample >&, size_t from = 0, size_t to = 0);
309
310QWT_EXPORT QRectF qwtBoundingRect(const QwtSeriesData< QwtSetSample >&, size_t from = 0, size_t to = 0);
311
312QWT_EXPORT QRectF qwtBoundingRect(const QwtSeriesData< QwtOHLCSample >&, size_t from = 0, size_t to = 0);
313
314QWT_EXPORT QRectF qwtBoundingRect(const QwtSeriesData< QwtVectorFieldSample >&, size_t from = 0, size_t to = 0);
315
400template< typename T, typename LessThan >
401inline size_t qwtUpperSampleIndex(const QwtSeriesData< T >& series, double value, LessThan lessThan)
402{
403 const size_t count = series.size();
404 if (count == 0) {
405 return count; // 返回 0 作为“未找到”的标记(因为有效索引从 0 开始,count 超出了有效范围)
406 }
407
408 const size_t indexMax = count - 1;
409
410 // 如果 value 大于等于最后一个元素,说明没有元素大于 value,返回 count
411 if (!lessThan(value, series.sample(indexMax))) {
412 return count;
413 }
414
415 size_t indexMin = 0;
416 size_t n = indexMax; // n 表示当前搜索区间的大小
417
418 while (n > 0) {
419 const size_t half = n >> 1;
420 const size_t indexMid = indexMin + half;
421
422 if (lessThan(value, series.sample(indexMid))) {
423 // 目标在左侧区间 [indexMin, indexMid]
424 n = half;
425 } else {
426 // 目标在右侧区间 [indexMid + 1, indexMin + n - 1]
427 indexMin = indexMid + 1;
428 n -= half + 1;
429 }
430 }
431
432 return indexMin;
433}
434
435#endif
Definition qwt_clipper.h:40
Template class for data, that is organized as QVector.
Definition qwt_series_data.h:161
QwtArraySeriesData()
Constructor.
Definition qwt_series_data.h:199
void setSamples(const QVector< T > &samples)
Assign an array of samples.
Definition qwt_series_data.h:215
QwtArraySeriesData(const QVector< T > &samples)
Constructor.
Definition qwt_series_data.h:204
virtual T sample(size_t index) const QWT_OVERRIDE
Definition qwt_series_data.h:241
virtual size_t size() const QWT_OVERRIDE
Definition qwt_series_data.h:235
QVector< T > m_samples
Vector of samples.
Definition qwt_series_data.h:195
const QVector< T > samples() const
Definition qwt_series_data.h:229
Interface for iterating over an array of intervals.
Definition qwt_series_data.h:266
Interface for iterating over an array of 3D points.
Definition qwt_series_data.h:257
A point in polar coordinates.
Definition qwt_point_polar.h:46
Interface for iterating over an array of points.
Definition qwt_series_data.h:248
Abstract interface for iterating over samples.
Definition qwt_series_data.h:67
virtual void setRectOfInterest(const QRectF &rect)
Set a the "rect of interest".
Definition qwt_series_data.h:149
virtual size_t size() const =0
QwtSeriesData()
Constructor.
Definition qwt_series_data.h:139
virtual ~QwtSeriesData()
Destructor.
Definition qwt_series_data.h:144
QRectF cachedBoundingRect
Can be used to cache a calculated bounding rectangle.
Definition qwt_series_data.h:132
virtual T sample(size_t i) const =0
Return a sample.
virtual QRectF boundingRect() const =0
Calculate the bounding rect of all samples.
Interface for iterating over an array of samples.
Definition qwt_series_data.h:275
Interface for iterating over an array of OHLC samples.
Definition qwt_series_data.h:295
Interface for iterating over an array of vector field samples.
Definition qwt_series_data.h:284