CorelDraw插件开发教程(3):随机与循环
Category:COREL插件CorelDraw插件开发教程(3):随机与循环
刘肖健
浙江工业大学 工业设计研究院
4. 随机与循环
编程的最大优势就是高效完成一些有规律的重复性工作。这节用一个案例来展示这种效率。
我们马上要编写的案例的功能是:在当前页面随机画100个圆。“随机”的意思是:1)圆心位置随机;2)圆半径随机;3)圆的填充色随机。
4.1 随机函数
先来认识一个VBA自带的随机函数。这个函数非常简单:
Rnd
它可以不带参数运行,运行结果是得到一个0~1之间的随机数。Rnd函数更具体的用法可以查阅VBA帮助文档。
Sub GenerateRndNumber ()
Dim c As Double
c = Rnd
MsgBox c
End Sub
上面子程序定义了一个实数c,然后生成一个0~1之间的随机数为c赋值,最后再用对话框把c的值显示出来看一看。由于函数Rnd每次运行生成的随机数都是不一样的,对话框上显示出来数也是每次都不同的:
如果我们想生成的随机数不是0~1之间,而是0~5之间,则代码改为:
Sub GenerateRndNumber ()
Dim c As Double
c = 5 * Rnd ‘ 生成0~5之间的随机数
MsgBox c
End Sub
如果想生成5~8之间的随机数,则代码改为:
Sub GenerateRndNumber ()
Dim c As Double
c = 5 + (8-5) * Rnd ‘ 生成5~8之间的随机数
MsgBox c
End Sub
不失一般性,如果想生成x~y之间的随机数,则代码改为:
Sub GenerateRndNumber ()
Dim c As Double
Dim x as Double, y As Double
x=14
y=21
c = x + (y-x) * Rnd ‘ 生成x~y之间的随机数
MsgBox c
End Sub
上述子程序会得到14~21之间的随机数。
4.2 循环
循环的作用是把一个动作重复做N次,但是有可能每次动作的内容都略有不同,就像我们要画N个圆,每个圆的位置、半径、色彩都不一样。
以下子程序会依次弹出对话框,显示1~10的平方根。
Sub SquareRoot()
Dim i As Integer
Dim c As Double
For i = 1 To 10 ‘循环开始
c = Sqr(i)
MsgBox i& “的平方根=” & c
Next ‘循环结束
End Sub
程序执行过程中会显示10次对话框,下面这个是第5次的显示结果:
For循环语句的用法和求根函数Sqr()的用法细节,请自行查阅VBA帮助文档。
4.3 画100个随机圆
画100个随机圆的子程序如下:
Sub Draw100Circles()
Dim i As Integer
Dim s1 As Shape
Dim x As Double, y As Double, r As Double
For i = 1 To 100
x =ActivePage.LeftX + Rnd * ActivePage.SizeWidth ‘圆心x坐标
y =ActivePage.BottomY + Rnd * ActivePage.SizeHeight ‘圆心y坐标
r = 0.02 *ActivePage.SizeWidth + Rnd * (0.08 * ActivePage.SizeWidth)
Set s1 =ActiveLayer.CreateEllipse2(x, y, r, r, 90#, 90#, False)
s1.Fill.UniformColor.RGBAssign Rnd * 255, Rnd * 255, Rnd * 255 ‘填色
Next
End Sub
循环里首先算出圆心坐标位置,赋给变量x和y;然后算出半径,赋给变量r;然后用x、y、r画圆;最后为圆随机填充RGB色。
上述代码的运行结果如下图所示:
代码的几处简要解释:
1)ActivePage.LeftX和ActivePage.BottomY为当前页面左边界的x坐标值和下边界的y坐标值,ActivePage.SizeWidth和ActivePage.SizeHeight为当前页面的宽度和高度。x和y的计算方法可以确保圆心在页面内。
2)半径r的值由两项组成:第一项是最小值,为0.02倍页宽,因为半径不能为零,否则会出错;第二项是增量,在0.08倍页宽范围内随机变动。因此r在0.02~0.1页面宽度之间随机变化。
3)填充色为RGB色;RGB的三个色彩分量在0~255之间变化,用Rnd*255可确保RGB空间的每一种色彩都有可能出现。Rnd是个函数,每次运行结果都不同,因此循环中最后一句里的三个Rnd*255的值是不一样的。
4)x、y、r都是数值变量,可以直接用等号赋值;s1为对象(Shape类型的对象),不能直接用等号,必须前面加Set关键字进行赋值(其实没什么区别)。相关的VB语法细节可以查阅帮助文档。
上图有些圆超出了页面边界,但它们的圆心仍在页面内。