第7章绘图方法

Download Report

Transcript 第7章绘图方法

第7章 绘图方法
1
台州学院计算机系
本章内容
7.1 坐标系统
7.1.1 坐标刻度
7.1.2 自定义坐标系
7.2 绘图属性
7.2.1当前坐标
7.2.2使用颜色
7.3绘图方法
7.3.1画点方法Pset
7.3.2画线、矩形方法Line6.4 滚动条
7.3.3画圆、圆弧和椭圆方法Circle
7.4绘图应用实例
2
台州学院计算机系
7.1 坐标系统
在Visual Basic中,容器都有一个自己默认
的坐标系,坐标系中的坐标原点在容器里
的左上角,X轴向右为正、Y轴向下为正,
如图7-1所示窗体容器的默认坐标系。
(0,0)
X
Y
3
台州学院计算机系
7.1.1坐标刻度
在Visual Basic中,容器的默认坐标系其缺省的坐标刻度
是Twip(缇)。我们在程序设计中,也可以使用其它的刻
度单位如:磅和毫米等等。这些可通过设置容器的
ScaleMode属性进行选择改变坐标系统的刻度单位。其
ScaleMode的属性值如表7-1所示。
4
台州学院计算机系
7.1.2自定义坐标系
1.自定义坐标系的Scale方法
格式:[容器名.]Scale [(x1,y1)-(x2,y2)]
功能:定义容器(缺省容器名指窗体)左上角的
坐标为(x1,y1),右下角的坐标值为(x2,y2)。
例如:用下列语句是在图片框控件中设置自己的
坐标系,且图片框左上角的坐标为(-2,1),
右下角的坐标是(2,-1),则原点在图片框中
心。
Picture1.Scale (-2 * 3.14, 1)-(2 * 3.14, -1)
使用无参数的Scale方法(如“容器名.Scale”),
则可以使该容器的坐标还原为系统默认的坐标系。
5
台州学院计算机系
2.使用属性自定义坐标系
除了用Scale方法自定义坐标系外,也可以使用如下四个容器类对象
的属性来定义坐标系,效果一样。
ScaleLeft:容器左上角的横坐标,缺省值为0。
ScaleTop:容器左上角的纵坐标,缺省值为0。
ScaleWidth:容器自身的宽度值。
ScaleHeight:容器自身的高度值。
若容器左上角的坐标为(x1,y1),右下角的坐标值为(x2,y2),则:
[容器名.]ScaleLeft=x1
[容器名.]ScaleTop=y1
[容器名.]ScaleWidth=x2-x1
[容器名.]ScaleHeight=y2-y1
故上述例子也可这样来自定义坐标系:
Picture1.ScaleLeft = -2 * 3.14
Picture1.ScaleTop = 1
Picture1.ScaleWidth = 4 * 3.14
Picture1.ScaleHeight = -2
6
台州学院计算机系
7.2.1当前坐标
当前坐标是指在坐标系中的当前位置。在容器的某一特定位置要输出
一结果时,就要用到当前坐标。与当前坐标有关的两个属性:
CurrentX属性:当前点在容器内的横坐标(数值类型)。
CurrentY属性:当前点在容器内的纵坐标(数值类型)。
在设置CurrentX、CurrentY属性后,所设值就是下一个输出方法的当
前位置。
如执行下列程序,则在图片框的中心输出“0”。
Private Sub Picture1_Click()
Picture1.Scale (-2 * 3.14, 1)-(2 * 3.14, -1)
Picture1.CurrentX = 0
Picture1.CurrentY = 0
Picture1.Print "0"
End Sub
在使用Cls方法后,CurrentX、CurrentY属性值为0。
7
台州学院计算机系
7.2.2使用颜色
在使用图形方法绘图时要使用不同的颜色,Visual Basic
中使用的颜色用一个长整型数(通常用16进制)表示,如
&HFFFF00&。其数值由3部分组成:右边的两位(16进
制数,下同)代表红色的值,中间的两位代表绿色的值,
左边的两位代表蓝色的值。
每个值都可以取0到255之间的数值,因此共有256的立方
种不同的颜色取值。
一是在设计阶段,可以通过在对象的属性窗口中选择需要
设置的颜色属性,用打开的“调色板”对话框进行颜色设
置。
二是程序运行运行阶段,可以使用颜色函数、使用系统预
定义好的颜色常量、直接赋值或使用通用对话框中的“颜
色”对话框来选取颜色。
8
台州学院计算机系
7.2.2使用颜色
1.颜色函数
Visual Basic提供了两个专门处理颜色的函数:RGB和
QBColor。
(1)RGB函数
格式:RGB(Red,Green,Blue)
其中:Red、Green、Blue分别代表红色的值,绿色的值
和蓝色的值。取值范围都是0到255。
例如:语句Form1.BackColor = RGB(255,255,0),用来将
窗体Form1的背景色设置为黄色。
RGB函数采用红、绿、蓝三色原理,返回一个Long整数,
用来表示一个颜色值。表7-2列出了一些常见的颜色以及
这些颜色的三色值。
9
台州学院计算机系
7.2.2使用颜色
10
台州学院计算机系
7.2.2使用颜色
2.颜色常量
颜色常量是在Visual Basic系统内部预定义好的常
量,程序设计时可以不需要声明就可以直接使用。
如:Form1.BackColor = vbYellow
Visual Basic定义的常用颜色常量如表7-4所示。
11
台州学院计算机系
7.2.2使用颜色
3.直接赋值
如果知道具体的颜色值,也可以直接给颜色属性赋值。
例如:语句Form1.BackColor=&HFFFF00&,也是将窗体的背景色设置为黄
色。
7.2.3线宽和线型
1.线宽
DrawWidth属性:用以设置点的大小或线的宽度。以像素为单位,最小值为1。
2.线型
DrawStyle属性:设置所画线的形状。
7.2.4填充
在绘图中,如果图形是封闭的,就可以进行填充,与填充有关的两个属性。
1.填充图案
FillStyle属性:设置填充的图案样式,可取值0~7之间。
2.填充颜色
FillColor属性:设置填充的颜色。
12
台州学院计算机系
7.3.1画点方法Pset
Pset方法用于在对象的指定位置用某一颜
色画点。
格式:[容器名.]Pset [step](x,y)[,颜色]
其中:(x,y)为画点的坐标。[step]表示用当
前画点位置的相对值。[颜色]为画点的颜色
值,缺省为用容器对象的前景色
(ForeColor)画点。该方法所画点的大小,
取决于容器对象的DrawWidth属性值。
13
台州学院计算机系
7.3.1画点方法Pset
【例7-1】单击窗体,用Pset方法画出[-2,
2]上的正弦曲线和余弦曲线。
14
台州学院计算机系
7.3.1画点方法Pset
【例7-1】单击窗体,用Pset方法画出[-2,2]上
的正弦曲线和余弦曲线。
分析:
(1)由于正弦曲线和余弦曲线的取值都在-1和1
之间,且要求画出[-2,2]区间上的,因此可以
先用Scale方法定义坐标系,使窗体对象的左上角
坐标为[-2,1],而右下角的坐标为[2,-1],然
后再用Pset方法画出该坐标系。
(2)单击窗体时,根据x从[-2,2]的不断取值,
用y=sin(x)和y=cos(x)求出y,然后在(x,y)点用
Pset画出即可(用循环实现)。
15
台州学院计算机系
依据以上分析,可得程序代码如下:
Const pi = 3.1416
Private Sub Form_click()
Dim x As Single
For x = -2 * pi To 2 * pi Step 0.01
Form1.PSet (x, Sin(x)), vbBlue
Form1.PSet (x, Cos(x)), vbRed
Next x
End Sub
Private Sub Form_Load()
Dim x As Single, y As Single
Form1.Scale (-2 * pi, 1)-(2 * pi, -1)
For x = -2 * pi To 2 * pi Step 0.01
Form1.PSet (x, 0)
Next x
For y = -1 To 1 Step 0.001
Form1.PSet (0, y)
Next y
Form1.CurrentX = 0.1
Form1.CurrentY = -0.01
Print "0"
End Sub
16
台州学院计算机系
【例7-2】将图片框Picture1中图像复制到
图片框Picture2,要求保持色彩、纵横比例
不变。
17
台州学院计算机系
分析:
(1)当程序运行时,图片框Picture1中已加载图
像,且“复制”按钮能用,“结束”按钮不能用。
其运行界面如图7-3所示。
图7-3图像复制运行界面
(2)当单击“复制”按钮后,Picture1中的图像
按要求保持色彩、纵横比例不变后复制到
Picture2,同时“复制”按钮不能用,“结束”
按钮可用;单击“结束”退出程序。
依据以上分析,可得程序代码如下:
18
台州学院计算机系
依据以上分析,可得程序代码如下:
Private Sub Command1_Click()
Dim i As Integer, j As Integer, x As Integer, y As Integer
Dim c As Long
For i = 1 To Picture1.ScaleWidth
For j = 1 To Picture1.ScaleHeight
c = Picture1.Point(i, j)
x = Picture2.ScaleWidth * i / Picture1.ScaleWidth
y = Picture2.ScaleHeight * j / Picture1.ScaleHeight
Picture2.PSet (x, y), c
Next j
Next i
Command1.Enabled = False
Command2.Enabled = True
End Sub
Private Sub Command2_Click()
End
End Sub
19
台州学院计算机系
7.3.2画线、矩形方法Line
Line方法用于在指定对象上画直线和矩形。
格式:[容器名.]Line [[step](x1,y1)][step](x2,y2)[,颜色][,B[F]]
其中:容器可以是窗体、图片框等,缺省
为窗体。(x1,y1)为直线的起点坐标或矩形
的左上角坐标,(x2,y2)为直线的终点坐标
或矩形的右下角坐标。B为画矩形。F为填
充的矩形,F必须和B一起使用。
20
台州学院计算机系
如例7-1中的画坐标系是用画点来完成的,
现已经有了Line来画线,则可改为简单的如
下代码:
Private Sub Form_Load()
Form1.Scale (-2 * pi, 1)-(2 * pi, -1)
Form1.Line (-2 * pi, 0)-(2 * pi, 0)
Form1.Line (0, 1)-(0, -1)
Form1.CurrentX = 0.1
Form1.CurrentY = -0.01
Print "0"
End Sub
21
台州学院计算机系
例如,执行下列程序,在窗体上输出结果如图7-4所示。
Private Sub Form_Click()
Form1.FillStyle = 2
Form1.FillColor = vbBlue
Form1.ForeColor = vbGreen
Line (100, 100)-(1500, 1000), vbRed, B '红色外框,
蓝色水平填充线
Line (1600, 100)-(2500, 1000), ,B
'绿色外框,蓝
色水平填充线
Line (2800, 100)-(3800, 1000), vbRed, BF '红色实心
矩形
End Sub
22
台州学院计算机系
7.3.3画圆、圆弧和椭圆方法Circle
Circle方法用于在指定对象上画圆、椭圆、圆弧和
扇形。
格式:[容器名.] Circle [ [Step] (x,y),半径[,颜色][,
起始角][,终止角][,长短轴比率]]]
其中:(x,y)为圆心坐标。关键字Step表示采用当
前作图位置的相对值。圆弧和扇形通过参数起始
角,终止角控制。当起始角、终止角取值在0~2
时为圆弧,当在起始角、终止角取值前加一负号
时,画出扇形,负号表示画圆心到圆弧的径向线。
椭圆通过长短轴比率控制,默认值为1,画圆。
23
台州学院计算机系
【例7-3】单击窗体后,画一系列圆心在窗
体中心,半径随机,且窗体所能容纳的同
心圆。运行后如图7-5所示。
24
台州学院计算机系
分析:
(1)根据题意每一个圆的圆心固定在窗体中心,
即(x,y)确定;画的圆要在窗体内,则要求判断
窗体的高度和宽度的大小,然后,半径是最小者
的一半;同时画出的圆颜色是各不相同的,是随
机的,则可用到Rnd。画这样一个圆可用一个过
程来完成。
(2)单击窗体后,要画一系列这样的圆,则可在
一个循环中调用过程就可以了。
25
台州学院计算机系
依据以上分析,可得程序代码如下:
Public Sub circledemo()
Dim r As Integer,g As Integer,b As Integer
Dim r1 As Single
r = Int(Rnd * 255)
g = Int(Rnd * 255)
b = Int(Rnd * 255)
If Form1.ScaleHeight < Form1.ScaleWidth Then
r1 = Rnd * Form1.ScaleHeight / 2
Else
r1 = Rnd * Form1.ScaleWidth / 2
End If
x = Form1.ScaleWidth / 2
y = Form1.ScaleHeight / 2
Form1.Circle (x, y), r1, RGB(r, g, b)
End Sub
Private Sub Form_Click()
Dim i As Integer
Form1.Cls
For i = 1 To 10000
Call circledemo
Next i
End Sub
26
台州学院计算机系
【例7-4】在窗体上画出1个红、绿、蓝各
占1/3的圆饼图,如图7-6所示。
27
台州学院计算机系
分析:
(1)根据题意,可以先建立一个坐标系,让写程
序时更直观,如把窗体的横坐标方向向右,纵坐
标方向向上,原点在窗体中心,且整个横坐标为
10个单位,纵坐标为8个单位。这样半径假设为2
就行了。
(2)每次用Circle画1/3个圆弧,且在画之前要先
设置填充样式和填充颜色,同时还要连接圆弧和
圆心的线,即在起始角、终止角前加负号。
28
台州学院计算机系
依据以上分析,可得程序代码如下:
Const pi = 3.14156
Private Sub Form_Click()
Dim x As Integer,y As Integer
Form1.Scale (-5, 3)-(5, -3)
x=0
y=0
Form1.FillStyle = 0
Form1.FillColor = vbRed
Form1.Circle (x, y), 2, , -2 * pi, -2 * pi / 3
Form1.FillColor = vbGreen
Form1.Circle (x, y), 2, , -2 * pi / 3, -4 * pi / 3
Form1.FillColor = vbBlue
Form1.Circle (x, y), 2, , -4 * pi / 3, -2 * pi
End Sub
29
台州学院计算机系
【例7-5】在图片框中画一个如图7-7所示的
圆桶。
30
台州学院计算机系
分析:
(1)根据题意,可以先建立一个坐标系,让写程
序时更直观,如把图片框的横坐标方向向右,纵
坐标方向向上,原点在窗体中心,且整个横坐标
为16个单位,纵坐标为20个单位。这样假设椭圆
长轴为8,长短轴比率3/5就行了。
(2)然后从最底下的椭圆开始,用蓝色线条画到
最上面的椭圆。最后在最上面画一个用白色填充
了的椭圆。
31
台州学院计算机系
依据以上分析,可得程序代码如下:
Private Sub Form_Click()
Dim r As Single,y As Single,y1 As Single,y2 As Single
Picture1.Scale (-8, 10)-(8, -10)
r=8
y1 = -r * 3 / 5
y2 = 10 - r * 3 / 5
For y = y1 To y2 Step 0.01
Picture1.Circle (0, y), r, vbBlue, , , 3 / 5
Next y
Picture1.FillColor = vbWhite
Picture1.FillStyle = 0
Picture1.Circle (0, y), r, , , , 3 / 5
End Sub
32
台州学院计算机系
【例7-6】编程,如图7-8所示,输入不同的
抛物线方程y=ax2+bx+c的三个系数a,b,
c,在窗体上画出相应的抛物线。
33
台州学院计算机系
分析:
(1)根据题意,可以先建立一个坐标系,如把图
片框的横坐标方向向右,纵坐标方向向上,原点
在窗体中心,且整个横坐标为20个单位,纵坐标
为20个单位,且用Line方法画出坐标轴。同时建
立三个文本框用于输入a,b,c的值。
(2)单击“画抛物线”按钮,根据a,b,c输入
的值,在图片框中用Pset方法画出该抛物线。
34
台州学院计算机系
Private Sub Form_Load()
'定义坐标系
Picture1.Scale (-10, 10)-(10, -10)
'画x坐标轴
Picture1.Line (-10, 0)-(10, 0)
Picture1.Line (9, 0.3)-(10, 0)
Picture1.Line (9, -0.3)-(10, 0)
Picture1.CurrentX = 9
Picture1.CurrentY = 0
Picture1.Print "x"
'画y坐标轴
Picture1.Line (0, -10)-(0, 10)
Picture1.Line (-0.3, 9)-(0, 10)
Picture1.Line (0.3, 9)-(0, 10)
Picture1.CurrentX = 0.4
Picture1.CurrentY = 10
Picture1.Print "y"
'画原点
Picture1.CurrentX = 0.3
Picture1.CurrentY = 0
Picture1.Print "0"
End Sub
Private Sub Command1_Click()
Dim a As Single, b As Single, c As Single
Dim x As Single,y As Single
Picture1.Cls
Form_Load
'输入三个系数
a = Val(Text1.Text)
b = Val(Text2.Text)
c = Val(Text3.Text)
'画抛物线
For x = -5 To 5 Step 0.001
y=a*x*x+b*x+c
Picture1.PSet (x, y), vbBlue
Next x
End Sub
35
台州学院计算机系
【例7-7】以1幅图为背景,设计程序显示
地球围绕太阳转动的画面,如图7-9所示。
36
台州学院计算机系
分析:
(1)根据题意,加入背景图片,可以先建立一个坐标系,
把窗体的横坐标方向向右,纵坐标方向向上,原点在窗体
中心,且整个横坐标为4000个单位,纵坐标为2000个单
位。
(2)当单击窗体时,画出一个太阳,同时画出地球的运
行轨道,同时启动定时器。设置DrawMode为7是用于在
相同的位置绘制相同的图形时,可以擦除原图。
(3)设置一个静态变量flag控制在两个时间段内在同一位
置重复画地球,当flag为True时,改变地球在运行轨道上
的圆心角,地球的运行轨道椭圆方程为:
X=rx*cos(alfa)
Y= ry*sin(alfa)
其中rx为椭圆x轴上半径,ry为椭圆y轴上半径,alfa为圆心
角。
37
台州学院计算机系
Private Sub Form_Click()
Form1.Scale (-2000, 1000)-(2000, -1000)
Form1.FillStyle = 0
Form1.FillColor = vbRed
Form1.Circle (0, 0), 200, vbRed
Form1.FillStyle = 1
Form1.Circle (0, 0), 1600, vbBlue, , , 0.5
Form1.DrawMode = 7
Form1.FillStyle = 0
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Static alfa As single, flag As Boolean
Dim x As Single,y As single
flag = Not flag
If flag Then
alfa = alfa + 0.314
End If
If alfa > 6.28 Then
alfa = 0
End If
x = 1600 * Cos(alfa)
y = 800 * Sin(alfa)
Form1.Circle (x, y), 80
End Sub
38
台州学院计算机系