《Qt开发》基于QwtPolar的极坐标图绘制

news2025/1/21 0:58:12

QwtPolar绘制极坐标图

该示例包含以下功能:

  1. 使用QwtPolarPlot绘制极坐标曲线
  2. 实现曲线的缩放和平移
  3. 调整极坐标为顺时针顺序

 

1. 创建项目

创建项目名称为QwtPolarDemo1,并添加一个Qt5Class类,命名为myPlot。

2. 配置项目

在项目——属性——C/C++——常规——附加包含目录中添加QWT和QWTpolar

在项目——属性——C/C++——预处理器——预处理器定义中添加QWT_DLL和QWT_POLAR_DLL

在项目——属性——链接器——输入——附加依赖项中添加qwt.lib和qwtpolar.lib

示例程序

myplot.h头文件内容如下:

#ifndef MYPLOT_H

#define MYPLOT_H

#include <qwt_polar_plot.h>

#include <qwt_polar_grid.h>

#include <qwt_polar_curve.h>

class PlotSettings

{

public:

    enum Curve

    {

        Spiral,

        Rose,

        NumCurves

    };

    enum Flag

    {

        MajorGridBegin,

        MinorGridBegin = MajorGridBegin + QwtPolar::ScaleCount,

        AxisBegin = MinorGridBegin + QwtPolar::ScaleCount,

        AutoScaling = AxisBegin + QwtPolar::AxesCount,

        Inverted,

        Logarithmic,

        Antialiasing,

        CurveBegin,

        NumFlags = CurveBegin + NumCurves

    };

    bool flags[NumFlags];

};

class myPlot : public QwtPolarPlot

{

    Q_OBJECT

public:

    myPlot(QWidget *parent);

    ~myPlot();

    QwtPolarCurve *createCurve(int id) const;

    QwtPolarGrid *d_grid;

    QwtPolarCurve *d_curve[PlotSettings::NumCurves];

};

#endif // MYPLOT_H

myplot.cpp源文件内容如下:

#include "myplot.h"

#include <qwt_series_data.h>

#include <qwt_symbol.h>

#include <qwt_legend.h>

#include <qwt_polar_grid.h>

#include <qwt_polar_curve.h>

#include <qwt_polar_marker.h>

#include <qwt_scale_engine.h>

#define pi 3.1415926535898

const QwtInterval radialInterval(0.0, 10.0);   //径向范围

const QwtInterval azimuthInterval(0.0, 360.0); //角度范围

class Data : public QwtSeriesData<QwtPointPolar>

{

public:

    Data(const QwtInterval &radialInterval,

        const QwtInterval &azimuthInterval, size_t size) :

        d_radialInterval(radialInterval),

        d_azimuthInterval(azimuthInterval),

        d_size(size)

    {

    }

    virtual size_t size() const

    {

        return d_size;

    }

protected:

    QwtInterval d_radialInterval;

    QwtInterval d_azimuthInterval;

    size_t d_size;

};

class SpiralData : public Data

{

public:

    SpiralData(const QwtInterval &radialInterval,

        const QwtInterval &azimuthInterval, size_t size) :

        Data(radialInterval, azimuthInterval, size)

    {

    }

    virtual QwtPointPolar sample(size_t i) const

    {

        const double stepA = 4 * d_azimuthInterval.width() / d_size;

        const double a = d_azimuthInterval.minValue() + i * stepA;

        const double stepR = d_radialInterval.width() / d_size;

        const double r = d_radialInterval.minValue() + i * stepR;

        return QwtPointPolar(a, r);

    }

    virtual QRectF boundingRect() const

    {

        if (d_boundingRect.width() < 0.0)

            d_boundingRect = qwtBoundingRect(*this);

        return d_boundingRect;

    }

};

class RoseData : public Data

{

public:

    RoseData(const QwtInterval &radialInterval,

        const QwtInterval &azimuthInterval, size_t size) :

        Data(radialInterval, azimuthInterval, size)

    {

    }

    virtual QwtPointPolar sample(size_t i) const

    {

        const double stepA = d_azimuthInterval.width() / d_size;

        const double a = d_azimuthInterval.minValue() + i * stepA;

        const double d = a / 360.0 * M_PI;

        const double r = d_radialInterval.maxValue() * qAbs(qSin(4 * d));

        return QwtPointPolar(a, r);

    }

    virtual QRectF boundingRect() const

    {

        if (d_boundingRect.width() < 0.0)

            d_boundingRect = qwtBoundingRect(*this);

        return d_boundingRect;

    }

};

myPlot::myPlot(QWidget *parent)

    : QwtPolarPlot(parent)

{

    setAutoReplot(false);

    setPlotBackground(Qt::darkBlue);  //设置背景颜色

    //设置角度顺时针增大

    setAzimuthOrigin(2.0*pi / 3.0);

    setScale(QwtPolar::Azimuth, 330, -30, azimuthInterval.width() / 12);

    setScaleMaxMinor(QwtPolar::Azimuth, 2);  //每个角度30,又被分成2小份

    //径向范围

    setScale(QwtPolar::Radius,

        radialInterval.minValue(), radialInterval.maxValue());

    // grids, axes

    d_grid = new QwtPolarGrid();

    d_grid->setPen(QPen(Qt::darkGreen));

    d_grid->setAxisPen(QwtPolar::AxisAzimuth, QPen(Qt::black));

    d_grid->showAxis(QwtPolar::AxisTop, true);

    d_grid->showAxis(QwtPolar::AxisLeft, false);

    d_grid->showAxis(QwtPolar::AxisBottom, false);

    d_grid->showAxis(QwtPolar::AxisRight, true);

    d_grid->attach(this);

    // curves

    for (int curveId = 0; curveId < PlotSettings::NumCurves; curveId++)

    {

        d_curve[curveId] = createCurve(curveId);

        d_curve[curveId]->attach(this);

    }

    QwtLegend *legend = new QwtLegend;

    insertLegend(legend, QwtPolarPlot::BottomLegend);

}

myPlot::~myPlot()

{

}

QwtPolarCurve *myPlot::createCurve(int id) const

{

    const int numPoints = 200;

    QwtPolarCurve *curve = new QwtPolarCurve();

    curve->setStyle(QwtPolarCurve::Lines);

   

    switch (id)

    {

        case PlotSettings::Spiral:

        {

            curve->setTitle("Spiral");

            curve->setPen(QPen(Qt::yellow, 2));

            curve->setSymbol(new QwtSymbol(QwtSymbol::Rect,

                QBrush(Qt::cyan), QPen(Qt::white), QSize(3, 3)));

            curve->setData(new SpiralData(radialInterval, azimuthInterval, numPoints));

       

        }

        break;

        case PlotSettings::Rose:

        {

            curve->setTitle("Rose");

            curve->setPen(QPen(Qt::red, 2));

            curve->setSymbol(new QwtSymbol(QwtSymbol::Ellipse,

                QBrush(Qt::green), QPen(Qt::white), QSize(3, 3)));

            curve->setData(new RoseData(radialInterval, azimuthInterval, numPoints));          

        }

        break;

    }

    return curve;

}

qwtpolardemo1.h头文件内容如下:

#ifndef QWTPOLARDEMO1_H

#define QWTPOLARDEMO1_H

#include <QtWidgets/QWidget>

#include "ui_qwtpolardemo1.h"

class myPlot;

class QwtPolarPanner;

class QwtPolarMagnifier;

class QwtPolarDemo1 : public QWidget

{

    Q_OBJECT

public:

    QwtPolarDemo1(QWidget *parent = 0);

    ~QwtPolarDemo1();

private:

    Ui::QwtPolarDemo1Class ui;

    myPlot *d_plot;

    QwtPolarPanner *d_panner;

    QwtPolarMagnifier *d_zoomer;

};

#endif // QWTPOLARDEMO1_H

qwtpolardemo1.cpp源文件内容如下:

#include "qwtpolardemo1.h"

#include <qtoolbar.h>

#include <qtoolbutton.h>

#include <qfiledialog.h>

#include <qimagewriter.h>

#include <qfileinfo.h>

#include <qlayout.h>

#ifdef QT_SVG_LIB

#include <qsvggenerator.h>

#endif

#include <qwt_polar_panner.h>

#include <qwt_polar_magnifier.h>

#include <qwt_polar_renderer.h>

#include "myPlot.h"

#include <qlayout.h>

QwtPolarDemo1::QwtPolarDemo1(QWidget *parent)

    : QWidget(parent)

{

    ui.setupUi(this);

    d_plot = new myPlot(this);

    //鼠标滚轮缩放

    d_zoomer = new QwtPolarMagnifier(d_plot->canvas());

    d_zoomer->setEnabled(true);

    //鼠标左键平移

    d_panner = new QwtPolarPanner(d_plot->canvas());

    d_panner->setEnabled(true);

    QHBoxLayout *layout = new QHBoxLayout(ui.widget);

    layout->addWidget(d_plot); 

}

QwtPolarDemo1::~QwtPolarDemo1()

{

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】——初识C++(一)

文章目录1. 进入C1.1 main&#xff08;&#xff09;函数1.2 C注释1.3 C预处理器和iostream文件1.4 头文件名1.5 名称空间1.6 使用cout进行C输出1.6.1 控制符endl1.6.2 换行符1.6.3 使用cout进行拼接1.7 cin1.8 变量1.8.1 变量名1.9 常量1.10 关键字1. 进入C 第一个程序 // my…

构建数据大屏,塑造IT运维可视化核心竞争力

随着大数据、云计算等新兴技术的发展与运用&#xff0c;在金融、交通、教育、政府等行业的信息化在飞速发展。与此同时&#xff0c;各行业的IT建设与维护管理成本也在与日俱增&#xff0c;大量的运维工作下产生庞大的运维数据&#xff0c;如何进行运维数据可视化建设也逐渐成为…

qt之smtp-demo封装与测试

简介 SMTP是一种提供可靠且有效的电子邮件传输的协议&#xff0c;它建立在FTP文件传输服务上的一种邮件服务&#xff0c;主要用于系统之间的邮件信息传递&#xff0c;并提供有关来信的通知。 SMTP的工作过程是建立连接、邮件传送、连接释放。 SMTP的默认端口是25。…

游戏思考26:使用EASTL配合共享内存做自定义STL(未完待续12/27)

文章目录一、前置学习1&#xff09;萃取&#xff08;1&#xff09;迭代器所指对象的类型-value_type<1>第一个限制-返回参数需要指明迭代器的value_type<2>第二个限制坑点-不是所有迭代器都是class type&#xff0c;原生指针就不是<3>第三个限制坑点-如果针对…

2022-12版本的Rstudio它来了,它喊我升级了

1. Rstudio喊我升级 最近每一次打开Rstudio&#xff0c;总是推送给我最新版的Rstudio&#xff1a; 它之前不是这样的&#xff0c;那时候它所在的公司还叫Rstudio&#xff0c;现在改名叫Posit了&#xff0c;就开始推送了&#xff0c;也许它认为是重大的更新&#xff0c;也许他能…

【vue面试题-vuex】

vuex1.vuex是什么&#xff1f;怎么使用&#xff1f;哪种功能场景使用它&#xff1f;2.vuex有哪几种属性&#xff1f;3.Vue.js中ajax请求代码应该写在组件的methods中还是vuex的actions中&#xff1f;4.Vuex解决了什么问题&#xff1f;5.Vuex中状态储存在哪里&#xff0c;怎么改…

【LeetCode】1739. 放置盒子

1739. 放置盒子 题目描述 有一个立方体房间&#xff0c;其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子&#xff0c;每个盒子都是一个单位边长的立方体。放置规则如下&#xff1a; 你可以把盒子放在地板上的任何地方。 如果盒子 x 需要放置在盒子 y 的顶部&…

【webpack】cjs运行时分析

准备工作&#xff08;接上篇文章的示例也可以&#xff09;&#xff1a; 1. 在index.js文件中引入任一js文件 import sum from ./sum;const result sum(1,2); console.log(result);2. sum文件 const sum (a, b) > {return ab; }export default sum3. build.js文件 const…

离子交换法深度剖析

离子交换法 是一种借助于离子交换剂上的离子和污水中的离子进行交换反应而除去污水中有害离子的方法。 离子交换法的特点 离子交换过程是一种特殊的吸附过程&#xff0c;在许多方面与吸附过程类似。 与吸附法比较&#xff0c;其特点是:它主要吸附污水中的离子化物质&#xff…

怎样做一个不会被淘汰的车载诊断工程师

步入中年&#xff0c;不可避免会接触到所谓的中年危机&#xff0c;时刻在提醒自己提高自己的护城河&#xff0c;增强核心竞争力。但是这种事情也不是靠空想&#xff0c;还是要功夫下在平时。 自己是在2016年开始接触车载诊断方面&#xff0c;从事过诊断范畴的开发、测试、偏系…

程序员的圣诞节是怎么样的?

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 一、前言 圣诞节&#xff0c;先在这里祝大家圣诞节快乐~~&#xff0c;用英语来表达就是 Merry Christmas ~~&#xff0c; 为了贴合这个氛围&#xff0c;今天分享种用 Python 绘制圣诞树的方法。 最近用代码绘画圣诞…

非常易用的网络路径中的网络延迟测试和监控以及自动发送报告工具

非常易用的网络路径中的网络延迟测试和监控以及自动发送报告工具。 作为网络管理员或网络工程师&#xff0c;时刻关注网络的交付速度至关重要。不仅需要确保自己有良好的响应时间&#xff0c;还需要确保网络的速度足以满足用户通信所需的每一条路径。而手动测试每个路径将占用…

SpringBoot+Vue项目医院体检中心管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

电脑文件数据恢复方法是什么?未备份电脑文件数据恢复的七种方法

在日常生活中&#xff0c;我们总会遇到这样或那样的事情&#xff0c;比如在使用电脑过程中出现文件数据丢失情况&#xff0c;那么在未备份文件下电脑文件数据丢失怎么恢复&#xff1f;电脑文件数据恢复方法有哪些&#xff1f;这里将根据不同情况分享不同的电脑文件数据恢复方法…

L05_课后练习_波士顿房价预测

波士顿房价预测 1.导入所需要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import random from sklearn.model_selection import train_test_split2.读入数据 feature pd.read_csv("../data/boston.csv") feature…

Postgresql源码(95)优化器关键数据结构实例

1 测试数据 drop table student; create table student(sno int primary key, sname varchar(10), ssex int); insert into student values(1, stu1, 0); insert into student values(2, stu2, 1); insert into student values(3, stu3, 1); insert into student values(4, st…

Linux的环境变量

目录 什么是环境变量&#xff1f; 那么如何添加自己的程序到命令行上&#xff0c;可以直接执行&#xff1f; 如何查看环境变量&#xff1f; 如何定义环境变量&#xff1f; C语言如何获取环境变量&#xff1f; 什么是环境变量&#xff1f; 在回答这个问题之前&#xff0c;可…

【Linux】之systemd与systemctl

文章目录一、systemd1. systemd 守护进程管理 Linux 的启动2. systemd 提供的功能:3. systemd 使用单元来管理不同类型的对象。4. 服务单元信息二、systemctl1. systemctl输出中的服务状态2. 列出servera上安装的所以服务单元3. 列出servera上所有活动和不活动的套接字单元4.1 …

存档鉴未来,新时代电子档案长期保存之道

&#xff08;一&#xff09;电子档案单套制是未来档案管理的趋势 在政府和企业端&#xff0c;办公体系的信息化&#xff0c;电子档案的单套制实施&#xff0c;极大地提高了事务办理的效率&#xff0c;同时节约了大量纸质文件的使用成本。 在政务领域&#xff0c;单套制的推行…

Day840.原子类-Java 并发编程实战

原子类 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于原子类。 一个累加器的例子&#xff0c;示例代码如下&#xff1a; 在这个例子中&#xff0c;add10K() 这个方法不是线程安全的&#xff0c;问题就出在变量 count 的可见性和 count1 的原子性上。 可见性问题…