寿星的内核程序只能在 ActionScript2.0中调试通过,无法在ActionScript3.0中调试通过。因为3.0的语法要求与2.0相差较多,象C++一样比较严格,适合编译,所以目前只能在2.0中调试通过。目前eph.js和eph0.js可同时在IE和flash8.0中调试成功,flash9.0可能也可以,但没有调试。
本来不打算接入flash的,但考虑到flash的绘图和动画能力比vml好一些,所以还是加入了。
可惜flash的文字处理能力太弱,远不如html语言,加之本人flash的功力浅薄,如果没有更好的创意,就不打算在flash中做过多的事情。
在flash中,vml.js是不能被正确调用的,所以tu3物件改写为
//本程序在as2中运行
var tu3={
isInit:0, eR:250, x0:350, y0:300,
init:function(can){
},
P1:[0.1,0xA0A0A0,100], //地图
P2:[0.1,0xD0D0FF,100], //地图国界
P3:[0.1,0xE0E0E0,100], //经纬线
A: [0.1,0xF08080,100], //食界线1
B: [0.1,0x80F080,100], //食界线2
C: [0.1,0x8080F0,100], //晨昏圈
D: [0.1,0x000000,100], //影子界线
tylx:0, //地图投影的类型设置
lineArr:function(d,xian){ //画曲线
_root.lineStyle(xian[0], xian[1], xian[2])
var i, dz, G=new Object(); //dz动作
var ln=-1,lx,ly, dd=0; //某条线的最后一个画线点(ln,lx,ly),dd为画线状态
var x1=this.jb[0]-this.jb[2], x2=this.jb[0]+this.jb[2];
var y1=this.jb[1]-this.jb[3], y2=this.jb[1]+this.jb[3];
for(i=0; i<d.length; i+=2){
if(d[i]=='e') break;
if(d[i]=='m') {dz='m',dd=0; i--; continue;} //新线开始,清除最后画点
if(d[i]=='l') {dz='l'; i--; continue;}
if(d[0]!='m' && i<3){ //不以moveTo开头的数组
if(i==0) dz='m';
if(i==2) dz='l';
}
touY.toxy(d[i],d[i+1],G);
if(G.x<x1||G.x>x2||G.y<y1||G.y>y2) G.z=-1;
G.X=this.x0+this.eR*G.x;
G.Y=this.y0-this.eR*G.y;
if(G.z<0) {//不显示的点
if(dd%2==1) dd=2;
continue;
}
if(dd%2==0){
if(dz!='m') _root.moveTo(G.X,G.Y);
dd++,ln=-1;
}
if(this.tylx==4){ //摩氏地图投影
if(abs(lx-G.x)>1/3) //防止出现水平回扫线(地图被边界切割时会有此问题)
if(dz!='m') _root.moveTo(G.X,G.Y);
}
if(this.tylx==5||this.tylx==6){ //正轴等距或等角圆柱
if(abs(lx-G.x)>1/3||abs(ly-G.y)>1/3) //防止出现水平回扫线
if(dz!='m') _root.moveTo(G.X,G.Y);
}
if(this.tylx==7||this.tylx==8||this.tylx==9){ //多圆锥
var cy=abs(ly-G.y), cx=abs(lx-G.x);
if(cx>1/3 || abs(G.y)>1/2 && lx*G.x<0) //防止出现水平回扫线
if(dz!='m') _root.moveTo(G.X,G.Y);
}
if(dz=='m') _root.moveTo(G.X,G.Y);
else _root.lineTo(G.X,G.Y);
ln=i, lx=G.x, ly=G.y;
}
},
showDitu:function(n,m){//显示地图
this.lineArr(ditu1, this.P1);
this.lineArr(ditu2, this.P2);
var i,k, a=new Array(), N=96, pi=Math.PI; //N经纬圈描点的个数
for(k=0;k<m;k++){ //画纬圈
for(i=0,f=0;i<=N;i++) a[2*i] = i*pi2/N, a[2*i+1] = (k+1)*pi/(m+1)-pi_2;
this.lineArr(a,this.P3);
}
for(k=0;k<n;k++){ //画经圈
for(i=0,f=0;i<=N;i++) a[2*i] = k*pi2/n, a[2*i+1] = i*pi/N-pi_2;
this.lineArr(a,this.P3);
}
},
lineNN:function(p1,n1,p2,n2, A){ //连接p1中的n1到p2中的n2
if(!p1.length||!p2.length) return;
if(n1==-1) n1=p1.length-2;
if(n2==-1) n2=p2.length-2;
this.lineArr( [ p1[n1],p1[n1+1], p2[n2],p2[n2+1] ], A ); //p1与p2两线头部连接
},
draw:function(F, J0,W0, eR, jb, tylx){ //jb局部放大参数
this.eR=eR, this.tylx=tylx, this.jb=jb;
touY.setlx(tylx,J0,W0);
_root.clear();
this.showDitu(24,11);
var n, A=this.A, B=this.B, C=this.C, D=this.D;
this.lineArr( F.p1, A ); //初亏复圆线1,二次方程第1根
this.lineArr( F.p2, A ); //初亏复圆线1,二次方程第2根
this.lineArr( F.p3, A ); //初亏复圆线2,二次方程第1根
this.lineArr( F.p4, A ); //初亏复圆线2,二次方程第2根
n = F.p1.length-2;
this.lineNN( F.p1,0, F.p2,0, A ); //p1与p2两线头部连接
this.lineNN( F.p1,n, F.p2,n, A ); //p1与p2两线尾部连接
n = F.p3.length-2;
this.lineNN( F.p3,0, F.p4,0, A ); //p3与p4两线头部连接
this.lineNN( F.p3,n, F.p4,n, A ); //p3与p4两线尾部连接
this.lineArr( F.q1, A ); //日出日没食甚线线1,第1根
this.lineArr( F.q2, A ); //日出日没食甚线线1,第2根
this.lineArr( F.q3, A ); //日出日没食甚线线2,第1根
this.lineArr( F.q4, A ); //日出日没食甚线线2,第1根
if(F.q1.length&&F.q2.length&&F.q3.length&&F.q4.length){
this.lineNN( F.q1, 0, F.q2, 0, A ); //补接头
this.lineNN( F.q3,-1, F.q4,-1, A ); //补接尾
}
this.lineArr( F.L0, A ); //中心线
this.lineArr( F.L1, A ); //半影北界
this.lineArr( F.L2, A ); //半影南界
this.lineArr( F.L3, A ); //本影北界(或伪本影南界)
this.lineArr( F.L4, A ); //本影南界(或伪本影北界)
this.lineArr( F.L5, B ); //0.5半影北界
this.lineArr( F.L6, B ); //0.5半影南界
this.isDrawed=1;
},
draw2:function(F){
if(!this.isDrawed) {alert('底图未画,无法显示.'); return;}
var C=this.C, D=this.D;
this.lineArr( F.p3, C ); //晨昏圈
this.lineArr( F.p1, D ); //本影
this.lineArr( F.p2, D ); //半影
}
};
tu3物件的使用方法与index.htm调用tu3的方法是一样的。如果flash爱好者,利用eph.js与eph0.js就可以制作出精确的日食计算器了。我的flash水平看来还有等于提高。