中华农历论坛知识讨论区历法知识 → 天文算法讨论


  共有125441人关注过本帖树形打印

主题:天文算法讨论

帅哥哟,离线,有人找我吗?
tjdr
  61楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:2 积分:272 威望:0 精华:0 注册:2010/2/27 16:30:00
  发帖心情 Post By:2010/2/28 14:52:00

希望许老师能整理成一部循序渐进的书,一点一点详细的讲,从理论到编程实现……

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
问天客
  62楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:52 积分:1608 威望:0 精华:0 注册:2009/8/11 9:52:00
  发帖心情 Post By:2010/3/1 14:01:00

寿星万年历的精度确实很高.它的朔望月精度在6000年里其误差只有半个小时左右.节气时刻误差在一个小时左右.实在是了不起啊。

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
JCSLX2000809
  63楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:1 积分:201 威望:0 精华:0 注册:2010/9/27 22:33:00
  发帖心情 Post By:2010/9/27 22:57:00

好啊。我刚来的,学了不少知识,谢谢!

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
春光
  64楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:894 积分:7235 威望:10 精华:1 注册:2005/3/17 11:37:00
  发帖心情 Post By:2010/9/28 16:10:00

欢迎您来到本版,请您多看一看精品的贴子。

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
美女呀,离线,留言给我吧!
wstyzc
  65楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:4 积分:414 威望:0 精华:0 注册:2011/1/27 10:22:00
  发帖心情 Post By:2011/1/27 10:36:00

许老师太伟大了 许老师太伟大了 许老师太伟大了 许老师太伟大了 许老师太伟大了 许老师太伟大了

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
秦汉昌
  66楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1467 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2011/2/24 12:52:00

求助:  许老师

你寿星万年历源码 eph0.js源码文件中“摩尔威特投影touY类”的方法toxy0 中用到的属性J0  是在哪里定义的呢?

呵呵,也许是我对JAVASCRIPT不熟悉,是不是不经定义的变量,第一次使用,其值为0呢?

 

 toxy0:function(J,W,a){ //平面正投
  J -= this.J0+pi_2; //图中的经度自西向东测量
  var x=Math.cos(W)*Math.cos(J), y=Math.cos(W)*Math.sin(J), z=Math.sin(W);
  a.x = x;
  a.y = this.cosE0*y + this.sinE0*z;
  a.z =-this.sinE0*y + this.cosE0*z;
 },


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
秦汉昌
  67楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1467 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2011/2/24 12:53:00

全部源码如下:

var touY={
 MollY:new Array(),
 MollCZ:function(W){ //插值法求摩尔威特投影的y值,W在正负pi_2之前
  var i,N=100,B=this.MollY, f=1;
  if(W<0) W = -W, f=-1;
  if(W>pi_2-1E-10) return f;

  if(!B.length){ //创建插值表,当N为100时,精度为10^-7,在于80度的高度纬区精度降为10^-6,88度为10^-5
    for(i=0;i<N;i++){
     var y0=0, y=i/100, c=pi_2*sin(y*pi_2);
     while(abs(y-y0)>1E-12){
      y0 = y;
      y += (c-asin(y))/sqrt(1-y*y);
      y /= 2;
     }
     B[i]=y;
    }
    B[N]=1;
  }

  var n = W/pi_2*N, k = int2(n+0.5);
  if(!k) k=1; if(k>=N) k=N-1;
  n -= k;
  var y2=B[k], a=y2-B[k-1], b=B[k+1]-y2;
  return f*( y2 +n*( a+b + n*(b-a) )/2 );
 },
 toxy0:function(J,W,a){ //平面正投
  J -= this.J0+pi_2; //图中的经度自西向东测量
  var x=Math.cos(W)*Math.cos(J), y=Math.cos(W)*Math.sin(J), z=Math.sin(W);
  a.x = x;
  a.y = this.cosE0*y + this.sinE0*z;
  a.z =-this.sinE0*y + this.cosE0*z;
 },
 toxy1:function(J,W,a){//斜轴等距方位投影
  J -= this.J0;
  var cosJ=Math.cos(J), sinJ=Math.sin(J);
  var cosW=Math.cos(W), sinW=Math.sin(W);
  var L = Math.atan2( this.sinE0*sinW - this.cosE0*cosW*cosJ, sinJ*cosW );
  var B = Math.acos ( this.cosE0*sinW + this.sinE0*cosW*cosJ  );

  a.x = a.y = 0, a.z=-1;
  if(B>Math.PI-0.1) return; //接近180度失真太大,不必计算
  B = B/Math.PI;
  a.x = B*cos(L), a.y = B*sin(L), a.z = 1;
 },
 toxy2:function(J,W,a){//斜轴等积方位投影
  J -= this.J0;
  var cosJ=Math.cos(J), sinJ=Math.sin(J);
  var cosW=Math.cos(W), sinW=Math.sin(W);
  var L = Math.atan2( this.sinE0*sinW - this.cosE0*cosW*cosJ, sinJ*cosW );
  var B = Math.acos ( this.cosE0*sinW + this.sinE0*cosW*cosJ  );

  a.x = a.y = 0, a.z=-1;
  if(B>Math.PI-0.1) return; //接近180度失真太大,不必计算
  B = Math.sin(B/2);
  a.x = B*cos(L), a.y = B*sin(L), a.z = 1;
 },
 toxy3:function(J,W,a){//斜轴等角方位投影
  J -= this.J0;
  var cosJ=Math.cos(J), sinJ=Math.sin(J);
  var cosW=Math.cos(W), sinW=Math.sin(W);
  var L = Math.atan2( this.sinE0*sinW - this.cosE0*cosW*cosJ, sinJ*cosW );
  var B = Math.acos ( this.cosE0*sinW + this.sinE0*cosW*cosJ  );

  a.x = a.y = 0, a.z=-1;
  if(B>Math.PI-1) return; //接近180度失真太大,不必计算
  B = Math.tan(B/2);
  a.x = B*Math.cos(L), a.y = B*Math.sin(L), a.z = 1;

 },
 toxy4:function(J,W,a){ //摩尔威特
  W = rad2rrad(W);
  J = rad2rrad(J-this.J0);
  a.y = this.MollCZ(W);
  a.x = Math.sqrt(1-a.y*a.y)*J*2/Math.PI;
  a.z = 1;
 },
 toxy5:function(J,W,a){ //正轴等距圆柱
  a.x=rad2rrad(J-this.J0)/Math.PI;
  a.y=rad2rrad(W)/Math.PI;
  a.z=1;
 },
 toxy6:function(J,W,a){ //正轴等角圆柱
  if(abs(W)>1.5) { a.x=a.y=0, a.z=-1; return; }
  var f = 1; if(W<0) f = -1;
  a.x = rad2rrad(J-this.J0)/Math.PI;
  a.y = Math.log( tan(pi2/8+abs(W)/2) ) / Math.PI*f;
  a.z=1;
 },
 toxy7:function(J,W,a){ //多圆锥
  J = rad2rrad(J-this.J0);
  var C = Math.cos(W); //纬线长度
  var v = Math.tan(W); //纬线曲率
  if(abs(W)>0.002){
   var s=C*J*v, l=1/v;
   a.x = l*Math.sin(s);
   a.y = W+l-l*Math.cos(s);
  }
  else a.x = J,  a.y = W+J*J*v/2;
  a.x/=Math.PI, a.y/=Math.PI, a.z=1;
 },
 toxy8:function(J,W,a){ //中国灯笼投影
  J = rad2rrad(J-this.J0);
  var C = Math.cos(W*2/3);     //纬线长度
  var v = Math.sin(W*2/3)/5.3; //纬线曲率
  J *= (1-abs(J)/11/Math.PI)*1.1;
  W  = (W+0.014830286*W*W*W)*1.2;
  if(Math.abs(W)>0.002){
   var s=C*J*v, l=1/v;
   a.x = l*Math.sin(s);
   a.y = W+l-l*Math.cos(s);
  }
  else a.x = J, a.y = W+J*J*v/2;
  a.x/=Math.PI, a.y/=Math.PI, a.z=1;
 },
 toxy:function(J,W,a){ a.x=J, a.y=W, a.z=1; },
 setlx:function(lx,J0,W0,jb){//设置类型, jb为局部显示参数
  this.tylx=lx, this.J0=J0, this.W0=W0;
  this.cosE0=sin(W0), this.sinE0=cos(W0);
  if(lx==0) this.toxy=this.toxy0;
  if(lx==1) this.toxy=this.toxy1;
  if(lx==2) this.toxy=this.toxy2;
  if(lx==3) this.toxy=this.toxy3;
  if(lx==4) this.toxy=this.toxy4;
  if(lx==5) this.toxy=this.toxy5;
  if(lx==6) this.toxy=this.toxy6;
  if(lx==7) this.toxy=this.toxy7;
  if(lx==8) this.toxy=this.toxy8;
  this.x1=jb[0]-jb[2], this.x2=jb[0]+jb[2];
  this.y1=jb[1]-jb[3], this.y2=jb[1]+jb[3];
 },
 lineArr:function(d){ //画曲线
   var p=new Array(), k=0;
   var i, h, G=new Object(); //h为线头标记
   var lx, ly, dd=0;         //某条线的最后一个画线点(lx,ly),dd为画线状态
   if(d[0]!=1e7) h=1;        //不以moveto开头的数组


   for(i=0; i<d.length; i++){
     if(d[i]==1e7) { h=1, dd=0; continue; } //新线开始,清除最后画点
     this.toxy(d[i],d[i+1],G);  i++; //在flash,这么写this.toxy(d[i++],d[i],G);不可正确运行

     if(G.x<this.x1||G.x>this.x2||G.y<this.y1||G.y>this.y2) G.z=-1;
     if(G.z<0) {//不显示的点
       if(dd%2==1) dd=2;
       continue;
     }
     if(dd%2==0) dd++, h=1;

     if(this.tylx==4){ //摩氏地图投影
       if(abs(lx-G.x)>1/3) h=1; //防止出现水平回扫线(地图被边界切割时会有此问题)
     }
     if(this.tylx==5||this.tylx==6){ //正轴等距或等角圆柱
       if(abs(lx-G.x)>1/3||abs(ly-G.y)>1/3) h=1; //防止出现水平回扫线
     }
     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) h=1; //防止出现水平回扫线
     }
     if(h) p[k++]=1e7, h=0;
     p[k++]=G.x, p[k++]=G.y;
     lx=G.x, ly=G.y;
   }
   return p;
 }
};


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
秦汉昌
  68楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1467 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2011/2/24 12:54:00

在JavaScript中能不能以“this.J0”的形式引用不存在的属性呢?

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
秦汉昌
  69楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1467 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2011/2/27 20:49:00

function schHXK(key){ //星库检索
 var i, s, n0,n1,n2,n3, r='';
 for(i=0;i<HXK.length;i++){ //遍历所有子库
   s = HXK[i];
   n0 = n1 = s.indexOf('#'); //记录开始位置
   while(1){
    n1 = s.indexOf(key,n1+1);     if(n1==-1) break; //按key查找
    n2 = s.indexOf('#',n1);     if(n3==-1) n2 = s.length; //该记录的结束位置
    n3 = s.lastIndexOf('#',n1); if(n2==-1) n3 = n0;       //该记录的开始位置
    r += s.substr(n3,n2-n3);
   }
 }
 for(i=0;i<xz88.length;i+=5){ //提取星座中心位置
  if(xz88[i].substr(3,3)==key){
    var a=xz88[i+2], b=xz88[i+3];
    a = a.substr(0,5) +' '+ (a.substr(6,2)*0.6).toFixed(1);
    b = b.substr(0,6) +' '+ (b.substr(7,2)*0.6).toFixed(1);
    r = '#*'+a+','+b+',0,0,0,0.0,中心'+xz88[i+1]+'方,'+xz88[i+4]+ r;
    break;
  }
 }
 return r;
}

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
秦汉昌
  70楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:业余侠客 帖子:372 积分:1467 威望:0 精华:0 注册:2008/12/20 18:10:00
  发帖心情 Post By:2011/2/27 21:05:00

这个循环结构 好像没有意义呢:

 

while(1){
    n1 = s.indexOf(key,n1+1);     if(n1==-1) break; //按key查找
    n2 = s.indexOf('#',n1);     if(n3==-1) n2 = s.length; //该记录的结束位置
    n3 = s.lastIndexOf('#',n1); if(n2==-1) n3 = n0;       //该记录的开始位置
    r += s.substr(n3,n2-n3);
   }

 

假如,第一次循环s.indexOf(key,n1+1)返回  key 在字串s中的 序号,即key在s中能找到

进下面的的条件判断,而下面的下条件判断中, if(n3==-1) n2 = s.length  上需要上次循环提供 的参数N3的值等于-1j时才能保证s.substr(n3,n2-n3)不是空串,如果一旦进入下次循环,n1就是key在s中的开始位置,而每次检索key时,都要在n1的基础上再加1作为开始检索位置,由于n1 经过一次能检索到key但只能获得空串r情况下,n1已经是key在s中的开始位位置了,再加1检索,就会因找不到key而退出循环,如此一来,如果不考虑外循环对参数的改变的话,本循环毫无意义。

这种设计的唯一可能情况就是,只有key在数组的两个项中都在存,但在第一项中检索只能改变n3的值,然后在搜索第二项时,由于n3的值已经得到改变,假如key也能在第二项中找到的话,那么才能得出一个不为空的r来.


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

天文算法讨论








签名