在写代码之前,我们需要知道标准的正弦函数(以下称为sin函数),最大值是1,最小值是-1,几个关键点是0,±n*π/2,±n*π,而且它是周期性的,我们不可能让VB真的无限画下去,只需要在可见的窗体上绘制就行了。说sin的概念是为了确定坐标系,因为sin最大值也只有1,所以我们要放大它的值,以便显示最好的效果,如果不确定坐标系,可能画出来一条近似直线的波浪线。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站设计、网站建设、凤凰网络推广、小程序制作、凤凰网络营销、凤凰企业策划、凤凰品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供凤凰建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
首先,在Form_Load的事件里面写好坐标系,如果自己逻辑好这步确实可以不做,但是不做的结果就是需要写代码的人自己考虑偏移量,所以定好坐标系之后,写的函数就简单直观许多了。自定义坐标系的方法是:scale(x1,y1)-(x2,y2).
第二,开始写sin的函数,可以写在模块里面,也可以直接在窗体代码区写,写模块是为了以后调试方便,如果只是为了显示标准的sin函数,在窗体写也可以。定义几个双精度付典型的变量y,x ,函数关系是y=sin(x)
第三,绘制一个点,当然是sin上的点。第二步已经获得了x和y,正好是横坐标和纵坐标,我们为了让曲线平滑一些,可以Line方法,因为真的画点十分吃内存,比较卡,也就是我们画线不画点(很短很短的先近似于点),方法是Line (x1,y1)-(x2,y2)
最后,套用循环语句输出,其实说这是最后也不太合适,这部其实是套在第三步和第二步之外的,也就是确定x轴显示区间和曲线平滑度的作用。
'代码
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度,每一度画一个点,对应的创建一个下标从0到360的数组
Dim pointfs(360) As System.Drawing.PointF
'创建画笔,颜色为黑色,线宽为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图表控件,百度会出现微软网站的资料。
sin曲线永远是哪个样子,你是怎么变化?一般的移动,可以用offset控制向左平移,右边则增加点,看上去应该是在移动
VB系统的坐标原点在左上角,X轴的正方向是水平向右,而Y轴的正方向是垂直向下。所以,要绘制三角函数的曲线,自己可以通过改变点坐标的方法来实现,当然,VB.NET提供了相应的方法可以来实现坐标变换,也可以通过VB.Net的Graphics类提供的平移、旋转等转换来实现。
下面是我通过自己变换实现的示例,提供参考;我的环境是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
显示的效果图: