如何mfc绘制动态曲线线

ajax实现动态曲线绘制
在电子工程世界为您找到如下关于“ajax实现动态曲线绘制”的新闻
ajax实现动态曲线绘制资料下载
ajax实现动态曲线绘制,模拟示波器功能。...
ajax实现动态曲线绘制相关帖子
ajax实现动态曲线绘制视频
ajax实现动态曲线绘制创意
你可能感兴趣的标签
热门资源推荐> 博客详情
1.后台程序:加载一条随即曲线,横轴为时间
using System.Collections.G
using System.C
using System.L
using System.T
using System.W
using System.IO;
using System.Windows.C
using System.Windows.D
using System.Windows.D
using System.Windows.I
using System.Windows.M
using System.Windows.Media.I
using System.Windows.N
using System.Windows.S
using System.G
using System.D
using System.Windows.T
using Microsoft.Research.DynamicDataD
using Microsoft.Research.DynamicDataDisplay.DataS
using Microsoft.Research.DynamicDataDisplay.PointM
using Microsoft.Research.DynamicDataDisplay.Charts.N
namespace WpfApplication2
public partial class MainWindow : Window
Random random = new Random();
private DispatcherTimer timer = new DispatcherTimer();
CompositeDataSource compositeDataSource1;
CompositeDataSource compositeDataSource2;
EnumerableDataSource&DateTime& datesDataSource =
EnumerableDataSource&int& numberOpenDataSource=
EnumerableDataSource&int& numberClosedDataSource =
List&DateTime& vardatetime = new List&DateTime&();
int i = 0;
List&int& numberOpen = new List&int&();
List&int& numberClosed = new List&int&();
int[] numberOpen = new int[100];
int[] numberClosed = new int[100];
public MainWindow()
InitializeComponent();
// Loaded += new RoutedEventHandler(Window_Loaded);
private void Window1_Loaded(object sender, EventArgs e)
DateTime tempDateTime = new DateTime();
tempDateTime = DateTime.N
vardatetime.Add(tempDateTime);
numberOpen.Add(random.Next(40));
numberClosed.Add(random.Next(100));
datesDataSource.RaiseDataChanged();
numberOpenDataSource.RaiseDataChanged();
numberClosedDataSource.RaiseDataChanged();
} // Window1_Loaded()
private void Window_Loaded(object sender, System.Windows.RoutedEventArgs e)
DateTime tempDateTime=new DateTime();
tempDateTime = DateTime.N
vardatetime.Add(tempDateTime);
numberOpen.Add(random.Next(40));
numberClosed.Add(random.Next(100));
datesDataSource = new EnumerableDataSource&DateTime&(vardatetime);
datesDataSource.SetXMapping(x =& dateAxis.ConvertToDouble(x));
numberOpenDataSource = new EnumerableDataSource&int&(numberOpen);
numberOpenDataSource.SetYMapping(y =& y);
numberClosedDataSource = new EnumerableDataSource&int&(numberClosed);
numberClosedDataSource.SetYMapping(y =& y);
compositeDataSource1 = new CompositeDataSource(datesDataSource, numberOpenDataSource);
compositeDataSource2 = new CompositeDataSource(datesDataSource, numberClosedDataSource);
plotter.AddLineGraph(compositeDataSource2, Colors.Green, 1, "Percentage2");
plotter.Viewport.FitToView();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += new EventHandler(Window1_Loaded);
timer.IsEnabled =
} // class Window1
2.前台展示程序
&Window x:Class="WpfApplication2.MainWindow"
xmlns="/winfx/2006/xaml/presentation"
xmlns:x="/winfx/2006/xaml"
xmlns:d3="/DynamicDataDisplay/1.0"
Title="Window1" Loaded="Window_Loaded" WindowState="Normal" Height="800" Width="1280" Background="Wheat"&
&d3:ChartPlotter Name="plotter" Margin="10,10,20,10"&
&d3:ChartPlotter.HorizontalAxis&
&d3:HorizontalDateTimeAxis Name="dateAxis"/&
&/d3:ChartPlotter.HorizontalAxis&
&d3:ChartPlotter.VerticalAxis&
&d3:VerticalIntegerAxis Name="countAxis"/&
&/d3:ChartPlotter.VerticalAxis&
&d3:Header FontFamily="Arial" Content="Bug Information"/&
&d3:VerticalAxisTitle FontFamily="Arial" Content="Count"/&
&d3:HorizontalAxisTitle FontFamily="Arial" Content="Date"/&
&/d3:ChartPlotter&
人打赏支持
码字总数 26126
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥当前位置: →
→ 关于Graphics2D画动态曲线,该如何解决
关于Graphics2D画动态曲线,该如何解决
& 作者:佚名 & 来源: 互联网 &
&收藏到→_→:
摘要: 关于Graphics2D画动态曲线下面的代码在内部类中可以动态画曲线,为什么在外部类启动线程可以获取数据,但画动态曲线的时候数据确为空?哪位可以出手相助? import&java.awt.C import&java.aw
"关于Graphics2D画动态曲线,该如何解决"::
关于graphics2d画动态曲线下面的代码在内部类中可以动态画曲线,为什么在外部类启动线程可以获取数据,但画动态曲线的时候数据确为空?哪位可以出手相助?
import&java.awt.
import&java.awt.
import&java.awt.
import&java.awt.graphics2d;
import&java.awt.
import&java.awt.
import&java.awt.event.
import&java.awt.event.
import&java.util.
import&java.util.
import&java.util.
import&java.util.
import&javax.swing.*;
public&class&test&extends&jframe&implements&actionlistener&{
jbutton&button=new&jbutton("启动");
jbutton&button1=new&jbutton("外部类启动");
public&static&void&main(string[]&args)&{
//&todo&auto-generated&method&stub
runnable&tr=new&runnable()&{
public&void&run()&{
//&todo&auto-generated&method&stub
new&test();
javax.swing.swingutilities.invokelater(tr);
public&test()
super("测试窗口");
this.setdefaultcloseoperation(jframe.exit_on_close);
this.setsize(800,&600);
container&c=this.getcontentpane();
gridbaglayout&layout=new&gridbaglayout();
this.setlayout(layout);
gridbagconstraints&g=new&gridbagconstraints();
cp=new&curvepanel();
c.add(cp);
g.gridx=0;
g.gridy=0;
g.gridwidth=8;
g.gridheight=9;
g.weightx=0.8;
g.weighty=0.9;
g.fill=gridbagconstraints.
layout.setconstraints(cp,&g);
c.add(button);
g.gridx=0;
g.gridy=9;
g.gridwidth=1;
g.gridheight=1;
g.weightx=0.1;
g.weighty=0.1;
g.fill=gridbagconstraints.
layout.setconstraints(button,&g);
button.addactionlistener(this);
c.add(button1);
g.gridx=1;
g.gridy=9;
g.gridwidth=1;
g.gridheight=1;
g.weightx=0.1;
g.weighty=0.1;
g.fill=gridbagconstraints.
layout.setconstraints(button1,&g);
button1.addactionlistener(this);
this.setvisible(true);
public&void&actionperformed(actionevent&e)&{
//&todo&auto-generated&method&stub
object&obj=e.getsource();
if(obj.equals(button))
new&thread(new&runnable()&{
&&&&&&@override
&&&&&&public&void&run()&{
&&&&&&&&&&try&{
&&&&&&&&&&&&&&while&(true)&{ &&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&cp.setdrawline();
&&&&&&&&&&&&&&&&&&thread.sleep(1000);
&&&&&&&&&&&&&&}
&&&&&&&&&&}&catch&(interruptedexception&e)&{
&&&&&&&&&&&&&&e.printstacktrace();
&&&&&&&&&&}
&&}).start();
if(obj.equals(button1))
startthread&st=new&startthread();
new&thread(st).start();
private&curvepanel&
class&startthread&implements&runnable{
curvepanel&cp=new&curvepanel();
public&void&run()&{
//&todo&auto-generated&method&stub
&&&&&&&&&&&&while&(true)&{ &&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&cp.setdrawline();
&&&&&&&&&&&&&&&&thread.sleep(1000);
&&&&&&&&&&&&}
&&&&&&&&}&catch&(interruptedexception&e)&{
&&&&&&&&&&&&e.printstacktrace();
class&curvepanel&extends& nel{
list&integer&&
public&curvepanel()
values=collections.synchronizedlist(new&arraylist&integer&());
public&void&addvalue(int&value)
values.add(value);
system.out.println(values);
public&void&setdrawline()
random&rand&=&new&random();
addvalue(rand.nextint(400));
repaint();
public&void&paintcomponent(graphics&g)
super.paintcomponent(g);
graphics2d&g2d=(graphics2d)g;
for(int&i=0;i&values.size()-1;i++)
g2d.setcolor(color.red);
g2d.drawline(5*i,&values.get(i),&5*(i+1),&values.get(i+1)); 搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
关于Graphics2D画动态曲线,该如何解决_Eclipse,MyEclipse相关文章
Eclipse,MyEclipse_总排行榜
Eclipse,MyEclipse_最新
Eclipse,MyEclipse_月排行榜
Eclipse,MyEclipse_周排行榜
Eclipse,MyEclipse_日排行榜下次自动登录
现在的位置:
& 综合 & 正文
如何绘制动态曲线
1 QWT绘制动态曲线
项目终于快完成了,现在开始整理下,总结下,今天先分享下关于使用如何用QWT绘制波形,先把图给贴出来。
以下源于百度百科“QWT全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图。它为具有技术专业背景的提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供,输出方式可以是Curves(曲线),Slider(滚动条),Dials(圆盘),Compasses(仪表盘)等等。该工具库基于Qt开发,所以也继承了Qt的跨平台特性。”
我使用的是qwt-6.0.0-rc5,可以到官网下载,具体的安装和集成过程可以参照这个贴子。
“AdPlot.h”
1: #ifndef ADPLOT_H
2: #define ADPLOT_H
4: #include &QWidget&
5: #include &qwt_plot_curve.h&
6: #include &qfile.h&
7: #include &qwt_plot_magnifier.h&
9: namespace Ui {
10: class AdP
13: class AdPlot : public QWidget
15: Q_OBJECT
17: public:
18: explicit AdPlot(QWidget *parent = 0);
19: //要绘制的AD数据,X-时间,Y-电压值
20: void readAdData(QVector& double & &xData,
21: QVector& double & &yData);
22: void setTitleString(QString title);
23: void setTimerStop();
25: ~AdPlot();
26: public slots:
27: //节点打开的AD数据的文件名
28: void setFileName(QString filename);
29: //绘制AD数据
30: void plotAdCurve();
31: private:
32: Ui::AdPlot *
33: QwtPlotCurve *p_
34: QVector& double & xD
35: QVector& double & yD
36: QFile *localF
37: //文件偏移量
38: qint64
39: double
40: QString m_
41: QwtPlotMagnifier *PM;
42: //当前X轴最大的范围
43: int xMaxS
45: QTimer *adPlotT
47: QString m_
50: #endif // ADPLOT_H
头文件没什么好说的,说明一下offset这个变量,它是用来保存当前的读取到的文件位置,而xData和yData分别储存时间和电压值。
“AdPlot.cpp”
1: #include "adplot.h"
2: #include "ui_adplot.h"
3: #include &QtGui/QApplication&
4: #include &qapplication.h&
5: #include &qlayout.h&
6: #include &qlabel.h&
7: #include &qpainter.h&
8: #include &qwt_plot_layout.h&
9: #include &qwt_plot_curve.h&
10: #include &qwt_scale_draw.h&
11: #include &qwt_scale_widget.h&
12: #include &qwt_legend.h&
13: #include &qwt_legend_item.h&
14: #include &QTime&
15: #include &qtimer.h&
16: #include &QMessageBox&
17: #include &qcolor.h&
18: #include &qwt_plot_zoomer.h&
20: class TimeScaleDraw: public QwtScaleDraw
22: public:
23: TimeScaleDraw(const QTime &base):
24: baseTime(base)
28: virtual QwtText label(double v) const
30: QTime upTime = baseTime.addSecs((int)v);
31: return upTime.toString();
34: private:
35: QTime baseT
39: AdPlot::AdPlot(QWidget *parent) :
40: QWidget(parent),
41: ui(new Ui::AdPlot)
43: ui-&setupUi(this);
44: ui-&qwtPlot-&setAutoReplot(false);
45: QTime curT
46: curTime = curTime.currentTime();
50: QwtLegend *legend = new QwtL
51: legend-&setItemMode(QwtLegend::CheckableItem);
52: //ui-&qwtPlot-&insertLegend(legend, QwtPlot::RightLegend);
53: ui-&qwtPlot-&setAxisTitle(QwtPlot::xBottom, " System Uptime [h:m:s]");
54: ui-&qwtPlot-&setAxisScaleDraw(QwtPlot::xBottom,
55: new TimeScaleDraw(curTime));
56: ui-&qwtPlot-&setAxisScale(QwtPlot::xBottom, 0, xMaxScale = 5);
57: ui-&qwtPlot-&setAxisLabelAlignment(QwtPlot::xBottom, Qt::AlignLeft | Qt::AlignBottom);
59: QwtScaleWidget *scaleWidget = ui-&qwtPlot-&axisWidget(QwtPlot::xBottom);
60: const int fmh = QFontMetrics(scaleWidget-&font()).height();
61: scaleWidget-&setMinBorderDist(0, fmh / 2);
63: ui-&qwtPlot-&setAxisTitle(QwtPlot::yLeft, "V");
64: ui-&qwtPlot-&setAxisScale(QwtPlot::yLeft, 0, 3);
65: p_adplot = new QwtPlotCurve();
66: QColor c = Qt::
67: c.setAlpha(150);
68: p_adplot-&setPen(c);
70: p_adplot-&attach(ui-&qwtPlot);
71: //PM = new QwtPlotMagnifier(ui-&qwtPlot-&canvas());
72: QwtPlotZoomer* zoomer = new QwtPlotZoomer( ui-&qwtPlot-&canvas() );
73: zoomer-&setRubberBandPen( QColor( Qt::black ) );
74: zoomer-&setTrackerPen( QColor( Qt::black ) );
75: zoomer-&setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier );
76: zoomer-&setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton );
77: time = 0.0;
78: adPlotTimer = new QTimer();
79: adPlotTimer-&start(100);
80: connect(adPlotTimer, SIGNAL(timeout()),
81: this, SLOT(plotAdCurve()));
82: offset = 0;
85: AdPlot::~AdPlot()
87: delete
90: void AdPlot::readAdData(QVector&double& &xData, QVector&double& &yData)
92: if(!m_filename.isEmpty())
94: localFile = new QFile(m_filename); //用户端的IP地址+端口号作为文件名
95: if (!localFile-&open(QFile::ReadOnly ))
97: QMessageBox::warning(0, tr("应用程序"),
98: tr("无法读取文件 %1:\n%2.")
99: .arg(m_filename)
100: .arg(localFile-&errorString()));
101: return;
103: QByteArray adD
104: if (!localFile-&atEnd())
106: if (offset == 0)
108: adData = localFile-&read(26);
109: qDebug()&&adD
110: offset += 26;
111: adData.resize(0);
112: return;
115: if (localFile-&seek(offset))
118: adData = localFile-&read(32*2);
119: if (adData.count() == 32*2)
121: for (int count=0; count&32; count++)
123: char lowbits = adData.at(count*2);
124: char highbits = adData.at(count*2 + 1);
125: short temp = lowbits+highbits*256;
126: yData.append(((float)temp)*00);
127: xData.append(time);
128: time += 0.005; //5ms一个数据
130: offset += 32*2;
138: void AdPlot::plotAdCurve()
140: readAdData(xData,yData);
141: p_adplot-&setSamples(xData,yData);
142: if (!xData.empty())
144: if (xData.last() &= xMaxScale)
146: xMaxScale *= 2;
147: ui-&qwtPlot-&setAxisScale(QwtPlot::xBottom, 0, xMaxScale);
150: p_adplot-&attach(ui-&qwtPlot);
151: ui-&qwtPlot-&replot();
152: adPlotTimer-&start(100);
157: void AdPlot::setFileName(QString filename)
159: m_filename =
162: void AdPlot::setTitleString(QString title)
164: m_title =
165: ui-&qwtPlot-&setTitle(m_title);
168: void AdPlot::setTimerStop()
170: adPlotTimer-&stop();
说一下TimeScaleDraw这个类,它继承了QwtScaleDraw的类,其实就是一个抽象的一个刻度类,具体的函数说明可以参考说明手册.
对了,ui界面里没什么东西,就一个qwtplot的控件.
接着初始化坐标轴:
(int axisId, const QString &) 用来设置坐标轴名字,第一个参数是QWT定义的坐标轴ID,即yLeft,yRight,xBottom和xTop.
(int axisId,
*)用来设置坐标轴刻度,第一个参数同上,第二个参数就是我们刚才定义的TimeScaleD
(int axisId, double min, double max, double step=0)也是设置刻度的,第一个参数同上,第二参数是刻度的最小值,第三个参数是刻度的最大值,最后一个是步长.
然后定义一个曲线QwtPlotCurve:
QwtPlotCurve,它的功能就是输入一系列的X,Y的值,然后绘制出曲线,当然,曲线的color,style那些是可以自己设置的.
缩放曲线(PS:这点就体现了QWT的强大之处):
QwtPlotZoomer,简单的一个类,简单的只个设置就可以缩放曲线,谁用谁知道啊.
定时器完成曲线的重绘:
adPlotTimer = new QTimer();
adPlotTimer-&start(100);
connect(adPlotTimer, SIGNAL(timeout()), this, SLOT(plotAdCurve()));
因为所用的AD是400K的,算了一下,大概160ms以下就能满足了.
读取AD数据:
因为服务器接收到的AD数据是保存在文件中的,而且是实时保存(也就是将Client接收的数据保存到文件的同时将此文件中的数据绘制出来).所以设置了一个文件偏移量,而已此文件的前26字节是采集的时间信息,所以跳过.
又因为用的是AD是12位的,Client采用一个short类型来保存数据,而已每次传输32个AD数据,所以在计算AD数据前要确保文件已经有了32个AD数据,即64字节的数据.
绘制AD数据:
(const QVector& double & &xData, const QVector&
double & &yData)完成数据的设置.
此函数重点在于时间轴的拉长:
if (xData.last() &= xMaxScale)
xMaxScale *= 2;
ui-&qwtPlot-&setAxisScale(QwtPlot::xBottom, 0, xMaxScale);
qwt的确一个优秀的第三方库,使用也不复杂,而已有详细的文档说明,还有很多例子,不过都是英文的,慢慢看吧.
转;.cn/s/blog_7cb9d2f90100rr9v.html
==================================================================================
从传感器实时获取的数据,从串口上传到上位机,上位机由QT开发,上位机如何通过实时动态曲线方式进行展示呢?网上主要有两种方式:1、使用qwt;2、QCustomPlot;两者都差不多,QCustomPlot貌似更灵活漂亮点,但是由于qwt还有其他控件,这次的选择是qwt。
一、首先要定义和实例化一个QwtPlot,然后是一根曲线QwtPlotCurve,还有就是数据,由于QwtPlot是从设计器拉到界面,IDE做了这个工作就暂时不管了,如果没有IDE可以用代码写的:
QwtPlotCurve *
double time[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
double val[10] = {3, 5, 8, 7, 2, 0, 7, 9, 1};
二、接下来就是把这些东西组装起来:
curve = new QwtPlotCurve("Acc_X");
curve-&setSamples(time, val, 10);
curve-&attach(ui-&qwtPlot);
话不多说,一切尽在注释中,运行可以看见曲线绘制出来了:
图表显示出来,现在的问题是这是一个静态图标,如何动态显示实时数据呢,我们用定时器模拟产生随机数进行动态数据的展示,如下:
this-&startTimer(1000);
void MainWindow::timerEvent( QTimerEvent * ) {
for (int i = 0; i & 9; i++) {
val[i] = val[i+1];
val[9] = qrand()%10;
curve-&setSamples(time, val, 10);
ui-&qwtPlot-&replot();
好了,到此为止可以动态显示实时曲线了:
最后,还有一个问题当多条曲线共同显示的时候,如何隐藏显示曲线呢,比如加速度传感器的x、y、z共同显示,我只想看一条。可以通过点击图例在做到,好了还是看代码和注释:
QwtLegend *legend = new QwtL
legend-&setDefaultItemMode( QwtLegendData::Checkable );
ui-&qwtPlot-&insertLegend(legend, QwtPlot::LeftLegend );
connect( legend, SIGNAL( checked( const QVariant &, bool, int ) ),
SLOT( legendChecked( const QVariant &, bool ) ) );
void MainWindow::legendChecked( const QVariant &itemInfo, bool on )
QwtPlotItem *plotItem = ui-&qwtPlot-&infoToItem( itemInfo );
if ( plotItem )
plotItem-&setVisible(on);
ui-&qwtPlot-&replot();
好了,简单吧。qwt实时曲线显示的关键技术细节都在这里了:
转:/blog/2018706
==================================================================
在工控监测领域,经常需要动态绘制曲线,观察曲线的变化趋势,绘制波形图,绘制频谱等。在前面4讲中介绍了MFC经常用的控件和 Ctrl,这两个都是MFC绘图控件的经典(另外,在Qt中还有和两大神器)。许多人问如何绘制动态变化的曲线,为此专门写下这篇。
C++ GUI 绘图控件目录
对于任何绘图控件,都可以实现动态绘图,其原则是:控件只负责绘图,若想曲线动,就让数据动,就像看电影一样,电影是由一帧一帧的静态图片组合起来的,在一定速度上刷新,静态图片就能动起来;和电影的原理一样,绘图控件能显示静态的曲线,想要它动起来,就让它频在一定时间刷新就可以了。
这就是动态绘图的实现原理。
实现动态曲线需要以下两个准备:
计时器Timer
基于Timer的绘图
任何界面库都会有Timer这个实现,在MFC中时OnTimer消息,在Qt中是QTimer类,那种原理基本都一样,下面将以MFC为例进行说明。
Timer是消息级别最低的消息,它会保证其它级别高的消息优先执行,因此,就算数据大量刷新,也不会影响主线程的其它消息。
MFC生成OnTimer消息,消息响应函数如下:
绘图的实现就在这个消息响应函数里
如果让定时器设定为1秒触发,每一秒把旧数据去除,绘制新数据,就能看到不停变换的波形;对于趋势图,假如每秒有一个新数据,那么就在定长数组中,把数组所有数据整体左移,同时数组末端加入新数据。代码如下:
此函数把整个数组左移,然后新数据放置在数组最末端(右端)。
这样,数组就实现“向左运动”,把左移后的数组绘制,就能在绘图控件上发现其变化。
下面开始实现动态绘图(这里演示的方法,附件里有的方法):
函数中几个成员变量的定义是:
m_TeeChartArray是需要绘制的数组的Y值,m_X是对应的x值,m_count是计数器,每绘制一次,个数加1,主要用于x轴
在timer中的实现如下:
drawMoving函数用于绘图,timer设定为1秒触发一次,这时就能看到每秒的变化,如果数据是以1秒为刷新周期,每一秒有个新数据,只需要把旧的数据向左移,新数据放到数组最右端,再在绘图控件上把此图形画出来即可看的像动一样。
drawMoving函数的实现如下:
前面说过timer是优先级最低的消息,如果想曲线动的流畅,可以把时钟设置为0ms,如
这时会在保证界面流畅的前提下,以最高频率刷新。这样看到的图形会非常流畅。
上面介绍的就是动态绘制曲线的思路和方法,附件中有用TeeChart实现和HightSpeedChart实现的例子,考虑到可能有些人没有安装TeeChart,专门把TeeChart分离出来了一个源码,只有HightSpeedChart,不需要安装任何控件。
demo2(不用安装任何控件):
转;http://blog.csdn.net/czyt1988/article/details/
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 c 绘制动态曲线 的文章

 

随机推荐