在寫代碼之前,我們需要知道標(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)系,可能畫出來一條近似直線的波浪線。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、鳳凰網(wǎng)絡(luò)推廣、小程序制作、鳳凰網(wǎng)絡(luò)營銷、鳳凰企業(yè)策劃、鳳凰品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供鳳凰建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:jinyejixie.com
首先,在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
在窗體的?Paint?事件中寫代碼,如果是pictureBox,就在pictureBox的Paint事件中寫。
這是最基本的過程,關(guān)于坐標(biāo)的問題,可能可以把整個(gè)窗體坐標(biāo)重定義為笛卡爾坐標(biāo),但是本人也不是很清楚,請(qǐng)另行百度。
Private?Sub?Form1_Paint(sender?As?Object,?e?As?PaintEventArgs)?Handles?MyBase.Paint
'獲取窗體的繪圖對(duì)象
Dim?grpf?As?Graphics?=?e.Graphics
'從0到360度,每一度畫一個(gè)點(diǎn),對(duì)應(yīng)的創(chuàng)建一個(gè)下標(biāo)從0到360的數(shù)組
Dim?pointfs(360)?As?System.Drawing.PointF
'創(chuàng)建畫筆,顏色為黑色,線寬為2個(gè)像素。待會(huì)畫出的線條就是黑色的,兩個(gè)像素寬度
Dim?p?As?Pen?=?New?Pen(Color.Black,?2)
'sin的計(jì)算需要用弧度,前面定義是角度,所以定義一個(gè)弧度的變量
Dim?arc?As?Single
'將每個(gè)點(diǎn)計(jì)算出來
For?i?As?Integer?=?0?To?360
pointfs(i).X?=?i?*?1.5?'乘1.5可以把線條橫向拉長(zhǎng)1.5倍
'將角度轉(zhuǎn)換為弧度
arc?=?i?/?180?*?Math.PI
'由于窗體的坐標(biāo)和笛卡爾坐標(biāo)不同,為了看起來像是笛卡爾坐標(biāo)上的形狀,除了計(jì)算
'sin的值外,還要把坐標(biāo)變換一下。數(shù)字50是正弦曲線的幅度
pointfs(i).Y?=?Math.Sin(arc)?*?-50?+?50
Next
'根據(jù)畫筆和點(diǎn)數(shù)組將曲線畫出來
grpf.DrawCurve(p,?pointfs)
End?Sub
Dim Points1(30) As Point
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Timer1.Enabled = True
Timer1.Interval = 200
For i = 0 To 30
Points1(i) = New Point(i * 45, Math.Sin(i) * (PictureBox1.Height - 50) / 9)
Points1(i).Offset(-450, Math.Abs(Points1(i).Y - (PictureBox1.Height - 50) / 9) * 3.55 + 43)
Next
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Static j As Long
j = j + 1
PictureBox1.Image = x_y(PictureBox1, j)
End Sub
Private Function x_y(ByVal pic As PictureBox, ByVal x As Long) As Bitmap
Dim b As New Bitmap(pic.Width, pic.Height)
Dim g As Graphics = Graphics.FromImage(b)
Dim c
Dim j
g.Clear(Color.YellowGreen)
Dim p As New Pen(Color.WhiteSmoke)
p.EndCap = Drawing2D.LineCap.ArrowAnchor
g.DrawLine(p, 20, pic.Height - 20, 20, 10)
g.DrawLine(p, 20, pic.Height - 20, pic.Width - 20, pic.Height - 20)
Dim i As Double
Dim bs As New SolidBrush(Color.Red)
Dim po As New Point
g.DrawString(-2, Me.Font, bs, 12, pic.Height - 18)
po.X = 0
po.Y = pic.Height - 45
For i = -1.6 To 4 Step 0.4
g.DrawString(Math.Round(i, 1), Me.Font, bs, po.X, po.Y)
g.DrawLine(p, po.X + 18, po.Y + 5, po.X + 20, po.Y + 5)
Dim p1 As New Pen(Color.Blue)
p1.DashStyle = Drawing2D.DashStyle.Dash
g.DrawLine(p1, po.X + 28, po.Y + 5, pic.Width - 20, po.Y + 5)
po.Y -= (pic.Height - 50) / 9
Next
po.X = 20
po.Y = pic.Height - 20
For c = 0 To 14400 Step 1200
If (c / 1200) 0 Then
g.DrawString((c / 1200) + x, Me.Font, bs, po.X - j, po.Y + 5)
End If
g.DrawLine(p, po.X, po.Y + 2, po.X, po.Y)
po.X += (pic.Width - 50) / 12
Next
For i = 0 To Points1.Count - 1
Points1(i).Offset(45, 0)
Next
If x Mod 6 = 0 Then
For i = 0 To Points1.Count - 1
Points1(i).Offset(-270, 0)
Next
End If
g.DrawCurve(Pens.Red, Points1)
'For i = 0 To Points1.Count - 1
'g.DrawString(Math.Sin(i), Me.Font, Brushes.Red, Points1(i))
'Next
Return b
End Function
根據(jù)時(shí)間變化繪制的,即時(shí)的,或許可以用chart圖表控件,百度會(huì)出現(xiàn)微軟網(wǎng)站的資料。
sin曲線永遠(yuǎn)是哪個(gè)樣子,你是怎么變化?一般的移動(dòng),可以用offset控制向左平移,右邊則增加點(diǎn),看上去應(yīng)該是在移動(dòng)
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
顯示的效果圖:
當(dāng)前文章:vbnet畫sin的簡(jiǎn)單介紹
網(wǎng)頁網(wǎng)址:http://jinyejixie.com/article46/dosdgeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、移動(dòng)網(wǎng)站建設(shè)、建站公司、Google、靜態(tài)網(wǎng)站、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)