用VB制作李萨如图形动态演示程序
1 引⾔
  李萨如图形是⼀个质点的运动轨迹[1],该质点在两个垂直⽅向的分运动都是简谐运动。李萨如图形是物理学的重要内容之⼀,在⼯程技术领域也有很重要的应⽤。利⽤李萨如图形可以测量未知振动的频率和初相位,掌握李萨如图形的形成过程有很重要的意义。因⽽动态显⽰李萨如可以深⼊理解其形成过程。
  2 李萨如图形的形成
  假定形成李萨如图形的两个简谐运动,⼀个在X轴上,⼀个在Y轴上,
  它们的运动⽅程为(假设它们的振幅相等):它们的合运动轨迹就是李萨如图形。为了能够形象地描述李萨如图形的形成过程,⼀般是把X轴和Y轴上的简谐运动分别⽤旋转⽮量图来描述,如图1所⽰。由上式计算出不同时刻的质点的坐标
(x,y),依次连接这些点,得到的图形就是李萨如图形。 
  图1 李萨如图形的形成过程
  3 李萨如图形动态演⽰的制作原理
  为了动态演⽰李萨如图形的形成过程,需要把描述两个简谐运动的旋转⽮量的运动过程和它们的合运动过程动态地画出来。
  具体的做法是:
  (1)画出描述X、Y⽅向简谐运动的旋转⽮量的参考图,分别由两条垂直的直线,⼀个圆构成;
  (2)通过计算,分别画出从圆⼼出发的代表X、Y⽅向简谐运动旋转⽮量位置的直线;
  (3)画出合运动的定位线,得到属于李萨如图形的点的坐标,如果是第⼀个点,则直接描点;否则与前⼀点相连,得到质点的运动轨迹;
  (4)擦去两个旋转⽮量和合运动定位线;
  (5)继续计算下⼀点的坐标,再回到第2步重复进⾏;
  (6)直到暂停或终⽌程序运⾏。
  按照以上的算法,⽤VB6.0编制程序[2, 3]。运⾏程序,发现在擦去合运动的定位线的同时,把X、Y⽅向简谐运动的旋转⽮量图和李萨如图形也擦去了⼀部分。例如图1中的A、B、C、D和E点等都被擦
去,经过⼀段时间以后,X、Y⽅向简谐运动的旋转⽮量图和李萨如图形都变成了虚线图,不再是⼀幅完整的图形。
  为了得到良好的视觉效果,应该使上述被擦掉的部分能够及时补画上。对于X、Y⽅向简谐运动的旋转⽮量图,由于它是由规则的直线和圆画出的,因⽽再次重画相应的直线和圆即可。⽽李萨如图形是不规则的,被擦去的点的坐标,当然可以通过计算的⽅法得到,但是从图1可以看出,这种计算是相当复杂的,因为在⼀般情况下,很难准确判断李萨如图形中被擦去的是哪些点。
  为了解决这个问题,笔者采取的办法是,在程序中引⼊两个数组,⽤这两个数组来依次记录计算得到的李萨如图形的点的坐标(x,y)值,在擦去合成线以后,再次根据数组中的数据重新绘画被损坏的图形。
  绘制李萨如图形的程序源码如下:
镇江旅游攻略必玩的景点  Private Sub Timer1_Timer()
  DrawWidth = 2
  '清除动画显⽰区域
  If i = 1 Then
  Line (Xxc - wid, Yyc - wid)-(Xxc + wid, Yyc + wid), BackColor, BF
  End If
  '擦去图形,形成动画效果
  Line (Xxc, Xyc)-(Xx, Xy), BackColor
体育锻炼的意义  Line (Yxc, Yyc)-(Yx, Yy), BackColor
  Line (Xx, Xy)-(Xx, Yy), BackColor
  Line (Yx, Yy)-(Xx, Yy), BackColor
  '画X⽅向的简谐振动的旋转⽮量图
  Line (Xxc - wid, Xyc)-(Xxc + wid, Xyc), RGB(255, 0, 0)  '画X轴
  Line (Xxc, Xyc - wid)-(Xxc, Xyc + wid), RGB(255, 0, 0)  '画Y轴
  Circle (Xxc, Xyc), A, RGB(255, 0, 0)  '画圆
  '画Y⽅向的简谐振动的旋转⽮量图
  Line (Yxc - wid, Yyc)-(Yxc + wid, Yyc), RGB(255, 0, 0)  '画X轴
  Line (Yxc, Yyc - wid)-(Yxc, Yyc + wid), RGB(255, 0, 0)  '画Y轴
  Circle (Yxc, Yyc), A, RGB(255, 0, 0)  '画圆
  '画李萨如图形的坐标轴
  Line (Xxc - wid, Yyc)-(Xxc + wid, Yyc), RGB(255, 0, 0)  '画X轴
  Line (Xxc, Yyc - wid)-(Xxc, Yyc + wid), RGB(255, 0, 0)  '画Y轴
  '计算相位
  If i = 1 Then  '初相位
古代女子最早是用什么画眉的  Xxw = Xchxw * pi / 180
  Yxw = Ychxw * pi / 180
  Else  't时刻相位
  Xxw = Xxw + 2 * Xpl * pi / 400
  Yxw = Yxw + 2 * Ypl * pi / 400
  End If
'画X轴的旋转⽮量
  Xx = Xxc + A * Cos(Xxw)
  Xy = Xyc - A * Sin(Xxw)
  Line (Xxc, Xyc)-(Xx, Xy), RGB(0, 0, 255)
  '画Y轴的旋转⽮量
  Yx = Yxc - A * Sin(Yxw)
  Yy = Yyc - A * Cos(Yxw)
  Line (Yxc, Yyc)-(Yx, Yy), RGB(0, 0, 255)
  '显⽰画图过程
  Line (Xx, Xy)-(Xx, Yy), RGB(0, 255, 0)
  Line (Yx, Yy)-(Xx, Yy), RGB(0, 255, 0)
  '李萨如图形坐标
  X(i) = Xx
  Y(i) = Yy
  '画李萨如图形
  If i = 1 Then
  PSet (Xx, Yy)
  Else
古代发髻图解
  DrawWidth = 1
  For j = 2 To i
  Line (X(j - 1), Y(j - 1))-(X(j), Y(j)), RGB(0, 0, 255)
  Next j
  End If
  i = i + 1
  If i > 900 Then i = 1
  End Sub
  4 程序的运⾏
天津小吃  图2是程序界⾯和程序运⾏时的情况。 
  图2  程序的运⾏结果
  笔者对程序进⾏了⼤量的调试。结果表明,⽤这种⽅法制作动画,程序简单,运⾏流畅,并且⽤此⽅法制作动态演⽰在编程上也易于实现。
  笔者在编制动态演⽰程序的时候,经常会遇到类似的情况,即动态演⽰过程中出现部分图形被擦除的现象。使⽤数组保存图形数据不失为制作此类动画演⽰程序的⼀种⽐较简单易⾏的⽅法。
  以上程序在Windows XP和VB6.0下调试通过。春青河畔草

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。