VB系統(tǒng)的坐標(biāo)原點(diǎn)在左上角,X軸的正方向是水平向右,而Y軸的正方向是垂直向下。所以,要繪制三角函數(shù)的曲線,自己可以通過(guò)改變點(diǎn)坐標(biāo)的方法來(lái)實(shí)現(xiàn),當(dāng)然,VB.NET提供了相應(yīng)的方法可以來(lái)實(shí)現(xiàn)坐標(biāo)變換,也可以通過(guò)VB.Net的Graphics類(lèi)提供的平移、旋轉(zhuǎn)等轉(zhuǎn)換來(lái)實(shí)現(xiàn)。
站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到北侖網(wǎng)站設(shè)計(jì)與北侖網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:做網(wǎng)站、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋北侖地區(qū)。
下面是我通過(guò)自己變換實(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ì)象,用于填充圖形(如果需要填充的話(huà))
? 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ì)象,用于填充圖形(如果需要填充的話(huà))
? 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
顯示的效果圖:
代碼原理如下:
讀取.wave
播放.wave
在播放的同時(shí)根據(jù)波形數(shù)據(jù)生成圖形顯示出來(lái)。
VB.NET畫(huà)圖是不能設(shè)置雙緩沖的,雙緩沖是指窗體,從來(lái)沒(méi)說(shuō)是針對(duì)控件。
不用graphic.clear清理重畫(huà)就不會(huì)閃爍。你可以先把容器刪了再重新建立一個(gè)再去畫(huà)。
簡(jiǎn)單舉例:
Graphics g;
Pen p;
Panel pl;
構(gòu)造函數(shù)初始化:
p=new Pen(Color.Red,2);
pl=panel1;
造成閃爍的畫(huà)法:
g=pl.CreateGraphics();
g.Clear(SystemColor.ButtonFace);
//.....畫(huà)新的
不會(huì)閃爍的辦法:
this.Controls.ReMoveAt(panel1);
pl=new Panel();
pl.Name="panel1";
//....創(chuàng)建容器控件
this.Controls.Add(pl);
//繼續(xù)畫(huà)
在寫(xiě)代碼之前,我們需要知道標(biāo)準(zhǔn)的正弦函數(shù)(以下稱(chēng)為sin函數(shù)),最大值是1,最小值是-1,幾個(gè)關(guān)鍵點(diǎn)是0,±n*π/2,±n*π,而且它是周期性的,我們不可能讓VB真的無(wú)限畫(huà)下去,只需要在可見(jiàn)的窗體上繪制就行了。說(shuō)sin的概念是為了確定坐標(biāo)系,因?yàn)閟in最大值也只有1,所以我們要放大它的值,以便顯示最好的效果,如果不確定坐標(biāo)系,可能畫(huà)出來(lái)一條近似直線的波浪線。
首先,在Form_Load的事件里面寫(xiě)好坐標(biāo)系,如果自己邏輯好這步確實(shí)可以不做,但是不做的結(jié)果就是需要寫(xiě)代碼的人自己考慮偏移量,所以定好坐標(biāo)系之后,寫(xiě)的函數(shù)就簡(jiǎn)單直觀許多了。自定義坐標(biāo)系的方法是:scale(x1,y1)-(x2,y2).
第二,開(kāi)始寫(xiě)sin的函數(shù),可以寫(xiě)在模塊里面,也可以直接在窗體代碼區(qū)寫(xiě),寫(xiě)模塊是為了以后調(diào)試方便,如果只是為了顯示標(biāo)準(zhǔn)的sin函數(shù),在窗體寫(xiě)也可以。定義幾個(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)檎娴漠?huà)點(diǎn)十分吃?xún)?nèi)存,比較卡,也就是我們畫(huà)線不畫(huà)點(diǎn)(很短很短的先近似于點(diǎn)),方法是Line (x1,y1)-(x2,y2)
最后,套用循環(huán)語(yǔ)句輸出,其實(shí)說(shuō)這是最后也不太合適,這部其實(shí)是套在第三步和第二步之外的,也就是確定x軸顯示區(qū)間和曲線平滑度的作用。
'代碼
Private?Sub?Form_Load()
Me.AutoRedraw?=?True????????????'開(kāi)啟自動(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))??'畫(huà)起始點(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