用程序绘制美丽的花

软件世界

  前言:花以它独具的自然美使人赏心悦目,在生活中往往被人们当作理想、希望、幸福的象征。生活中有了花就有了灵气,程序中若也能“开”出几朵简单的花来,那该有多好。

  本文介绍的程序不仅能绘出形状各异的花朵,而且还可以用静态、动态和旋转三种不同的方式来呈现。文中的花都是依托数学公式中描述的曲线来绘制的,在给大家带来美的感受的同时,也可以让大家直观地感受到数学公式中各个参数对结果的影响。用程序来实现这样的数学曲线,结合循环和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。

  编后:作者用一些数学公式的曲线来描绘美丽的花朵,虽不见得是多么独特的想法,但程序运行的结果却可以让我们深深感受理性和感性融合的力量,如果说数学中也有美的话,那么这样的呈现方式无疑是简单、直观而有趣的。另外,将本文中花的运行窗口设为全屏幕,就可以得到一个很简单的屏幕保护程序了。