| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7709 人关注过本帖, 1 人收藏
标题:实时曲线的图的绘制
只看楼主 加入收藏
snrtjat
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山那边 海尽头
等 级:贵宾
威 望:22
帖 子:1115
专家分:7025
注 册:2013-1-21
结帖率:89.19%
收藏(1)
已结贴  问题点数:100 回复次数:8 
实时曲线的图的绘制

图出来了,但是画出来的点与坐标不对,应该怎么修改,请帮忙看看,谢谢!

曲线.zip (3.92 KB)
2016-12-16 15:46
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:10 
吧Timer2_Timer过程里的曲线绘图的代码修改如下:

For i = 0 To 绘图大小 - 1
    'If py(k + i) > 0 Then           '因为是从最左边开始绘图,所以要先判断一下数据是否有效
        Picture2.Line (i * 20, 100 - py(k + i - 1))-(i * 20 + 20, 100 - py(k + i)), QBColor(1)
    'End If
Next i
2016-12-16 16:43
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:30 
看到这个界面,怎么这么眼熟。

1、界面,你的高度差是 30坐标一个值。而你标注是 50级一根线,怎么对得上???
For i = 0 To 6
    s1 = CStr(i * 50 + -50)                                '标注值
    Picture2.CurrentX = -Picture2.TextWidth(s1)
    Picture2.CurrentY = i * 30 - Picture2.TextHeight(s1) / 2    '每个标注之间的Y坐标差值 30
    Picture2.Print s1
Next i

2、起点
我原来起点是100,所以所有的值绘制时,都要修正,也就是都要减掉100,
而你的起点是 0,为啥来要修正。

3、我原来的数据里面是不会出现 负数的,所以可以用 2楼所说的判断
但你现在的数据会出现负数,所以要把这个判断改掉。

4、原来演示要求是:
数据采集是外部数据产生,而绘图是自己程序产生,所以有二个定时器。一个模拟外部数据产生,一个自己使用。
如果你数据产生和绘图都是一个定时器,那么你也可以考虑参考
https://bbs.bccn.net/thread-306299-1-1.html
这个贴子。

授人于鱼,不如授人于渔
早已停用QQ了
2016-12-16 19:48
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:0 
原绘图函数以供2楼参考
程序代码:
Private Sub Timer2_Timer()

Dim i As Long
Dim k As Long
Dim s1 As String

k = HScroll1.Value

'绘图在 Picture2 进行,Picture2是不显示的。

Picture2.Cls

Picture2.Line (0, 0)-(0, 210), QBColor(0)                       'Y轴
Picture2.Line (0, 0)-(绘图大小 * 40 + 20, 0), QBColor(0)        'X轴

'每个点的竖线,以及显示标注
For i = 1 To 绘图大小
    s1 = CStr(i + k - 1)
    Picture2.CurrentX = i * 40 - Picture2.TextWidth(s1) / 2
    Picture2.CurrentY = 0
    Picture2.Print s1
    Picture2.Line (i * 40, 0)-(i * 40, 200), QBColor(2)
Next i

'每条刻度线,以及显示标注
For i = 1 To 10
    s1 = CStr(i * 20 + 100)
    Picture2.Line (0, i * 20)-(绘图大小 * 40, i * 20), QBColor(2)
    Picture2.CurrentX = -Picture2.TextWidth(s1)
    Picture2.CurrentY = i * 20 - Picture2.TextHeight(s1) / 2
    Picture2.Print s1
Next i

'Picture2.PSet (0, py(k - 1)), QBColor(2)
For i = 0 To 绘图大小 - 1
    If py(k + i) > 0 Then           '因为是从最左边开始绘图,所以要先判断一下数据是否有效
        Picture2.Line (i * 40, py(k + i - 1) - 100)-(i * 40 + 40, py(k + i) - 100), QBColor(1)
    End If
Next i
    
'把图像复制到 picture1中时行显示
Picture1.PaintPicture Picture2.Image, 0, 0

End Sub

原界面:
图片附件: 游客没有浏览图片的权限,请 登录注册

授人于鱼,不如授人于渔
早已停用QQ了
2016-12-16 19:50
snrtjat
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山那边 海尽头
等 级:贵宾
威 望:22
帖 子:1115
专家分:7025
注 册:2013-1-21
收藏
得分:0 
风吹过b 老师,不好意思,我是从你共享的文件中进行修改的,不懂各个参数的修改,所以来发求助。这里你是大哥,很多VB知识都得向你学习。

不怕错误,只怕知错不改.
2016-12-18 09:52
snrtjat
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山那边 海尽头
等 级:贵宾
威 望:22
帖 子:1115
专家分:7025
注 册:2013-1-21
收藏
得分:0 
风吹过b 老师,
   根据您的提示,我已修改。多谢!
   现在还有一个问题,就是负数应该怎么修改判断?
程序代码:
Picture2.Cls
Picture2.Line (0, 0)-(0, 210), QBColor(0)
Picture2.Line (0, 90)-(1250, 90), QBColor(0)

For i = 0 To 6
    s1 = CStr(i * 50 - 150)
    Picture2.CurrentX = -Picture2.TextWidth(s1)
    Picture2.CurrentY = (i * 50 - Picture2.TextHeight(s1) / 2) / 1.5
    Picture2.Print s1
Next i

Picture2.PSet (0, py(k - 1)), QBColor(2)
For i = 0 To 绘图大小 - 1
    'If py(k + i) > 0 Then           '因为是从最左边开始绘图,所以要先判断一下数据是否有效
        Picture2.Line ((i * 40) / 2, (py(k + i - 1)) / 2)-((i * 40 + 40) / 2, (py(k + i)) / 2), QBColor(1)
    'End If
Next i
    
Picture1.PaintPicture Picture2.Image, 0, 0

   
图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2016-12-18 11:43编辑过]


不怕错误,只怕知错不改.
2016-12-18 11:41
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:30 
1、增加二个常量定义
Const X间隔 = 40
Const Y间隔 = 50                '加一个常量,防止新手搞错


2、Private Sub Form_Load() 这里这句要改
Picture2.Scale (-50, 210)-(绘图大小 * X轴间隔 + X轴间隔/2, -220) '设置绘图区域坐标


-50 ,这50用来显示 Y轴坐标数值用的
210 ,这里 10 是控制上边距
-220 ,这20用来显示 X轴坐标数值用的
X轴间隔/2 ,是用来控制右边距的

你绘图时使用区域使用 0,200 - ? 200

3、绘图函数。按你的 -200 到 +200 重新改过了。
程序代码:
Private Sub Timer2_Timer()

Dim i As Long
Dim k As Long
Dim s1 As String


k = HScroll1.Value

'绘图在 Picture2 进行,Picture2是不显示的。

Picture2.Cls

Picture2.Line (0, -210)-(0, 210), QBColor(0)                       'Y轴
Picture2.Line (0, 0)-(绘图大小 * 40 + 20, 0), QBColor(0)        'X轴

'每个点的竖线,以及显示标注
For i = 1 To 绘图大小
    s1 = CStr(i + k - 1)
    Picture2.CurrentX = i * X间隔 - Picture2.TextWidth(s1) / 2
    Picture2.CurrentY = -200
    Picture2.Print s1
    Picture2.Line (i * X间隔, -200)-(i * X间隔, 200), QBColor(2)
Next i

'每条刻度线,以及显示标注
For i = -4 To 4
        s1 = CStr(i * Y间隔)
    If i <> 0 Then              'X轴不重画
        Picture2.Line (0, i * Y间隔)-(绘图大小 * X间隔, i * Y间隔), QBColor(2)
    End If
        Picture2.CurrentX = -Picture2.TextWidth(s1)
        Picture2.CurrentY = i * Y间隔 - Picture2.TextHeight(s1) / 2
        Picture2.Print s1
Next i

'Picture2.PSet (0, py(k - 1)), QBColor(2)
For i = 0 To 绘图大小 - 1
'    If py(k + i) > 0 Then           '因为是从最左边开始绘图,所以要先判断一下数据是否有效
        Picture2.Line (i * X间隔, py(k + i - 1))-(i * X间隔 + X间隔, py(k + i)), QBColor(1)
'    End If
Next i
    
'把图像复制到 picture1中时行显示
Picture1.PaintPicture Picture2.Image, 0, 0

End Sub



-------------
我是在我的代码基础上改的,你要用于你的代码,需要重新整合。

授人于鱼,不如授人于渔
早已停用QQ了
2016-12-18 19:39
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:30 
如果你打算把尚未产生的数值绘出 0 来。
那么,在采样过程中,有一个变量 wz ,定义为缓冲区压入数据的个数,用这个值给绘图循环终值。
For i = 0 To 绘图大小 - 1
改为
For i = 0 To wz - 1

注意,这个变量我的定义是:
Static wz As Long               '定义静态变量,为 缓冲区使用指针。
过程中的静态变量,你需要改为全局变量,以便跨过程调用。。

授人于鱼,不如授人于渔
早已停用QQ了
2016-12-18 19:42
snrtjat
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山那边 海尽头
等 级:贵宾
威 望:22
帖 子:1115
专家分:7025
注 册:2013-1-21
收藏
得分:0 
回复 8楼 风吹过b
非常感谢您的解答,每一步说明的非常详细,已完美的解决了我的问题。

不怕错误,只怕知错不改.
2016-12-19 10:52
快速回复:实时曲线的图的绘制
数据加载中...
 
   



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

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