一个不使用图片的石英钟
  这个程序直接存为*.htm。本程序是一个Javascript作图类,不使用图片,
可以在客户端实时作图,这里提供了两个作图函数line,circle。作为应用
我制作了一个不使用图片的石英钟。注意不要把分辨率设的太高,不然影响
速度。这个类生成的图形为一个层,可以放置在任何位置,同时兼容NS和IE。
不过在制作这个石英钟的过程中,我发现NS的运算效率实在是太差了,只制
作了IE版。不过,其他地方还能用NS的,我保留了接口。

<html>
<head>
<title>Clock</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<script language="javascript">
// *****************************************************************
//          Written By Caocao
//          [email protected]
//          http://caocao.oso.com.cn
// *****************************************************************
function graph_set_size(width,height)
{
 this.width=width;
 this.height=height;
}
function graph_set_point(point)
{
 this.point=point;
}
function graph_set_back_color(color)
{
 this.back_color=color;
}
function graph_set_line_width(width)
{
 this.line_width=width;
}
function graph_line(start_x,start_y,end_x,end_y,color)
{
 if (Math.abs(start_x-end_x)>Math.abs(start_y-end_y))
 {
  if (start_x<end_x)
  {
   for (i=start_x;i<=end_x;i++)
   {
    if (i>=0&&i<=this.width)
    {
     this.data[Math.round(start_y+1.0*(i-start_x)*(end_y-start_y)/(end_x-start_x))*this.height+i]=color;
    }
   }
  }
  else
  {
   for (i=end_x;i<=start_x;i++)
   {
    if (i>=0&&i<=this.width)
    {
     this.data[Math.round(start_y+1.0*(i-start_x)*(end_y-start_y)/(end_x-start_x))*this.height+i]=color;
    }
   }
  }
 }
 else
 {
  if (start_y<end_y)
  {
   for (i=start_y;i<=end_y;i++)
   {
    if (i>=0&&i<=this.height)
    {
     this.data[i*this.height+Math.round(start_x+1.0*(i-start_y)*(end_x-start_x)/(end_y-start_y))]=color;
    }
   }
  }
  else
  {
   for (i=end_y;i<=start_y;i++)
   {
    if (i>=0&&i<=this.height)
    {
     this.data[i*this.height+Math.round(start_x+1.0*(i-start_y)*(end_x-start_x)/(end_y-start_y))]=color;
    }
   }
  }
 }
}
function graph_circle(center_x,center_y,radius,color)
{
 step=Math.atan(1.0/radius)/Math.PI*180;
 for (i=0;i<=360;i+=step)
 {
  this.data[Math.round(center_y+radius*Math.cos(i/180*Math.PI))*this.height+Math.round(center_x+radius*Math.sin(i/180*Math.PI))]=color;
 }
}
function graph_get_user_agent()
{
 return(this.user_agent);
}
function graph_move(x,y)
{
 eval(this.graph_layer).left=x;
 eval(this.graph_layer).top=y;
}
function graph_show()
{
 switch (this.user_agent)
 {
  case 3:eval(this.graph_layer).visibility="show";//NS4
      break;
  case 2:;//IE5
  case 1:eval(this.graph_layer).visibility="visible";//IE4
      break;
 }
}
function graph_hide(obj)
{
 switch (this.user_agent)
 {
  case 3:eval(this.graph_layer).visibility="hide";//NS4
      break;
  case 2:;//IE5
  case 1:eval(this.graph_layer).visibility="hidden";//IE4
      break;
 }
}
function graph_paint(x,y)
{
 txt="<table border=0 cellspacing=0 cellpadding=0>";
 for (i=0;i<this.width;i++)
 {
  txt+="<tr height="+this.point+">";
  for (j=0;j<this.height;j++)
  {
   txt+="<td width="+this.point+" height="+this.point+" bgcolor="+this.data[i*this.height+j]+"></td>";
  }
  txt+="</tr>";
 }
 txt+="</table>";
 
 switch (this.user_agent)
 {
  case 3:
      eval(this.graph_layer).document.write(txt);//NS4
      eval(this.graph_layer).document.close();
      this.show();
      break;
  case 2:;//IE5
  case 1:
      document.all["overDiv"].innerHTML=txt;//IE4
      this.show();
      break;
 }
 this.move(x,y);
}
function graph_init()
{
 if (document.layers)
 {
  this.user_agent=3;//NS4
  this.graph_layer=document.overDiv;
 }
 if (document.all)
 {
  if (navigator.userAgent.indexOf('MSIE 5')>0)
  {
   this.user_agent=1;//IE5
  }
  else
  {
   this.user_agent=2;//IE4
  }
  this.graph_layer=overDiv.style;
 }
 for (i=0;i<this.width;i++)
 {
  for (j=0;j<this.height;j++)
  {
   this.data[i*this.height+j]=this.back_color;
  }
 }
}
function graph(width,height,point,back_color)//graph类声明
{
 this.width=width;
 this.height=height;
 this.point=point;
 this.back_color=back_color;
 this.line_width=1;//暂时不用
 this.user_agent=1;
 this.graph_layer=0;
 this.data=new Array(width*height);
 this.set_size=graph_set_size;
 this.set_point=graph_set_point;
 this.set_line_width=graph_set_line_width;
 this.line=graph_line;
 this.circle=graph_circle;
 this.paint=graph_paint;
 this.init=graph_init;
 this.show=graph_show;
 this.hide=graph_hide;
 this.move=graph_move;
 this.get_user_agent=graph_get_user_agent;
}

</script>
</head>
<body bgcolor="#FFFFFF">
<DIV id=overDiv style="POSITION: absolute; Z-INDEX: 1"></DIV>
<script language="javascript">
function show()
{
 now=new Date();
 
 clock.line(20,20,20+second_x,20+second_y,"#FFFFFF");
 clock.line(20,20,20+minute_x,20+minute_y,"#FFFFFF");
 clock.line(20,20,20+hour_x,20+hour_y,"#FFFFFF");
 
 second_x=Math.round(18*Math.cos((now.getSeconds()*6-90)*Math.PI/180));
 second_y=Math.round(18*Math.sin((now.getSeconds()*6-90)*Math.PI/180));
 minute_x=Math.round(14*Math.cos((now.getMinutes()*6-90)*Math.PI/180));
 minute_y=Math.round(14*Math.sin((now.getMinutes()*6-90)*Math.PI/180));
 hour_x=Math.round(10*Math.cos((now.getHours()*30-90)*Math.PI/180));
 hour_y=Math.round(10*Math.sin((now.getHours()*30-90)*Math.PI/180));

 clock.line(20,20,20+second_x,20+second_y,"#FF0000");
 clock.line(20,20,20+minute_x,20+minute_y,"#000000");
 clock.line(20,20,20+hour_x,20+hour_y,"#000000");
 clock.paint(20,20);
 setTimeout("show()",0);
}
clock=new graph(40,40,1,"#FFFFFF");
clock.init();
clock.circle(20,20,19,"#000000");
second_x=0;
second_y=0;
minute_x=0;
minute_y=0;
hour_x=0;
hour_y=0;
show();
</script>
</body>
</html>