在寫代碼之前,我們需要知道標準的正弦函數(以下稱為sin函數),最大值是1,最小值是-1,幾個關鍵點是0,±n*π/2,±n*π,而且它是周期性的,我們不可能讓VB真的無限畫下去,只需要在可見的窗體上繪制就行了。說sin的概念是為了確定坐標系,因為sin最大值也只有1,所以我們要放大它的值,以便顯示最好的效果,如果不確定坐標系,可能畫出來一條近似直線的波浪線。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網綜合服務,包含不限于網站設計、網站建設、鳳凰網絡推廣、小程序制作、鳳凰網絡營銷、鳳凰企業(yè)策劃、鳳凰品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供鳳凰建站搭建服務,24小時服務熱線:18980820575,官方網址:www.cdcxhl.com
首先,在Form_Load的事件里面寫好坐標系,如果自己邏輯好這步確實可以不做,但是不做的結果就是需要寫代碼的人自己考慮偏移量,所以定好坐標系之后,寫的函數就簡單直觀許多了。自定義坐標系的方法是:scale(x1,y1)-(x2,y2).
第二,開始寫sin的函數,可以寫在模塊里面,也可以直接在窗體代碼區(qū)寫,寫模塊是為了以后調試方便,如果只是為了顯示標準的sin函數,在窗體寫也可以。定義幾個雙精度付典型的變量y,x ?,函數關系是y=sin(x)
第三,繪制一個點,當然是sin上的點。第二步已經獲得了x和y,正好是橫坐標和縱坐標,我們?yōu)榱俗屒€平滑一些,可以Line方法,因為真的畫點十分吃內存,比較卡,也就是我們畫線不畫點(很短很短的先近似于點),方法是Line (x1,y1)-(x2,y2)
最后,套用循環(huán)語句輸出,其實說這是最后也不太合適,這部其實是套在第三步和第二步之外的,也就是確定x軸顯示區(qū)間和曲線平滑度的作用。
'代碼
Private?Sub?Form_Load()
Me.AutoRedraw?=?True????????????'開啟自動重繪
Form1.Height?=?2400?????????????'自定義窗體高度
Form1.Width?=?8000??????????????'自定義窗體寬度
Scale?(-16,?1.2)-(16,?-1.2)?????'自定義坐標系
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))??'畫起始點
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)????????????????'連接上一個點
Next?i
End?Sub
在窗體的?Paint?事件中寫代碼,如果是pictureBox,就在pictureBox的Paint事件中寫。
這是最基本的過程,關于坐標的問題,可能可以把整個窗體坐標重定義為笛卡爾坐標,但是本人也不是很清楚,請另行百度。
Private?Sub?Form1_Paint(sender?As?Object,?e?As?PaintEventArgs)?Handles?MyBase.Paint
'獲取窗體的繪圖對象
Dim?grpf?As?Graphics?=?e.Graphics
'從0到360度,每一度畫一個點,對應的創(chuàng)建一個下標從0到360的數組
Dim?pointfs(360)?As?System.Drawing.PointF
'創(chuàng)建畫筆,顏色為黑色,線寬為2個像素。待會畫出的線條就是黑色的,兩個像素寬度
Dim?p?As?Pen?=?New?Pen(Color.Black,?2)
'sin的計算需要用弧度,前面定義是角度,所以定義一個弧度的變量
Dim?arc?As?Single
'將每個點計算出來
For?i?As?Integer?=?0?To?360
pointfs(i).X?=?i?*?1.5?'乘1.5可以把線條橫向拉長1.5倍
'將角度轉換為弧度
arc?=?i?/?180?*?Math.PI
'由于窗體的坐標和笛卡爾坐標不同,為了看起來像是笛卡爾坐標上的形狀,除了計算
'sin的值外,還要把坐標變換一下。數字50是正弦曲線的幅度
pointfs(i).Y?=?Math.Sin(arc)?*?-50?+?50
Next
'根據畫筆和點數組將曲線畫出來
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
根據時間變化繪制的,即時的,或許可以用chart圖表控件,百度會出現(xiàn)微軟網站的資料。
sin曲線永遠是哪個樣子,你是怎么變化?一般的移動,可以用offset控制向左平移,右邊則增加點,看上去應該是在移動
VB系統(tǒng)的坐標原點在左上角,X軸的正方向是水平向右,而Y軸的正方向是垂直向下。所以,要繪制三角函數的曲線,自己可以通過改變點坐標的方法來實現(xiàn),當然,VB.NET提供了相應的方法可以來實現(xiàn)坐標變換,也可以通過VB.Net的Graphics類提供的平移、旋轉等轉換來實現(xiàn)。
下面是我通過自己變換實現(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,獲得一個Graphics對象
? Dim MyGraphics As Graphics
? MyGraphics = PictureBox1.CreateGraphics
? '2,定義一個Pen對象,用于繪制圖形(輪廓線)
? Dim MyPen As New Pen(Color.Black, 1)
? '3,定義一個Brush對象,用于填充圖形(如果需要填充的話)
? 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,獲得一個Graphics對象
? Dim MyGraphics As Graphics
? MyGraphics = PictureBox1.CreateGraphics
? '2,定義一個Pen對象,用于繪制圖形(輪廓線)
? Dim MyPen As New Pen(Color.Black, 1)
? '3,定義一個Brush對象,用于填充圖形(如果需要填充的話)
? Dim MyBrush As New SolidBrush(Color.Orange)
? '聲明橫向和縱向比例變量
? Dim Heng As Integer = 20
? Dim Zong As Integer = 50
? '先獲得正弦值,保存到點坐標數組
? 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
? '采用繪制光滑線連接點的方式繪制曲線
? MyGraphics.DrawCurve(MyPen, MyPoints)
End Sub
End Class
顯示的效果圖: