图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
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。