| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6362 人关注过本帖, 5 人收藏
标题:真心求教,用VB实现动态曲线的绘制,总是有问题
只看楼主 加入收藏
nql_neu
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-4-1
收藏
得分:0 
回复 30楼 风吹过b
程序代码:
Dim px(121) As Single, py(121) As Single  '用来保存曲线数据的坐标值,程序中实时曲线通道为3.
Dim col As Integer             '当前需绘制的点数
Dim pl As Integer          '判断是否画动态曲线

Private Sub Command1_Click()
Timer2.Enabled = True
Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
End
End Sub

Private Sub Command3_Click()
Timer2.Enabled = False
Timer1.Enabled = False
End Sub

Private Sub Form_Load()
HScroll1.value = 900
Picture1.Scale (900, 0)-(1200, 300)    '设置绘图区域坐标
End Sub

Private Sub HScroll1_Change()
Picture1.Cls    '清空绘图区域
num = HScroll1.value              '使绘图区域坐标和滚动条对应
Picture1.Scale (900 - (900 - num), 0)-(1200 - (900 - num), 300)
If pl >= 2 Then
Picture1.PSet (px(0), py(0))
For i = 1 To col
Picture1.Line -(px(i - 1), py(i - 1)), QBColor(2)    ' 重绘曲线
Next i
End If
End Sub
Private Sub Timer1_Timer()
Picture1.Cls
If col < 31 Then
For i = 0 To col
    px(i) = 900 + i * 10
    py(i) = Val(List1.List(i))      '利用随机数模拟实际数据
    Next i
      col = col + 1
      pl = pl + 1
      ElseIf col < 121 Then
      For i = 0 To col
      py(i) = Val(List1.List(i))
      px(i) = 1200 - 10 * (col - i) '如果数据点数》30  《121,数据的横坐标则用这个式子赋值
      Next i
      col = col + 1        '当数组装满时顺次前移,将数组第一个去掉
      Else
      For t = 0 To 119
      py(t) = py(t + 1)
      px(t) = 1200 - 10 * (col - t)
      Next t
      py(120) = Val(List1.List(List1.ListCount - 1))  '数组的最后一个元素始终存放当前最新实时数据
      End If
      If pl >= 2 Then     '在两个或两个以上的数据点时,开始画动态曲
      Picture1.PSet (px(0), py(0))
      For i = 1 To col - 2
      Picture1.Line -(px(i - 1), py(i - 1)), QBColor(2)
      Next i
      End If
End Sub

Private Sub Timer2_Timer()
Dim value As Integer


 value = Int(100 * Rnd + 100)
List1.AddItem value
End Sub
楼主,我这段程序已经差不多可以运行了,你可以帮我运行下,你会发现在曲线绘制一会儿后突然就变形了,变的不像刚开始那样的尖峰那样的了,然后再过一会儿又恢复成带尖的那种峰值了,你能帮我指出是程序哪儿段有问题吗,谢谢!
2014-04-02 16:17
nql_neu
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-4-1
收藏
得分:0 
回复 30楼 风吹过b
楼主你编完的程序在你那儿能顺利运行吗,为啥我直接把代码粘过来曲线绘制30个点就不动了啊,你先帮我看看我刚才让你简查的那段代码哪儿有问题,然后我们再讨论这个!
2014-04-02 16:23
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:0 
我直接把代码粘过来曲线绘制30个点就不动了啊。

你点滚动条啊。一共 930 个数据,需要 绘完这 930 个数据,曲线才会自动滚动啊。
---
也有可能我没看懂 你滚动条与 数据量的关系。如果这样的话,那需要重新修改我的代码。
--
为什么是 930 个,你的 滚动条的最大值设成了 930 了。
对了,滚动条的最小值要 设为 1 。

[ 本帖最后由 风吹过b 于 2014-4-2 16:43 编辑 ]

授人于鱼,不如授人于渔
早已停用QQ了
2014-04-02 16:33
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:0 
看代码没问题。
关键在于,你是用了二个定时器。
一个定时器负责产生数据。另一个定时器负责去取数据,然后绘图。

有些时候,这二个定时器会不同步,造成取数,比如取到重复的数据,或者取漏数据。

授人于鱼,不如授人于渔
早已停用QQ了
2014-04-02 16:42
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


好吧,晚上按我自己思路重写过了一个。
你慢慢看吧。

采样绘曲线.rar (3.04 KB)

授人于鱼,不如授人于渔
早已停用QQ了
2014-04-02 20:29
xo1437404152
Rank: 1
等 级:新手上路
帖 子:17
专家分:1
注 册:2014-3-19
收藏
得分:1 
哇,版主就是厉害,我什么时候能达到版主的水平,我死也瞑目了
2014-04-02 21:27
nql_neu
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-4-1
收藏
得分:0 
回复 35楼 风吹过b
版主,真的非常非常感谢,没想到能得到这么大的帮助,我先研究下你的编程,然后再向你请教些问题,非常非常感谢,有人品,有能力,顶你!
2014-04-03 09:22
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4943
专家分:30067
注 册:2008-10-15
收藏
得分:0 
Private Sub Timer1_Timer()
'产生采样数据
Dim i As Long
i = Int(Rnd() * 200 + 100)
List1.AddItem i
If List1.ListCount > 900 Then           '采样保留最后多个数据。与绘图缓冲区无关
    List1.RemoveItem 0
End If

'同时把采样生成的数据压入绘图缓冲区
'缓冲区为 120 个数据,但绘图时,只使用其中 30 个数据。
Dim j As Long
Static wz As Long               '定义静态变量,为 缓冲区使用指针。

If wz <= 缓冲区大小 Then        '数据超出否
Else                            '超出,wz=缓冲区+1了
    For j = 1 To wz - 1         '数据向前移动
        py(j - 1) = py(j)
    Next j
End If

    If wz > 缓冲区大小 Then wz = 缓冲区大小
    py(wz) = i                  '压入绘图缓冲区。
    wz = wz + 1                 '指针向向移动

'debug
'Form2.Cls
'For i = 0 To 缓冲区大小
'    Form2.Print py(i);
'    If i Mod 10 = 0 Then Form2.Print
'Next i

End Sub

这个过程稍修改地一下。
原来的容易导致 在 第 90 号元素时,跳掉一个元素进行采样,
--------------------
如果采样总是把队列当作为满的,然后从右边进去,就不会导致这个问题,代码也就精减多少。
现在 从右边进,但队列是空的,就需要考虑二种情况。一不小心,就导致这种采样漏元素的情况。

授人于鱼,不如授人于渔
早已停用QQ了
2014-04-03 09:35
nql_neu
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-4-1
收藏
得分:0 
回复 38楼 风吹过b
我表示我都没有发现这种情况,呵呵,非常感谢版主,这个帖子得到这么多人的关注和解答,感觉非常有意义,希望对大家都有帮助,再次感谢!
2014-04-03 16:08
茅十八
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:35
专家分:123
注 册:2014-3-11
收藏
得分:1 
好像在模拟电信号,想起大学实验室,模拟青蛙神经传导信号的程序。  好厉害

个人QQ:1789851851,有学习问题,欢迎找我讨论,另外Win32 SDK开发群:179492890
2014-04-03 22:16
快速回复:真心求教,用VB实现动态曲线的绘制,总是有问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019327 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved