Private Const pi = 3.14159
成都創(chuàng)新互聯(lián)主營(yíng)包頭網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),包頭h5微信平臺(tái)小程序開發(fā)搭建,包頭網(wǎng)站營(yíng)銷推廣歡迎包頭等地區(qū)企業(yè)咨詢
Private a
Private Sub Form_Load()
Me.AutoRedraw = True
'首先清除me內(nèi)的圖形
Me.Cls
'Scale方法設(shè)定用戶坐標(biāo)系,坐標(biāo)原點(diǎn)在me中心
Me.ScaleMode = 0
Me.ScaleMode = 3
Me.Scale (-10, 10)-(10, -10)
'設(shè)置繪線寬度
Me.DrawWidth = 1
'繪坐標(biāo)系的X軸及箭頭線
Me.Line (-10, 0)-(10, 0), vbBlue
Me.Line (9, 0.5)-(10, 0), vbBlue
Me.Line -(9, -0.5), vbBlue
Me.ForeColor = vbBlue
Me.Print "X"
'繪坐標(biāo)系的Y軸及箭頭線
Me.Line (0, 10)-(0, -10), vbBlue
Me.Line (0.5, 9)-(0, 10), vbBlue
Me.Line -(-0.5, 9), vbBlue
Me.Print "Y"
'指定位置顯示原點(diǎn)O
Me.CurrentX = 0.5
Me.CurrentY = -0.5
Me.Print "O"
'重設(shè)繪線寬度
Me.DrawWidth = 2
'用For循環(huán)繪點(diǎn),使其按正弦規(guī)律變化。步長(zhǎng)值很小,使其形成動(dòng)畫效果
For a = -2 * pi To 2 * pi Step pi / 6000
Me.PSet (a, Sin(a) * 5), vbRed
Next
'指定位置顯示描述文字
Me.CurrentX = pi / 2
Me.CurrentY = -7
Me.ForeColor = vbBlack
Me.Print "正弦曲線示意"
End Sub
為什么我的不是?
Dim?pi
pi?=?3.1415926
Dim?a
a?=?30
Text1.Text?=?Sin(a?*?pi?/?180)
VB系統(tǒng)的坐標(biāo)原點(diǎn)在左上角,X軸的正方向是水平向右,而Y軸的正方向是垂直向下。所以,要繪制三角函數(shù)的曲線,自己可以通過改變點(diǎn)坐標(biāo)的方法來實(shí)現(xiàn),當(dāng)然,VB.NET提供了相應(yīng)的方法可以來實(shí)現(xiàn)坐標(biāo)變換,也可以通過VB.Net的Graphics類提供的平移、旋轉(zhuǎn)等轉(zhuǎn)換來實(shí)現(xiàn)。
下面是我通過自己變換實(shí)現(xiàn)的示例,提供參考;我的環(huán)境是VB.NET 2010
Imports System.Math
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
? '1,獲得一個(gè)Graphics對(duì)象
? Dim MyGraphics As Graphics
? MyGraphics = PictureBox1.CreateGraphics
? '2,定義一個(gè)Pen對(duì)象,用于繪制圖形(輪廓線)
? Dim MyPen As New Pen(Color.Black, 1)
? '3,定義一個(gè)Brush對(duì)象,用于填充圖形(如果需要填充的話)
? Dim MyBrush As New SolidBrush(Color.Orange)
? MyGraphics.DrawLine(MyPen, 0, 200, 700, 200)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
? '1,獲得一個(gè)Graphics對(duì)象
? Dim MyGraphics As Graphics
? MyGraphics = PictureBox1.CreateGraphics
? '2,定義一個(gè)Pen對(duì)象,用于繪制圖形(輪廓線)
? Dim MyPen As New Pen(Color.Black, 1)
? '3,定義一個(gè)Brush對(duì)象,用于填充圖形(如果需要填充的話)
? Dim MyBrush As New SolidBrush(Color.Orange)
? '聲明橫向和縱向比例變量
? Dim Heng As Integer = 20
? Dim Zong As Integer = 50
? '先獲得正弦值,保存到點(diǎn)坐標(biāo)數(shù)組
? Dim MyPoints(700) As Point
? Dim i As Integer
? For i = 0 To 700
? ? ? MyPoints(i) = New Point(i * Heng, 200 + Sin(i) * Zong)
? Next
? '采用繪制光滑線連接點(diǎn)的方式繪制曲線
? MyGraphics.DrawCurve(MyPen, MyPoints)
End Sub
End Class
顯示的效果圖:
我先給你寫一段如果不明白加我QQ:905906
在工控制軟件中,實(shí)時(shí)曲線的繪制用途非常的廣泛,它可以很直觀的顯示出監(jiān)控?cái)?shù)據(jù)的變化值和變化趨勢(shì)。在VB中實(shí)現(xiàn)曲線的繪制有很多種方法,本文介紹一種非常簡(jiǎn)單的方法來實(shí)現(xiàn)實(shí)時(shí)曲線的繪制。
在VB中實(shí)現(xiàn)實(shí)時(shí)曲線的繪制,要利用VB的PictureBox(圖像)控件,和畫線函數(shù)line(x1,y1)-(x2,y2)。PictureBox控件,可以作為一個(gè)“容器”,在它的里面可以包含很多的對(duì)象。也可以執(zhí)行很多VB的內(nèi)部函數(shù)。
要實(shí)現(xiàn)實(shí)時(shí)曲線的繪制,肯定要有外部實(shí)時(shí)數(shù)據(jù)的輸入,這里假設(shè)是有一個(gè)數(shù)據(jù)從計(jì)算機(jī)的串口輸入 定義該數(shù)據(jù)變量為DataFromCom。實(shí)時(shí)曲線反映的就是該數(shù)據(jù)。
打開VB6.0中文版,新建一個(gè)項(xiàng)目和窗體,修改窗體的屬性,將“Heigh”修改為:8000,“Width”修改為在窗體中放如一個(gè)PictureBox控件。然后重新定義PictureBox控件的一些基本屬性,在VB中選中PictureBox控件,直接在它的屬性框中,修改一些屬性參數(shù)?!懊Q”改為Pic。 “AutoRedraw”改為:True。“BackColor”改為:H00004000(墨綠色背景顏色)。”Heigh”改為:5000?!癢idth”改為:8000。如圖1所示:
然后要重新定義PictureBox控件的坐標(biāo)系。圖像框的默認(rèn)坐標(biāo)系,是從左上角開始的,不符合我們的畫線要求。修改坐標(biāo)系的目的是讓曲線從圖像框的左邊正中間,開始畫線。修改圖像框的坐標(biāo)系,這里定義一個(gè)過程PicScale(),代碼如下:
Private Sub PicScale(picX As PictureBox)
picX.Scale (0, PicX.ScaleHeight)-(picX.ScaleWidth, -PicX.ScaleHeight)
End Sub
一般的實(shí)時(shí)曲線顯示的時(shí)候在屏幕的正中間有一條基準(zhǔn)線,這里也要畫出這條基準(zhǔn)線,用一個(gè)過程PicMidleLine()來實(shí)現(xiàn),代碼如下:
Private Sub PicMidleLine( picX As PictureBox)
picX.Line (0, 0)-(picX.ScaleWidth, 0), vbGreen '畫出中線
End Sub
要畫一條實(shí)時(shí)曲線,坐標(biāo)軸的設(shè)定很重要,在這里把X軸設(shè)定為時(shí)間軸,Y軸設(shè)定為數(shù)據(jù)軸。對(duì)應(yīng)X軸我們定義一個(gè)時(shí)間變量TimeCount,TimeCount會(huì)隨著時(shí)間逐漸遞增,每次遞增,對(duì)應(yīng)著一個(gè)從串口讀過來的數(shù)據(jù)DataFromCom,這樣圖像框中的(x,y)坐標(biāo)點(diǎn)實(shí)際上就對(duì)應(yīng)著(TimeCount,DataFromCom)如果只是當(dāng)TimeCount發(fā)生變化時(shí)就在圖像框上畫一個(gè)點(diǎn),就只需調(diào)用VB中的畫像素的函數(shù)point(x,y),這里x,y為所畫的點(diǎn)的坐標(biāo)。單這樣畫出來的是一個(gè)個(gè)不連續(xù)的點(diǎn)。我們想要的是實(shí)時(shí)的連續(xù)的曲線,所以要調(diào)用VB中的畫線的函數(shù)line(x1,y1)-(x2,y2),這里(x1,y1)(x2,y2)為所要畫的線的起點(diǎn)和終點(diǎn)的坐標(biāo)。只要把上次串口讀過來的數(shù)據(jù)(這里把它定義為變量DataFromComLast)和現(xiàn)在串口讀過來的數(shù)據(jù)(DataFromCom)和TimeCount相對(duì)應(yīng),調(diào)用line(x1,y1)-(x2,y2)函數(shù)就可以在圖像框中畫出實(shí)時(shí)的曲線了。把它寫成一個(gè)過程如下面的代碼:
Private Sub DrawRealLine(picX As PictureBox, TimeCountX As Integer, DataFromComX As Integer, DataFromComLastX As Integer)
If TimeCountX - 1 0 Then
picX.Line (TimeCountX - 1, DataFromComLastX)-(TimeCountX, DataFromComX), vbWhite
End If
End Sub
有了三個(gè)過程就可以在圖像框中畫出一條實(shí)時(shí)的曲線了。
DrawRealLine()過程中的picX.Line (TimeCountX - 1, DataFromComLastX)-(TimeCountX, DataFromComX), vbWhite所畫線的起始點(diǎn)和結(jié)束點(diǎn)都是以像素為單位的,這樣以來如果不改變的話,畫出來的線將是一個(gè)屏幕上像素相連的很密的曲線,通過調(diào)整line(x1,y1)-(x2,y2)
中的x的值,就可以畫出分布密度不一樣的曲線,這里為了在屏幕上能夠看到不是很密的曲線我們把x乘以一個(gè)系數(shù)10,修改為:
picX.Line ((TimeCountX - 1) * 10, DataFromComLastX)-(TimeCountX * 10, DataFromComX), vbWhite
這比較容易在屏幕上看到稀疏的曲線。
由于是僅僅講解如何畫出實(shí)時(shí)的曲線,讀者的計(jì)算機(jī)上未必有和串口相連的設(shè)備,這里用一個(gè)定時(shí)器控件來模擬從串口讀過來的數(shù)據(jù)。在窗體上放入一個(gè)Timer控件,修改Timer控件的屬性為:“Enable”該為True,“Interval”改為300。雙擊Timer控件在它的過程中,添加代碼后如下:
Private Sub Timer1_Timer()
DataFromComLast = DataFromCom
Randomize
DataFromCom = 3000 * Rnd
TimeCount = TimeCount + 1
DrawRealLine Pic, TimeCount, DataFromCom, DataFromComLast
End Sub
這樣在運(yùn)行后就可以看到我們想要的實(shí)時(shí)曲線了,如下圖:
圖 2
下面是完整的代碼:
Option Explicit
Dim DataFromCom As Integer '從串口讀過來的實(shí)時(shí)值
Dim DataFromComLast As Integer '上次的串口值
Dim TimeCount As Integer
Private Sub Form_Load()
PicScale Pic '調(diào)整圖像框的坐標(biāo)系
PicMidleLine Pic '在圖像框中畫一條中線
End Sub
Private Sub PicScale(picX As PictureBox) '調(diào)整圖像框的坐標(biāo)系
picX.Scale (0, picX.ScaleHeight)-(picX.ScaleWidth, -picX.ScaleHeight)
End Sub
Private Sub PicMidleLine(picX As PictureBox) '在圖像框中畫一條中線
picX.Line (0, 0)-(picX.ScaleWidth, 0), vbGreen '畫出中線
End Sub
Private Sub DrawRealLine(picX As PictureBox, TimeCountX As Integer, DataFromComX As Integer, DataFromComLastX As Integer)
If TimeCountX - 1 0 Then
picX.Line ((TimeCountX - 1) * 10, DataFromComLastX)-(TimeCountX * 10, DataFromComX), vbWhite
End If
End Sub
Private Sub Timer1_Timer()
DataFromComLast = DataFromCom
Randomize
DataFromCom = 3000 * Rnd
TimeCount = TimeCount + 1
DrawRealLine Pic, TimeCount, DataFromCom, DataFromComLast '畫出實(shí)時(shí)的曲線
End Sub
在寫代碼之前,我們需要知道標(biāo)準(zhǔn)的正弦函數(shù)(以下稱為sin函數(shù)),最大值是1,最小值是-1,幾個(gè)關(guān)鍵點(diǎn)是0,±n*π/2,±n*π,而且它是周期性的,我們不可能讓VB真的無限畫下去,只需要在可見的窗體上繪制就行了。說sin的概念是為了確定坐標(biāo)系,因?yàn)閟in最大值也只有1,所以我們要放大它的值,以便顯示最好的效果,如果不確定坐標(biāo)系,可能畫出來一條近似直線的波浪線。
首先,在Form_Load的事件里面寫好坐標(biāo)系,如果自己邏輯好這步確實(shí)可以不做,但是不做的結(jié)果就是需要寫代碼的人自己考慮偏移量,所以定好坐標(biāo)系之后,寫的函數(shù)就簡(jiǎn)單直觀許多了。自定義坐標(biāo)系的方法是:scale(x1,y1)-(x2,y2).
第二,開始寫sin的函數(shù),可以寫在模塊里面,也可以直接在窗體代碼區(qū)寫,寫模塊是為了以后調(diào)試方便,如果只是為了顯示標(biāo)準(zhǔn)的sin函數(shù),在窗體寫也可以。定義幾個(gè)雙精度付典型的變量y,x ?,函數(shù)關(guān)系是y=sin(x)
第三,繪制一個(gè)點(diǎn),當(dāng)然是sin上的點(diǎn)。第二步已經(jīng)獲得了x和y,正好是橫坐標(biāo)和縱坐標(biāo),我們?yōu)榱俗屒€平滑一些,可以Line方法,因?yàn)檎娴漠孅c(diǎn)十分吃內(nèi)存,比較卡,也就是我們畫線不畫點(diǎn)(很短很短的先近似于點(diǎn)),方法是Line (x1,y1)-(x2,y2)
最后,套用循環(huán)語句輸出,其實(shí)說這是最后也不太合適,這部其實(shí)是套在第三步和第二步之外的,也就是確定x軸顯示區(qū)間和曲線平滑度的作用。
'代碼
Private?Sub?Form_Load()
Me.AutoRedraw?=?True????????????'開啟自動(dòng)重繪
Form1.Height?=?2400?????????????'自定義窗體高度
Form1.Width?=?8000??????????????'自定義窗體寬度
Scale?(-16,?1.2)-(16,?-1.2)?????'自定義坐標(biāo)系
Line?(-16,?0)-(16,?0)???????????'繪制X軸
Line?(0,?1.2)-(0,?-1.2)?????????'繪制Y軸
End?Sub
Private?Sub?Command1_Click()
Line?(-16,?Sin(-16))-(-16,?Sin(-16))??'畫起始點(diǎn)
Dim?x?As?Double?????????????????'定義x
Dim?y?As?Double?????????????????'定義y
For?i?=?-16?To?16?Step?0.1??????'step越小,曲線越平滑
x?=?i
y?=?Sin(x)
Line?-(x,?y)????????????????'連接上一個(gè)點(diǎn)
Next?i
End?Sub