| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6362 人关注过本帖, 5 人收藏
标题:真心求教,用VB实现动态曲线的绘制,总是有问题
只看楼主 加入收藏
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


有点不适合套用我的函数画图。我的图是不支持滚动条。也就是说压了多少数据进去 ,就画多少点。
而你的要求是 120个点,界面上只显示 30个点,其它点可以通过滚动条来查看。

授人于鱼,不如授人于渔
早已停用QQ了
2014-04-02 11:56
nql_neu
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-4-1
收藏
得分:0 
回复 20楼 owenlu1981
画前120个点的时候你运行下可以发现有一条线总在picturebox的最上边沿,120个以后的绘图状态才是我想要的,你运行下代码就可以发现问题了,楼主,非常感谢
2014-04-02 12:40
nql_neu
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-4-1
收藏
得分:0 
回复 21楼 风吹过b
恩,单纯的画静态折线图我也会,但是这次毕业设计要求动态显示采集到的数据,遗憾的是目前的代码不是很完美,但是还是非常感谢你朋友!
2014-04-02 12:44
nql_neu
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-4-1
收藏
得分:0 
回复 19楼 风吹过b
朋友,你能把你改完的代码给我看一下吗,我改完效果不对啊,你改完了然后在回复这个界面里把代码给我看下呗,多谢!
2014-04-02 13:26
vbvcr51
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:18
帖 子:364
专家分:1724
注 册:2013-11-3
收藏
得分:1 
vb处理这类型的应用真是太经典了
2014-04-02 13:40
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:653
专家分:3402
注 册:2008-5-7
收藏
得分:0 
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 j = 0 To col
    py(j) = Val(List1.List(j))
    px(j) = 1200 - 10 * (col - j) '如果数据点数》30  《121,数据的横坐标则用这个式子赋值
  Next j
  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 - 1    '这里修改下可能复合你的要求
    Picture1.Line -(px(i - 1), py(i - 1)), QBColor(2)
  Next i
End If
End Sub
2014-04-02 13:43
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:653
专家分:3402
注 册:2008-5-7
收藏
得分:0 
完成这种功能的思路是:1,一个指示当前点位置的指针。2,一个前推出后推入的缓冲池,完成起来应该很简单的。
2014-04-02 13:52
nql_neu
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-4-1
收藏
得分:0 
回复 27楼 lowxiong
楼主你真是厉害,按你说的改完后果然对了,但是在运行几十秒之后画出的图像就很奇怪了,不是那种带尖儿的折线图,是那种平的,然后再运行一会儿又成了带尖的那种图了,由于采用的是随机数,应该都是那种带尖的折线才对,麻烦你再费下心,感激不尽!
2014-04-02 14:30
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
好吧。  给你 弄混乱了。。。。。。

1、数据来源:list1.list  ,无限。
2、数据缓冲:PX,PY , 121 个元素。
3、绘图开始位置指针:col
4、绘图点个数: 30
5、绘图滚动条 范围 : 0 - 900   
你数据缓冲只有 120 个点,你如何去绘制 900 的位置呢?混乱。
按你的思路重写时,发现这个混乱。

修改方案:有二种。
1、直接把 list1.list 当作数据缓冲,限制数据个数为 930 个。
2、重新定义 PX,Py ,定义为 930 个元素。

你先选吧。

授人于鱼,不如授人于渔
早已停用QQ了
2014-04-02 15:51
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
这是第1种的修改方案:

程序代码:
Dim px(121) As Single, py(121) As Single '用来保存曲线数据的坐标值,程序中实时曲线通道为30.      '仅使用前30个元素

Dim col As Integer             '当前需绘制的点数                '未使用
Dim pl As Integer          '判断是否画动态曲线                  '未使用

Private Sub Command1_Click()
Timer2.Enabled = True
If Timer1.Enabled = True Then
Command1.Caption = "开始"
Timer1.Enabled = False
Else
Command1.Caption = "暂停"
Timer1.Enabled = True
End If
End Sub

Private Sub Command2_Click()
End
End Sub

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

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

'移到这里
 Randomize

 
End Sub

Private Sub HScroll1_Change()

Call Timer1_Timer

'此段函数清空
'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

Dim i As Long
Dim j As Long
Dim k As Long

'把 list1 当作数据缓冲,直接到里面读数据

i = List1.ListCount - 1        '总数据量
j = HScroll1.value              '滚动条位置,决定起始位置
If j > i Then Exit Sub          '如果没读到数据,不执行读数据和绘图功能,直接退出处理

If i - j > 31 Then i = j + 31   '确保只取 31 个值

'j 是滚动条的值,也就是开始位置
'i 是终止值,list1 中的总记录数 或 比 J 大 30
For k = 0 To i - j
    px(k) = 900 + (k) * 10
    py(k) = Val(List1.List(k + j))
Next k
    For i = 1 To i - j
        Picture1.Line (px(i - 1), py(i - 1))-(px(i), py(i)), QBColor(2)           '使用省略参数进行绘图,老出错,只好用标准命令
    Next i


'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 j = 0 To col
'        py(j) = Val(List1.List(j))'Picture1.Cls
'
'If List1.ListCount > 1 Then
'Call ADDDATA(List1.List(List1.ListCount - 1))           '把最后一个数据加进去。
'End If

'        px(j) = 1200 - 10 * (col - j) '如果数据点数》30  《121,数据的横坐标则用这个式子赋值
'    Next j
'    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(i))
'                                             '数组的最后一个元素始终存放当前最新实时数据
'End If

'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 Timer2_Timer()
Dim value As Integer

value = Int(200 * Rnd + 100)
List1.AddItem value

 
'list1中最多保存930条记录,HScroll1.max + 30
If List1.ListCount > 930 Then
    List1.RemoveItem 0
End If

End Sub

授人于鱼,不如授人于渔
早已停用QQ了
2014-04-02 15:52
快速回复:真心求教,用VB实现动态曲线的绘制,总是有问题
数据加载中...
 
   



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

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