自制Windows的变幻线

Windows下的经典荧屏保护程序——变幻线,我想大家必定都不陌生吧。它不仅起到保护爱机屏幕的作用,还给人以美感。这里将它的算法简单地向大家剖析一下,让大家对它的底细有个了解。
  #1 算法原理:
   中学物理课光学部分的镜面反射大家应该还有印象吧(如图)?((图1))变幻线的最基本的算法正是光学反射定律。不过它不是用光线反射,而是用光球(更确切说是光点)。打开变幻线屏保预览,仔细观察它的多边形的每一个顶点(盯着一个顶点看),这样会很容易发现它的运动规律就是反射定律。

图1
图1

   算法有了,我们开始编写程序,为了让大家更容易理解一些和表达的方便,本文采用QuiCk BASIC 45编写。
  #1 源程序:
   DECLARE SUB poly(n!, C!)
   CONST num= 40,numofcornet=4,co=12,delay=500
   'num为屏幕上同时存在的Polygon数
   'numofcorner为多边形顶点数
   ’co为所绘多边形的颜色
   'delay为延迟交量,根据机器配置不同可以适当改变
   DIM SHARED corner(1 TO num,1 TO numofcorner, 1 TO 2)
   '存储多边形顶点表
   DIM speed(1 TO numoforner,1 TO 2)
   '存储各个顶点运动速度表
   RANDOMIZE TIMER
   '初始化随机变量
   FOR i=1 TO numofcorner
   '初始化多边形顶点表
   corner(l,i,1)=INT(RND*640)
   cornerf(l,i,2)=INT(RND* 480)
   NEXT i
   FOR i= 1 TO numofcorner
   '初始化各个顶点运动速度表
   speed(i,l)=INT(RND*5)+3
   speed(i,2)=INT(RND*5)+3
   NEXT i
   CLS:SCREEN 12'640*480*16色图形模式
   FOR i= 2 TO num
   FOR j=1 TO numofcorner
   IF corner(i -1,j,l)+speed(j,l)< 0 OR corner(i -l,j,1)+ speed(j,l)> 639 THEN speed(j,l)=-speed(j,1)
   corner(i,j,1)=corner(i -1,j,1)+ speed(j,l)
   IF corner(i -1,j,2)+speed(j,2)< 0 OR corner(i -l,j,2)-speed(j.2)> 479 THEN speed(j,2)=-speed(j,2)
   corner(i,j,2)= corner(i -l,j,2)+ speed(j,2)
   NEXT j
   Poly i,CO
   NEXT i
   p=numofcorner
   DO WHILE INKEY$=””
   lastp = p
   p=p十1
   IF P>num THEN p=1
   poly p,0 '擦掉最先一个多边形
   FOR i=1 TO numofcorner
   IF corner(lastp,i,l)+ speed(i,1)<0 OR corner(lastp,i,l)+speed(i,l)>639 THEN speed(i,l)=-speed(i,l)
   corner(p,i,1)=corner(lastp,i,1)+speed(i,l)
   IF corner(lastp,i,2)+speed(i,2<0 OR corner(lastp,i,2)+ speed(i,2)>479 THEN speed(i,2)=-speed(i,2)
   corner(p,i, 2)=corner(lastp,i,2)+speed(i,2)
   NEXT i
   Poly P,co'画上最后一个多边形
   FOR i=1 TO delay:NEXT i '延迟语句
   LOOP
   SUB Poly(n,c)
   PSET(corner(n,numofcorner,l),corner(n,numofcorner,2))
   FOR i=1 TO numofcorner
   LINE -(corner(n,i,1),corner(n,i,2)),c
   NEXT i
   END SUB
   这样,一个简单的变幻线程序就完成了。兴趣的朋友还可以自己加入控制随时间变化颜色或者多个变幻线同时运作的机制。呵呵,侃侃自己做的屏幕保护程序是不是很酷,很有成感啊?!