分类: C/C++
2009-07-11 12:36:01
用VB制作李萨如图形动态演示程序[组图]
发布日期:2009年03月03日
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下调试通过。