研二寒假---关于Qt&CV曲线算法问题

目录

1、单曲线输入和绘图

1、单曲线输入和绘图

  1 #include "cv_plot.h"
  2 #include "ui_cv_plot.h"
  3 #include <QFileDialog>    //for getOpenFileName()
  4 #include <QDebug>
  5
  6 CV_Plot::CV_Plot(QWidget *parent) :
  7     QWidget(parent),
  8     ui(new Ui::CV_Plot)
  9 {
 10     ui->setupUi(this);
 11
 12     CV_Plot::GraphSetup(ui->widget);    //坐标轴初始化
 13 }
 14
 15 CV_Plot::~CV_Plot()
 16 {
 17     delete ui;
 18 }
 19
 20 //绘图前的一些设置
 21 void CV_Plot::GraphSetup(QCustomPlot* customPlot)
 22 {
 23     QLinearGradient plotGradient;                   //QLinearGradient为线性渐变色类
 24     plotGradient.setColorAt(1,QColor(50,50,50));    //设置画布颜色
 25
 26     ui->widget->xAxis->setLabelColor(Qt::black);              //x轴文字颜色
 27     ui->widget->yAxis->setLabelColor(Qt::black);
 28     ui->widget->xAxis->setTickLabelColor(Qt::black);          //x轴数字颜色
 29     ui->widget->yAxis->setTickLabelColor(Qt::black);
 30     ui->widget->xAxis->setBasePen(QPen(Qt::black,2));         //x轴颜色及宽度
 31     ui->widget->yAxis->setBasePen(QPen(Qt::black,2));
 32     ui->widget->xAxis->setTickPen(QPen(Qt::black,2));         //主刻度
 33     ui->widget->yAxis->setTickPen(QPen(Qt::black,2));
 34     ui->widget->xAxis->setSubTickPen(QPen(Qt::black,2));      //副刻度
 35     ui->widget->yAxis->setSubTickPen(QPen(Qt::black,2));
 36
 37     ui->widget->xAxis2->setTickLabelColor(Qt::black);         //坐标轴2数字颜色
 38     ui->widget->yAxis2->setTickLabelColor(Qt::black);
 39     ui->widget->xAxis2->setBasePen(QPen(Qt::black, 2));       //坐标轴颜色及宽度
 40     ui->widget->yAxis2->setBasePen(QPen(Qt::black, 2));
 41     ui->widget->xAxis2->setTickPen(QPen(Qt::black, 2));       //主刻度
 42     ui->widget->yAxis2->setTickPen(QPen(Qt::black, 2));
 43     ui->widget->xAxis2->setSubTickPen(QPen(Qt::black, 2));    //副刻度
 44     ui->widget->yAxis2->setSubTickPen(QPen(Qt::black, 2));
 45
 46     customPlot->xAxis->setRange(-0.2,0.8);          //x轴范围
 47     customPlot->yAxis->setRange(-0.0002,0.0002);
 48     customPlot->xAxis->setLabel("Potential(V)");    //x轴文字
 49     customPlot->yAxis->setLabel("Current(A)");
 50     customPlot->axisRect()->setupFullAxesBox();     //设置句型边框
 51     customPlot->xAxis2->setVisible(true);           //打开x轴上方的x轴
 52     customPlot->xAxis2->setTickLabels(false);       //关闭显式刻度
 53     customPlot->yAxis2->setVisible(true);           //打开坐标轴右方的y轴
 54     customPlot->yAxis2->setTickLabels(false);
 55 }
 56
 57 //读取一个txt文本文件按钮槽函数
 58 void CV_Plot::on_readFileButton_clicked()
 59 {
 60     QString fileName = QFileDialog::getOpenFileName(this,tr("Choose a file"),tr("*.txt"));  //获取要打开的文件夹名字
 61     if(fileName.isEmpty())
 62         QMessageBox::information(this,tr("Information"),"fileName is empty");               //如果fileName为空则弹出一个窗口
 63     QFile file(fileName);
 64     if(!file.open(QFile::ReadOnly | QFile::Text))
 65     {
 66
 67         QMessageBox::warning(NULL,"warning","file open failed",QMessageBox::Yes | QMessageBox::No);
 68     }
 69     QTextStream fileIn(&file);    //创建一个文件输入流对象,使fileIn与file绑定
 70
 71     while(!fileIn.atEnd())
 72     {
 73         str.append(fileIn.readLine());      //都txt文件的一行到str中
 74         QStringList list = str.split(‘ ‘);  //以空格分开str
 75         double a = list[0].toDouble();      //将string转换为double
 76         double b = list[1].toDouble();
 77         xdata.append(a);
 78         ydata.append(b);
 79         str.clear();                        //清空str,并读入下一行
 80     }
 81     qDebug() << "xdata.size()=" << xdata.size();
 82     if (fileIn.atEnd())
 83     {
 84         qDebug() << "End" << endl;
 85         file.close();
 86     }
 87     for (int i = 0; i < xdata.size()/2; i++)                  //下曲线数据
 88     {
 89         xdata1.append(xdata[i]);
 90         ydata1.append(ydata[i]);
 91     }
 92     for (int i = (xdata.size() / 2); i < xdata.size(); i++)    //上曲线数据
 93     {
 94         xdata2.append(xdata[i]);
 95         ydata2.append(ydata[i]);
 96     }
 97 }
 98
 99
100 //绘图
101 void CV_Plot::GraphShow(QCustomPlot* customPlot)
102 {
103     //设置属性可缩放,移动等
104     ui->widget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectAxes |
105         QCP::iSelectLegend | QCP::iSelectPlottables);
106     customPlot->addGraph();//添加一条曲线
107     customPlot->graph(0)->setPen(QPen(Qt::blue)); //0是曲线序号,添加的第一条是0,设置曲线颜色
108     customPlot->graph(0)->setData(xdata1, ydata1); //输出各点的图像,x和y都是QVector类
109
110     customPlot->addGraph();  //添加第二条曲线 添加一个曲线图层
111     customPlot->graph(1)->setPen(QPen(Qt::blue));  //1是曲线序号,添加的第二条是1,设置曲线颜色
112     customPlot->graph(1)->setData(xdata2, ydata2);  //参数必须为vector类型
113
114     customPlot->replot();  //重新绘图 这一个语句会退出此槽函数
115 }
116
117
118 //绘图按钮槽函数
119 void CV_Plot::on_dataPlotButton_clicked()
120 {
121     CV_Plot::GraphShow(ui->widget);
122
123 }

cv_plot.cpp

 1 #ifndef CV_PLOT_H
 2 #define CV_PLOT_H
 3
 4 #include <QWidget>
 5 #include <QVector>
 6 #include "ui_cv_plot.h"
 7 #include "qcustomplot.h"
 8
 9 namespace Ui {
10 class CV_Plot;
11 }
12
13 class CV_Plot : public QWidget
14 {
15     Q_OBJECT
16
17 public:
18     explicit CV_Plot(QWidget *parent = 0);
19     ~CV_Plot();
20     void GraphShow(QCustomPlot* customPlot);
21     void GraphSetup(QCustomPlot* customPlot);  //绘图前的一些设置
22
23 private slots:
24     void on_readFileButton_clicked();        //读取txt文件按钮
25     void on_dataPlotButton_clicked();        //绘图按钮
26
27 private:
28     Ui::CV_Plot *ui;
29     QString str;  //保存文本数据
30     QVector<double> xdata;
31     QVector<double> ydata;
32     QVector<double> xdata1;  //上曲线数据
33     QVector<double> ydata1;  //上曲线数据
34     QVector<double> xdata2;  //下曲线数据
35     QVector<double> ydata2;  //下曲线数据
36 };
37
38 #endif // CV_PLOT_H

cv_plot,h

工程结构:

原文地址:https://www.cnblogs.com/YiYA-blog/p/12227306.html

时间: 2024-11-05 11:45:17

研二寒假---关于Qt&CV曲线算法问题的相关文章

计算机图形学(二)输出图元_7_并行曲线算法

并行曲线算法 在曲线生成中使用的并行方法类似于显示线段中使用的方法.我们既可采用顺序算法按曲线分段分配处理器,也可以提出其他方法将处理器分配给屏幕的不同区域. 显示圆的并行中点方法是,将45°到90°的圆弧分成等长子圆弧,并给每段子圆弧配置一个处理器.然后类似于并行Bresenham画线算法,需要对每个处理器建立初始y值并确定参数pk的值.接着计算整个子圆弧的像素位置,并通过对称性得到其他八分圆中的位置.同样,并行椭圆中点算法将第一象限内的椭圆弧分割成等长弧,并将这些弧分配给各个处理器,在其他象

我的研二

再过几天,就是学校校历上的学期末了,研究生阶段,一晃过了两年 去年暑假放假后,在天梯奋战了半个多月,一直在1200~1300左右的水平不再上去,回校后开始了我的研二 按从远至近的回忆,研二就是这样度过的: 2013年9月 我暑假在ICCV2011的文章"Distributed Cosegmentation via Submodular Optimization on Anisotropic Diffusion"基础上,做了一些改进,并进行了实验,得到较为良好的结果,于是那个9月,我在寻

研一总结及研二规划

经历了大学的四年,经历了考研,又走过了研一一年,迎来了新的困惑.回顾研一一年,自己收获颇多,除了上课之外,导师让自己探索了好几个方向,分别是(1)数据库和数据仓库,以Microsoft SQL Server 2008为主线.(2)分布式存储与分布式计算,以Hadoop生态系统为主线.(3)数据挖掘,以Weka为主线.(4)推荐系统,以Taste为主线.(5)社交网络,以Ucinet为主线.(6)机器学习,以Scikit-Learn和Mahout为主线.(7)搜索引擎,以Lucene,Nutch和

贝塞尔曲线算法

前言 在google找到一篇个人认为最通俗的贝塞尔曲线实现算法博文. 我转载了该博文图片和公式. 出处: http://blog.csdn.net/jimi36/article/details/7792103 图片 一次贝塞尔. 二次贝塞尔. 三次贝塞尔. 贝塞尔曲线算法,布布扣,bubuko.com

对重邮的一些认识【一个通信研二学生的帖子】

楼主对此贴跟进,终极结帖!!      呦呵,刚码完代码一阵郁闷想来考研论坛上逛逛,密码一试居然可以通过,庆祝一下下.发现新消息一直在闪,时隔将近两年居然找到了自己2011年发的贴子,呵呵.现在研三了,马上就要从学校滚蛋了,心里没有什么舍不得,不欠学校什么,但心里也有些舍不得,在学校老师对我很好(我很感激所以现在还在做第四篇论文的实验室希望能再留下点什么证明自己存在过,也报答老师的负责之情),同门的关系也很融洽,认识了一大帮的好兄弟好基友,学习上自己也尽力了.想说些什么,但思维很乱就随便说了.这

QT开发(二十)——QT对话框

QT开发(二十)--QT对话框 一.对话框简介 对话框是与用户进行简短交互的顶层窗口 QDialog是QT中所有对话框窗口的基类,QDialog继承于QWidget,是一种容器型的组件,是定制了窗口样式的特殊QWidget. QDialog作为一种专用的交互窗口,不能作为子部件嵌入其他容器中. 二.对话框类型 对话框类型分为模态对话框和非模态对话框. 1.模态对话框 模态对话框显示后无法与父窗口进行交互,是一种阻塞式的对话框,使用QDialog::exec()函数调用. 模态对话框一般在栈上创建

QT开发(二十七)——QT常用类(一)

QT开发(二十七)--QT常用类(一) 一.QString 1.QString简介 QString提供了Unicode编码的字符串,使用隐式共享技术来节省内存和不必要的数据拷贝,不必考虑跨平台的兼容性. QString类成员函数中除了 ascii().latin1().utf8().local8Bit()函数,其他所有的函数都是可重入的. 2.QString成员函数 QString::QString ( const QChar * unicode, int size ) QString::QSt

QT开发(二十一)——QT布局管理器

QT开发(二十一)--QT布局管理器 一.布局管理器简介 QT中使用绝对定位的布局方式无法自适应窗口的变化. QT中提供了对界面组件进行布局管理的类,用于对界面组件进行管理,能够自动排列窗口中的界面组件,窗口大小变化后自动更新界面组件的大小. QLayout是QT中布局管理器的抽象基类,通过对QLayout的继承,实现了功能各异且互补的布局管理器. 布局管理器不是界面组件,而是界面组件的定位策略. 任意容器类型的组件都可以指定布局管理器. 同一个布局管理器管理中的组件拥有相同的父组件,在设置布局

你必须非常努力,才能看起来毫不费力(大二寒假)

现在是大二寒假了,我还在写这些算法水题,真的好惭愧,感觉自己除了绩点还能看以外,什么技术都没有学好.托福,GRE还在艰难的准备中,也没什么整块的时间去准备英语,只能平时带着看看英语.这个寒假,尽自己最大努力去吧浙大的数据结构题目写完,还有斯坦福那个pdf上的题目也要全部写完,这是最基本的. Java用sedgewick的那本书多看看,能用Java写一点总是好的. 下学期去找我们学院的老师做做科研,看他们能不能带我一下. Fighting for the future. 为了大四能够申请到CMU或