赞
踩
在网上偶然看到笛卡尔心形表白函数,就去百度了一下。在网上有许多表白程序,但基本都是python或matlab版本的,没有使用Qt制作的表白程序,所以决定自己做一个来分享给大家。
笛卡尔心形函数表达式:r=a(1-sinθ)。这个函数中有两个变量,可以对a赋值,然后进行求解。理论上,a越大,心形线越大。由于绘制出来的函数图像是心形线,所以这个方程又被称为“笛卡尔的爱情坐标公式”。这个函数有个关于笛卡尔的爱情故事,感兴趣的同学可以自行去百度了解一下。
QCustomPlot是一个基于Qt的画图和数据可视化C++控件。QCustomPlot致力于提供美观的界面,高质量的2D画图、图画和图表,同时为实时数据可视化应用提供良好的解决方案。该绘图库专注于制作美观、出版物质量高的2D绘图、图形和图表,并为实时可视化应用程序提供高性能。
在官网上可以下载该库,然后将.h和.cpp文件放在自己的项目中即可使用该库。具体配置和使用方法可以去百度,网上有很多,在此就不做赘述。
程序中使用到的控件类有QButton,QLabel,QSlider,分别是按钮,控件,滑条。
调整滑动条位置会改变k的值,label的k值会随之改变,下面的公式中的k值显示出具体的数值。k值的范围是从0-100。
点击按钮会弹出颜色对话框,选择相应颜色会改变线条的颜色。
程序中要先对QCustomPlot进行初始化,对滑动条的值和范围也要先进行初始化。因为程序中有改变线条颜色的功能,所以要给线条添加画笔,所以也要对画笔初始化。具体代码如下:
//初始化 void MainWindow::Init() { //设置背景颜色为白色 ui->plot->setBackground(QBrush(Qt::white)); //设置网格为灰色虚线 ui->plot->xAxis->grid()->setPen(QPen(QColor(180,180,180),1,Qt::PenStyle::DashLine)); ui->plot->yAxis->grid()->setPen(QPen(QColor(180,180,180),1,Qt::PenStyle::DashLine)); //显示子网格线 ui->plot->xAxis->grid()->setSubGridVisible(true); ui->plot->yAxis->grid()->setSubGridVisible(true); //设置坐标轴颜色 ui->plot->xAxis->setBasePen(QPen(Qt::black)); ui->plot->yAxis->setBasePen(QPen(Qt::black)); //设置坐标轴终点图案为箭头 ui->plot->xAxis->setUpperEnding(QCPLineEnding::esSpikeArrow); ui->plot->yAxis->setUpperEnding(QCPLineEnding::esSpikeArrow); //设置坐标轴刻度数目 ui->plot->xAxis->ticker()->setTickCount(5); ui->plot->yAxis->ticker()->setTickCount(5); //设置坐标轴范围 ui->plot->xAxis->setRange(-2.1,2.1); ui->plot->yAxis->setRange(-2,3); //设置滑动条初始值为0 ui->slider->setValue(0); //设置滑动条范围为0-10000 ui->slider->setRange(0,10000); //设置画笔属性 pen.setColor(Qt::red); pen.setWidthF(1); //添加曲线 ui->plot->addGraph(); //设置曲线画笔 ui->plot->graph(0)->setPen(pen); }
程序中的槽函数有两个,一个是按钮,一个是滑动条。
要改变线条颜色就要改变画笔属性,所以通过选择颜色来改变画笔的颜色,然后将画笔赋给线条,从而改变线条颜色。
//颜色按钮槽函数
void MainWindow::on_colorButton_clicked()
{
QColor c = QColorDialog::getColor(Qt::red);
if(c.isValid()){
pen.setColor(c);
ui->plot->graph(0)->setPen(pen);
ui->plot->replot(QCustomPlot::rpQueuedReplot);
}
}
滑动条的值只能是整数,所以在初始化中将滑动条的最大值设为10000,然后在槽函数中除以100就可以得到小数范围的k值,将label的文本清空,再结合具体化后的k值,从而改变label的文本。
//滑动条槽函数
void MainWindow::on_slider_sliderMoved(int position)
{
k = static_cast<qreal>(position)/100;
ui->kValue->clear();
ui->formula->clear();
ui->kValue->setText(QString("%1").arg(k));
ui->formula->setText(QString("f(x) = x^(2/3) + [0.9*(3.3 - x^2)^0.5] * sin(%1Πx)").arg(k));
Draw();
}
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QColorDialog> #include <QPen> #include <QSoundEffect> //音频类 #include <QMediaPlayer> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); void Init(); //初始化 void Draw(); //绘制曲线 private slots: void on_colorButton_clicked(); //颜色按钮槽函数 void on_slider_sliderMoved(int position); //滑动条槽函数 signals: private: Ui::MainWindow *ui; qreal k = 0; //笛卡尔心形函数参数 QPen pen; QVector<qreal> x,y; }; #endif // MAINWINDOW_H
#include "mainwindow.h" #include "ui_mainwindow.h" #include "qcustomplot.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //这里是设置窗口的logo和标题,不想设置的可以忽略这两个。 this->setWindowIcon(QIcon(":/new/prefix1/love.png")); this->setWindowTitle("LOVE!"); //初始化 Init(); } MainWindow::~MainWindow() { x.squeeze(); y.squeeze(); delete ui; } //初始化 void MainWindow::Init() { //设置背景颜色为白色 ui->plot->setBackground(QBrush(Qt::white)); //设置网格为灰色虚线 ui->plot->xAxis->grid()->setPen(QPen(QColor(180,180,180),1,Qt::PenStyle::DashLine)); ui->plot->yAxis->grid()->setPen(QPen(QColor(180,180,180),1,Qt::PenStyle::DashLine)); //显示子网格线 ui->plot->xAxis->grid()->setSubGridVisible(true); ui->plot->yAxis->grid()->setSubGridVisible(true); //设置坐标轴颜色 ui->plot->xAxis->setBasePen(QPen(Qt::black)); ui->plot->yAxis->setBasePen(QPen(Qt::black)); //设置坐标轴终点图案为箭头 ui->plot->xAxis->setUpperEnding(QCPLineEnding::esSpikeArrow); ui->plot->yAxis->setUpperEnding(QCPLineEnding::esSpikeArrow); //设置坐标轴刻度数目 ui->plot->xAxis->ticker()->setTickCount(5); ui->plot->yAxis->ticker()->setTickCount(5); //设置坐标轴范围 ui->plot->xAxis->setRange(-2.1,2.1); ui->plot->yAxis->setRange(-2,3); //设置滑动条初始值为0 ui->slider->setValue(0); //设置滑动条范围为0-10000 ui->slider->setRange(0,10000); //设置画笔属性 pen.setColor(Qt::red); pen.setWidthF(1); //添加曲线 ui->plot->addGraph(); //设置曲线画笔 ui->plot->graph(0)->setPen(pen); } //绘制曲线 void MainWindow::Draw() { ui->plot->graph(0)->data()->clear(); for(int i = 0;i < 400;i++){ x.append(static_cast<qreal>(i) / 100 - 1.99); y.append(qPow(qAbs(x[i]),2.0/3.0) + 0.9*qPow((4-qPow(x[i],2)),0.5)*sin(k*3.14*x[i])); } ui->plot->graph(0)->setData(x,y); //关联数据 ui->plot->replot(QCustomPlot::rpQueuedReplot); x.clear(); y.clear(); } //颜色按钮槽函数 void MainWindow::on_colorButton_clicked() { QColor c = QColorDialog::getColor(Qt::red); if(c.isValid()){ pen.setColor(c); ui->plot->graph(0)->setPen(pen); ui->plot->replot(QCustomPlot::rpQueuedReplot); } } //滑动条槽函数 void MainWindow::on_slider_sliderMoved(int position) { k = static_cast<qreal>(position)/100; ui->kValue->clear(); ui->formula->clear(); ui->kValue->setText(QString("%1").arg(k)); ui->formula->setText(QString("f(x) = x^(2/3) + [0.9*(3.3 - x^2)^0.5] * sin(%1Πx)").arg(k)); Draw(); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。