mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-14 08:38:45 +00:00
Upgrade to QWT 6.0.1, but still uses a locally patched copy since support for 8 axes has not been included, despite it being a relatively simple patch. Fixes #634. Fixes #567.
145 lines
5.4 KiB
C++
145 lines
5.4 KiB
C++
/*
|
|
* Copyright (c) 2009 Mark Liversedge (liversedge@gmail.com)
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
* Software Foundation; either version 2 of the License, or (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 General Public License for
|
|
* more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc., 51
|
|
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
|
|
#include <assert.h>
|
|
#include <QDebug>
|
|
#include <qwt_series_data.h>
|
|
#include <qwt_legend.h>
|
|
#include <qwt_plot_curve.h>
|
|
#include <qwt_plot_canvas.h>
|
|
#include <qwt_plot_grid.h>
|
|
#include "SpinScanPolarPlot.h"
|
|
#include <stdint.h>
|
|
#include "Colors.h"
|
|
|
|
// to avoid excessive floating point operations when updating the display
|
|
// this is a precomputed value for cos(i*15) * (PI / 180)
|
|
static const double cosx[24] = {
|
|
1.000000, 0.965926, 0.866026, 0.707107, 0.500001, 0.258820,
|
|
0.000000, -0.258818, -0.499999, -0.707106, -0.866024, -0.965925,
|
|
-1.000000, -0.965926, -0.866027, -0.707109, -0.500003, -0.258822,
|
|
-0.000004, 0.258815, 0.499997, 0.707104, 0.866023, 0.965925
|
|
};
|
|
|
|
// this is a precomputed value for sin(i*15) * (PI / 180)
|
|
static const double siny[24] = {
|
|
0.000000, 0.258819, 0.500000, 0.707106, 0.866025, 0.965926,
|
|
1.000000, 0.965926, 0.866026, 0.707108, 0.500002, 0.258821,
|
|
0.000000, -0.258817, -0.499998, -0.707105, -0.866024, -0.965925,
|
|
-1.000000, -0.965927, -0.866027, -0.707110, -0.500004, -0.258823
|
|
};
|
|
|
|
// SpinScan force/direction to cartesian for plotting
|
|
size_t SpinScanPolarData::size() const { return 13; }
|
|
//QwtData *SpinScanPolarData::copy() const { return new SpinScanPolarData(spinData, isleft); }
|
|
void SpinScanPolarData::init() { }
|
|
double SpinScanPolarData::x(size_t i) const { i += isleft?0:12; if (i>=24) i=0; return cosx[i] * (double)spinData[i]; }
|
|
double SpinScanPolarData::y(size_t i) const { i += isleft?0:12; if (i>=24) i=0; return siny[i] * (double)spinData[i]; }
|
|
|
|
QPointF SpinScanPolarData::sample(size_t i) const
|
|
{
|
|
return QPointF(x(i), y(i));
|
|
}
|
|
|
|
QRectF SpinScanPolarData::boundingRect() const
|
|
{
|
|
// TODO dgr
|
|
return QRectF(-5000, 5000, 10000, 10000);
|
|
}
|
|
|
|
// Original code before moving to precomputed constants
|
|
//double SpinScanPolarData::x(size_t i) const { if (i==24) i=0; return cos((i*15)*3.14159f/180.00f) * (double)spinData[i]; }
|
|
//double SpinScanPolarData::y(size_t i) const { if (i==24) i=0; return sin((i*15)*3.14159f/180.00f) * (double)spinData[i]; }
|
|
|
|
SpinScanPolarPlot::SpinScanPolarPlot(QWidget *parent, uint8_t *spinData) : QwtPlot(parent), leftCurve(NULL), rightCurve(NULL), spinData(spinData)
|
|
{
|
|
setInstanceName("SpinScan Plot");
|
|
|
|
// Setup the axis
|
|
setAxisTitle(yLeft, "SpinScan");
|
|
setAxisMaxMinor(xBottom, 0);
|
|
setAxisMaxMinor(yLeft, 0);
|
|
|
|
QPalette pal;
|
|
setAxisScale(yLeft, -90, 90); // max 8 bit plus a little
|
|
setAxisScale(xBottom, -90, 90); // max 8 bit plus a little
|
|
pal.setColor(QPalette::WindowText, GColor(CSPINSCANLEFT));
|
|
pal.setColor(QPalette::Text, GColor(CSPINSCANLEFT));
|
|
axisWidget(QwtPlot::yLeft)->setPalette(pal);
|
|
axisWidget(QwtPlot::yLeft)->scaleDraw()->setTickLength(QwtScaleDiv::MajorTick, 3);
|
|
|
|
enableAxis(xBottom, false); // very little value and some cpu overhead
|
|
enableAxis(yLeft, false);
|
|
|
|
rightCurve = new QwtPlotCurve("SpinScan Right");
|
|
rightCurve->setRenderHint(QwtPlotItem::RenderAntialiased); // too cpu intensive
|
|
rightCurve->attach(this);
|
|
rightCurve->setYAxis(QwtPlot::yLeft);
|
|
rightSpinScanPolarData = new SpinScanPolarData(spinData, false);
|
|
|
|
leftCurve = new QwtPlotCurve("SpinScan Left");
|
|
leftCurve->setRenderHint(QwtPlotItem::RenderAntialiased); // too cpu intensive
|
|
leftCurve->attach(this);
|
|
leftCurve->setYAxis(QwtPlot::yLeft);
|
|
leftSpinScanPolarData = new SpinScanPolarData(spinData, true);
|
|
|
|
canvas()->setFrameStyle(QFrame::NoFrame);
|
|
configChanged(); // set colors
|
|
}
|
|
|
|
void
|
|
SpinScanPolarPlot::setAxisTitle(int axis, QString label)
|
|
{
|
|
// setup the default fonts
|
|
QFont stGiles; // hoho - Chart Font St. Giles ... ok you have to be British to get this joke
|
|
stGiles.fromString(appsettings->value(this, GC_FONT_CHARTLABELS, QFont().toString()).toString());
|
|
stGiles.setPointSize(appsettings->value(NULL, GC_FONT_CHARTLABELS_SIZE, 8).toInt());
|
|
|
|
QwtText title(label);
|
|
title.setFont(stGiles);
|
|
QwtPlot::setAxisFont(axis, stGiles);
|
|
QwtPlot::setAxisTitle(axis, title);
|
|
}
|
|
|
|
void
|
|
SpinScanPolarPlot::configChanged()
|
|
{
|
|
setCanvasBackground(GColor(CRIDEPLOTBACKGROUND));
|
|
|
|
QColor col = GColor(CSPINSCANRIGHT);
|
|
col.setAlpha(120);
|
|
QBrush brush = QBrush(col);
|
|
QPen pen(col);
|
|
pen.setWidth(4); // thicker pen
|
|
rightCurve->setBrush(Qt::NoBrush);
|
|
rightCurve->setPen(pen);
|
|
rightCurve->setStyle(QwtPlotCurve::Lines);
|
|
rightCurve->setData(rightSpinScanPolarData);
|
|
|
|
QColor col2 = GColor(CSPINSCANLEFT);
|
|
col2.setAlpha(120);
|
|
QBrush brush2 = QBrush(col2);
|
|
QPen pen2(col2);
|
|
pen2.setWidth(4); // thicker pen
|
|
leftCurve->setBrush(Qt::NoBrush);
|
|
leftCurve->setPen(pen2);
|
|
leftCurve->setStyle(QwtPlotCurve::Lines);
|
|
leftCurve->setData(leftSpinScanPolarData);
|
|
}
|