程序绘制美丽的花
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
程序绘制美丽的花 马致明 新疆师范大学数理信息学院 花以其独具的自然美使人赏心悦目,因此也就成了真、善、美的化身,理想、希望、幸福的象征!生活中有了花就有了灵气,程序中若能“开”出花来,那就多了几份神奇!本文介绍的这段程序不仅能绘出形状各异的花朵,而且还可以用静态、动态和旋转三种不同的效果呈现。 一、基本思想 数学中有三叶玫瑰线(方程为ρ=Asin(3β)、四叶玫瑰线(方程为ρ=Asin(2β)等曲线,这些曲线的极坐标方程很简单,基本形式均为:ρ=Asin(nβ),即任意一点的极半径ρ是角度β的函数;其直角坐标方程为:x=Asin(nβ)cos(β),y =Asin(nβ)sin(β)。 在程序中控制角度β使其从0变化到2π,描出极半径ρ所对应的点,这样就可以绘出漂亮的玫瑰线;当然,n不同所描出的曲线的形状也就不同。 出于好奇,笔者又编写了一些方程,如:ρ=A[sin(nβ)+3 sin(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 三.运行 程序运行时,组合框和滚动条的不同组合可产生出近百种不同形状的花型,细心的读者可以一一去试;感兴趣的话还可以自己编写一些类似的方程,加在本文的代码中,相信有更多奇异的花朵在向你召唤。 本文来源:https://www.wddqw.com/doc/d997e41e964bcf84b9d57be5.html