用程序绘制美丽的花
软件世界
前言:花以它独具的自然美使人赏心悦目,在生活中往往被人们当作理想、希望、幸福的象征。生活中有了花就有了灵气,程序中若也能“开”出几朵简单的花来,那该有多好。
本文介绍的程序不仅能绘出形状各异的花朵,而且还可以用静态、动态和旋转三种不同的方式来呈现。文中的花都是依托数学公式中描述的曲线来绘制的,在给大家带来美的感受的同时,也可以让大家直观地感受到数学公式中各个参数对结果的影响。用程序来实现这样的数学曲线,结合循环和Timer的应用,代码简单,运行高效。
一、公式带来的灵感
数学中有三叶玫瑰线(方程为ρ=ASin(3β)、四叶玫瑰线(方程为ρ=ASin(2β)等曲线,这些曲线的极坐标方程很简单,基本形式均为:ρ=ASin(nβ),即任意一点的极半径ρ是角度β的函数;其直角坐标方程为:x=ASin(nβ)Cos(β),y =ASin(nβ)Sin(β)。
在程序中控制角度β使其从0变化到2π,描出极半径ρ所对应的点,这样就可以绘出漂亮的玫瑰线;当然,n不同所描出的曲线的形状也就不同。
出于好奇,笔者编写了一些方程,如:ρ=A[Sin(nβ)+3Sin(3nβ)]、ρ=ASin(nβ)exp(-kβ)等等,结果发现每种方程都能用程序绘出形状各异的漂亮曲线。今介绍其中的几种曲线的实现方法,暂命名为:玫瑰线、玫瑰环、万寿菊、大丽花、蓬蒿菊、令箭荷花。
二、程序实现
1.算法简介
如果在某事件中用循环控制角度β使其从0变化到2π,则绘出的花是静态的。如果在计时器事件中每次让β增加一定的值,并画出对应的线段,则绘出的花是动态的。如果在计时器事件中加一个时间因子,即方程变为:x=ASin(nβ)Cos(β+t),y =ASin(nβ)Sin(β+t);不断改变t的值,并对每一个t绘出β从0到2π所对应的图形,则绘出的花就会旋转起来。
2.界面设计
启动VB6.0,添加如下控件:用于选择花型的组合框Combo1(将前面的六种花名作为列表项)、用于选择效果的组合框Combo2(列表内容依次为:静态、动态和旋转)、用于改变n的滚动条HScroll1、用于显示n的标签Label1、用于绘制动态效果的计时器Timer1、用于绘制旋转效果的计时器Timer2,界面如图所示。
3.编写代码
Dim k%, n!, Xo!, Yo!, A!, B!, t!, m!
Sub Draw(Optional t As Single = 0)
If k = 3 Then '大丽花
r = A * Sin(n * B) * Exp(-B / 20)
ElseIf k Mod 3 = 2 Then '万寿菊和令箭荷花
r = A * (Sin(n * B) + 3 * Sin(3 * n * B))
Else '玫瑰线、玫瑰环、蓬蒿菊
r = A * Sin(n * B)
End If
x = r * Cos(B + t) '极坐标的直角坐标
y = r * Sin(B + t)
If k <= 3 Then '从端点画线:空心
Me.Line -(Xo + x, Yo + y)
Else '从窗口中心画线:实心
Me.Line (Xo, Yo)-(Xo + x, Yo + y)
End If
End Sub
Private Sub Form_Load()
Me.Move 0, 0, Screen.Width, Screen.Height
Combo2.ListIndex = 2 '默认效果为静态
Combo1.ListIndex = 0 '默认花型为玫瑰线
End Sub
Private Sub Combo1_Click() '变换花型
HScroll1.Min = IIf(Combo1.ListIndex = 1, 15, 1)
HScroll1.Max = IIf(Combo1.ListIndex = 1, 49, 10)
HScroll1.Value = IIf(Combo1.ListIndex = 1, 31, 10)
HScroll1_Change
End Sub
Private Sub Combo2_Click() '变换效果
HScroll1_Change
End Sub
Private Sub HScroll1_Change()
Xo = Me.ScaleWidth / 2 '窗口中心位置
Yo = Me.ScaleHeight / 2
k = Combo1.ListIndex
n = HScroll1 / IIf(k = 1, 10, 1)
Label1.Caption = “N=” & n
A = Yo * IIf(k Mod 3 = 2, 0.25, 0.75) '方程中的A
m = IIf(k = 3, 6, IIf(k = 1, 10 / n, 1))
t = 0: B = 0
Me.Cls
Me.ForeColor = QBColor(Rnd * 6 + 9)
Me.PSet (Xo, Yo), vbBlack '将绘图点置于窗口中心
Timer1.Enabled = False
Timer2.Enabled = False
Select Case Combo2.ListIndex
Case 0 '静态
For B = 0 To 6.28 * m Step 0.01
Draw '每次画一部分
Next B '循环结束后画出完整花型
Case 1 '动态
Timer1.Enabled = True
Case 2 '旋转
Timer2.Enabled = True
End Select
End Sub
Private Sub Timer1_Timer() '动态
B = B + 0.01 '不断变换角度
Draw '每次画一部分
End Sub
Private Sub Timer2_Timer() '旋转
t = t + 0.02 '时间因子
Me.Cls '清除前一次绘出的花型
Me.PSet (Xo, Yo) '将绘图点先置于窗口中心
For B = 0 To 6.28 * m Step 0.01
Draw t '每次画一部分
Next B '循环结束后画出完整花型
End Sub
三、小结
程序运行时,组合框和滚动条的不同组合可产生出近百种不同形状的花型,细心的读者可以一一去试;感兴趣的话还可以自己编写一些类似的方程,加在本文的代码中,相信有更多奇异的花朵在向你召唤。本期程序和代码下载地址:http://www.cpcw.com/42/game.rar。
编后:作者用一些数学公式的曲线来描绘美丽的花朵,虽不见得是多么独特的想法,但程序运行的结果却可以让我们深深感受理性和感性融合的力量,如果说数学中也有美的话,那么这样的呈现方式无疑是简单、直观而有趣的。另外,将本文中花的运行窗口设为全屏幕,就可以得到一个很简单的屏幕保护程序了。

