QChart笔记5:Polar Chart极坐标图,阿基米德线

QChart还有专门画极坐标的类QPolarChart,它的界面是一个圆盘。注意在使用之前,包括命名空间QT_CHARTS_USE_NAMESPACE,.pro文件中也要增加QT += charts.

#include <QApplication>
#include <QDebug>
#include <QtCharts/QScatterSeries>
#include <QtCharts/QLineSeries>
#include <QtCharts/QPolarChart>
#include <QtCharts/QValueAxis>
#include <QtCharts/QChartView>
#include "mainwindow.h"
//[1]
QT_CHARTS_USE_NAMESPACE

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //曲线
    QLineSeries *seriesLine = new QLineSeries();    
    seriesLine->setName("LinePolar");


    //图表
    QPolarChart *polarChart = new QPolarChart();
    polarChart->addSeries(seriesLine);
    polarChart->setTitle("First Polar Chart");

    //坐标轴
    QValueAxis *angleAxis = new QValueAxis();
    angleAxis->setTickCount(9);
    angleAxis->setLabelFormat("%d");
    //角度
    polarChart->addAxis(angleAxis, QPolarChart::PolarOrientationAngular);    

    QValueAxis *radiusAxis = new QValueAxis();
    radiusAxis->setTickCount(9);
    radiusAxis->setLabelFormat("%d");
    //半径
    polarChart->addAxis(radiusAxis, QPolarChart::PolarOrientationRadial);

    seriesLine->attachAxis(radiusAxis);
    seriesLine->attachAxis(angleAxis);

    radiusAxis->setRange(0, 360); //设置半径范围
    angleAxis->setRange(0, 360);    //设置角度范围

    for (int i = 0; i <= 360; i += 10)
        seriesLine->append(i, (i / 360.0) * 360);

    QChartView *polarChartView = new QChartView();
    polarChartView->setChart(polarChart);

    MainWindow w;
    w.SetWidget(polarChartView);
    w.show();

    return a.exec();
}

修改间隔: 

setTickCount(int count)设置大刻度线的数目,默认是5,不能小于2。程序中设置的是9,但是数一下好像不对。setTickCount(4)换个4体验一下。对于半径,第4条线就是圆心,看不太出来。对于角度,第1条和第4条线会重合。

修改主题风格: 

QPolarChart自带了一些主题,跟手机一样可以换主题,默认主题就是上面的效果,换个Dark主题:

polarChart->setTheme(QChart::ChartThemeDark);     //设置主题 

还有蓝色,棕色等其他主题,具体主题如下,具体颜色可以自己试试。

主题名

描述

QChart::ChartThemeLight

The light theme, which is the default theme.

QChart::ChartThemeBlueCerulean

The cerulean blue theme.

QChart::ChartThemeDark

The dark theme.

QChart::ChartThemeBrownSand

The sand brown theme.

QChart::ChartThemeBlueNcs

The natural color system (NCS) blue theme.

QChart::ChartThemeHighContrast

The high contrast theme.

QChart::ChartThemeBlueIcy

The icy blue theme.

QChart::ChartThemeQt

The Qt theme.

设置交替阴影:

为了实现交替颜色显示,实现可以通过设置以下阴影属性实现,默认颜色是黑色。

angleAxis->setShadesVisible(true);

 为了适应不同的风格,颜色是可以自定义的:

angleAxis->setShadesBrush(QBrush(QColor(199, 144, 235)));

 改线为点:

QLineSeries画出来的是线,将它改成QScatterSeries,画出来的是独立的点:

 这个点的大小可以修改,通过setMarkerSize()设置大小

seriesLine->setMarkerSize(1);     //设置点大小

 修改坐标可以画出不同的图案,比如这样的螺旋线p=半徑*角度:

 

 这条绿线是通过多个点组成,颜色也可以改,但是改成曲线的话,画出的效果不理想,如果谁用曲线画出来这样的欢迎告诉我.

for (double i=0; i<=360*2; i+=0.5)    //添加点
{
    auto angle = i;
    while (angle > 360)
    {
        angle = angle - 360;
    }
    seriesLine->append(angle, i/2.0);
}
seriesLine->setPen(QPen(QColor(153, 232, 83), 2));    //设置线的颜色

完整的代码如下:

#include <QApplication>
#include <QDebug>
#include <QtCharts/QScatterSeries>
#include <QtCharts/QLineSeries>
#include <QtCharts/QPolarChart>
#include <QtCharts/QValueAxis>
#include <QtCharts/QChartView>
#include "mainwindow.h"
//[1]
QT_CHARTS_USE_NAMESPACE

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //曲线
    QScatterSeries *seriesLine = new QScatterSeries();    //点1
    seriesLine->setName("LinePolar");
    seriesLine->setMarkerSize(1);     //设置点大小1


    //图表
    QPolarChart *polarChart = new QPolarChart();
    polarChart->addSeries(seriesLine);
    polarChart->setTheme(QChart::ChartThemeBlueCerulean);     //设置主题 1
    polarChart->setTitle("First Polar Chart");

    //坐标轴
    QValueAxis *angleAxis = new QValueAxis();
    angleAxis->setTickCount(9);
    angleAxis->setLabelFormat("%d");
    angleAxis->setShadesVisible(true);                        //增加shade区域 1
    angleAxis->setShadesBrush(QBrush(QColor(19, 44, 25)));
    polarChart->addAxis(angleAxis, QPolarChart::PolarOrientationAngular);

    QValueAxis *radiusAxis = new QValueAxis();
    radiusAxis->setTickCount(9);
    radiusAxis->setLabelFormat("%d");
    polarChart->addAxis(radiusAxis, QPolarChart::PolarOrientationRadial);

    seriesLine->attachAxis(radiusAxis);
    seriesLine->attachAxis(angleAxis);
    //[1]!
    radiusAxis->setRange(0, 360);
    angleAxis->setRange(0, 360);
 // 多圈
    for (double i=0; i<=360*2; i+=0.5)
    {
        auto angle = i;
        while (angle > 360)
        {
            angle = angle - 360;
        }
        seriesLine->append(angle, i/2.0);
    }
    seriesLine->setPen(QPen(QColor(153, 232, 83), 2));



    //[1]
    QChartView *polarChartView = new QChartView();
    polarChartView->setChart(polarChart);

    MainWindow w;
    w.SetWidget(polarChartView);
    w.show();
    //[1]!
    return a.exec();
}

再画几个其他类型的线:

四叶曲线1 p=半径*fabs(sin(2*角度)):

int radius = 200;
for (double angle=0; angle<=360; angle+=1)
{
    seriesLine->append(angle, qFabs(radius*qSin(2.0*M_PI*angle/180.0)));
}

四叶曲线2 p=半径*fabs(cos(2*角度)):

int radius = 200;
for (double angle=0; angle<=360; angle+=1)
{
    seriesLine->append(angle, qFabs(radius*qCos(2.0*M_PI*angle/180.0)));
}

六叶花瓣

//六叶花瓣  p=半径*fabs(cos(3*角度))
int radius = 200;
for (double angle=0; angle<=360; angle+=1)
{
    seriesLine->append(angle, qFabs(radius*qCos(3.0*M_PI*angle/180.0)));
}

 

 三叶花瓣:

//三叶花瓣  p=半径*cos(3*角度)
int radius = 200;
for (double angle=0; angle<=360; angle+=1)
{
    seriesLine->append(angle, radius*qCos(3.0*M_PI*angle/180.0));
}

玫瑰曲线有规律,

r = sin ( k θ ) 或 r = cos ( k θ )

当 k 是奇数时,玫瑰曲线有 k 个花瓣;当 k 是偶数时,玫瑰曲线有 2k 个花瓣。

心形曲线

//心形曲线 p=半径*(1-cos(角度))
int radius = 100;
for (double angle=0; angle<=360; angle+=1)
{
    seriesLine->append(angle, radius*(1-qCos(M_PI*angle/180.0)));
}

 这心形下方还挺饱满,跟扑克上的红心差很大

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值