注册会员 登录
Project1 返回首页

汪汪的个人空间 https://rpg.blue/?171386 [收藏] [复制] [分享] [RSS]

日志

【翻译+运用】寿星天文历 脚本 转 rmxp 脚本 及 简易日历

已有 74 次阅读2015-5-8 22:20 |个人分类:脚本·修改·整合·胡编| 日历

=begin
原脚本:寿星天文历
原作者: 许剑伟(福建莆田第十中学)
原作者关于版权问题的声明:

本程序是开源的,你可以使用其中的任意部分代码,但不得随意修改“天文算法(eph.js)”及“农历算法(lunar.js)中古历部分的数据及算法”。一旦修改可能影响万年历的准确性,如果你对天文学不太了解而仅凭对历法的热情,请不要对此做任何修改,以免弄巧成拙。

如果在你自己开发的软件中使用了本程序的核心算法及数据,你可以在你的软件中申明“数据或算法来源于寿星天文历”,也可以不申明,但不可以申明为它其它来源。如有异义,可与我共内探讨。

特别感谢中华农历网浪淘沙等人帮助我调试软件,作为天文历法,有幸结识这么多同好,一生难忘。

作者:许剑伟,2008年11月于家里。[email protected],13850262218


翻译:汪汪
说明:因为喜欢农历,又喜欢rmxp,所以特地把寿星天文历的部分内容翻译为rmxp脚本,目前功能比较简陋。只能计算二十四节气和朔月,以及农历月的大小关系,简易日历,可以显示干支,星期。
未来有可能会继续翻译其他功能。
=end
#==============================================================================
# ■ Lifa
#------------------------------------------------------------------------------
#  处理历法的类。
#   jqtest(y) 节气  ding_suo(y, arc=0) 月朔   pai_yue(y) 排月 
#==============================================================================
module Lifa
  
 module_function

  #--------------------------------------------------------------------------
  # ● 计算years年1月1日和yeare年1月1日之间的天数,
  #   包括years年1月1日,但是不包括yeare年1月1日
  #--------------------------------------------------------------------------
  def calc_years_days(years,yeare)
    if years > year
      i=yeare;yeare=years;years=i
    end
    days = 0
    for i in years...yeare
      next if i == 0
      if is_leap_year(i)
        days += 366
      else
        days += 365
      end
    end
    return days
  end
  #--------------------------------------------------------------------------
  # ● 判断是否是闰年 # year 正常年记法
  #--------------------------------------------------------------------------
  def is_leap_year(year,ts=0)
    year += 1 if year < 0     
    if year >= 3200 and ts != 0
      return true if year % 172800 == 0
      return false if year % 3200 == 0
      return true if year % 400 ==0
      return false if year % 100 == 0
      return true if year % 4 == 0 
      return false
    elsif year >= 1582 
      return true if year % 400 ==0
      return false if year % 100 == 0
      return true if year % 4 == 0 
      return false
    elsif year < 1582
      return true if year % 4 == 0 
      return false
    end
  end
  
  #--------------------------------------------------------------------------
  # ● 某年某月的天数 
  #--------------------------------------------------------------------------
  def days_of_month(year,month)
    year = -1  if year == 0  #转成 year 正常年记法
    if is_leap_year(year)
      monthday= [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    else
      monthday= [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    end
    days = monthday[month-1]
    days -=10 if (year==1582 and month == 10)
    return days
  end
  #--------------------------------------------------------------------------
  # ● 两年之间的距离  #正常纪年法
  #--------------------------------------------------------------------------
  def calc_years(ys,ye)
    if ys>ye
      i=ye;ye=ys;ys=i
    end
    if ye*ys>=0
      years=ye-ys
    else
      years= ye-ys -1
    end
    return years
  end
  
  #--------------------------------------------------------------------------
  # ● 判断两个日期的大小关系 
  #--------------------------------------------------------------------------
  def ae_days(ys,ms,ds,ye,me,de)
     ys=-1 if ys==0
     ye=-1 if ye==0                #标准纪年
    if ys<ye or (ys==ye and ms<me) or (ys==ye and ms==me and ds<de)
      return 1
    elsif ys==ye and ms==me and ds=de
      return 0
    else
      return -1
    end
    
  end
  
  #--------------------------------------------------------------------------
  # ● 计算一年中过去的天数,包括指定的这一天
  #--------------------------------------------------------------------------
  def calc_year_passed_days(year,month,day)
    day = 5   if year==1582 and month==10 and day >= 5 and day <15
    day -=10  if year==1582 and month==10 and day >= 15
    passed_days = 0
    for i in 1...month
     passed_days += days_of_month(year,i)
    end
     passed_days += day
    return passed_days
  end
  
  #--------------------------------------------------------------------------
  # ● 计算一年中还剩下的天数,不包括指定的这一天
  #--------------------------------------------------------------------------
  def calc_year_rest_days(year,month,day)
    day = 5   if year==1582 and month==10 and day >= 5 and day <15
    day -=10  if year==1582 and month==10 and day >= 15
    left_days = days_of_month(year,month) - day
    for i in month + 1..12
      left_days += days_of_month(year,i)
    end
    return left_days
  end
  
  #--------------------------------------------------------------------------
  # ● 计算日期相差天数
  #--------------------------------------------------------------------------
  def calc_days(ys,ms,ds,ye,me,de)
    ys=-1 if ys==0
    ye=-1 if ye==0    #   标准纪年
    case ae_days(ys,ms,ds,ye,me,de)
    when -1  
      i=ye;ye=ys;ys=i
      i=me;me=ms;ms=i
      i=de;de=ds;ds=i
    when 0 
      return 0
    end
    days = calc_year_rest_days(ys, ms, ds)
    if ys != ye  #/*不是同一年的日期*/
      if calc_years(ys,ye) >= 2 #*间隔超过一年,要计算间隔的整年时间*/
        days += calc_years_days(ys+1,ye)
      end
       days += calc_year_passed_days(ye, me, de)
    else
        days = days - calc_year_rest_days(ye, me, de)
    end
    return days
  end  
  
  #--------------------------------------------------------------------------
  # ● 计算日期在本年内的编号,1月1日为 0
  #--------------------------------------------------------------------------
  def day_year_id(year,month,day)
    id= calc_days(year,1,1,year,month,day).truncate
    return id
  end
  
  #--------------------------------------------------------------------------
  # ● 判断是否是何种历法
  #--------------------------------------------------------------------------
  def is_lf(year,month,day)
    year = -1 if year == 0
    return 1 if year > 1582 or
    (year ==1582 and month >10) or
    (year ==1582 and month ==10 and day >= 15)
    return -1 if year < 1582 or
    (year ==1582 and month <10) or
    (year ==1582 and month ==10 and day < 5)
    return 0
  end 
  #--------------------------------------------------------------------------
  # ● 由日期计算 修正儒略日
  #--------------------------------------------------------------------------
  def day_bzr(year, month,day,h=0,m=0,s=0)
    year +=1 if year < 0
    day = 15 if is_lf(year, month, day) == 0
    if month <= 2
      month += 12
      year -= 1
    end
    a = (year/100).truncate
    b = 2 - a + (a/4).truncate 
    b= 0 if is_lf(year, month, day) == -1
    k=(365.25*(year+4716)).truncate+(30.6001*(month+1)).truncate
    jd = k + day + b - 1524 
    t =  time_day(h,m,s)
    jd += t
    return jd
  end
  #--------------------------------------------------------------------------
  # ● 由日期计算儒略日
  #--------------------------------------------------------------------------
  def day_jd(year, month,day,h=0,m=0,s=0)
    year +=1 if year < 0
    day = 15 if is_lf(year, month, day) == 0
    if month <= 2
      month += 12
      year -= 1
    end
    a = (year/100).truncate
    b = 2 - a + (a/4).truncate 
    b= 0 if is_lf(year, month, day) == -1
    k=(365.25*(year+4716)).truncate+(30.6001*(month+1)).truncate
    jd = k + day + b - 1524.5 
    t =  time_day(h,m,s)
    jd += t
    return jd
  end
  
  #--------------------------------------------------------------------------
  # ● 由儒略日计算日期
  #--------------------------------------------------------------------------
  def jd_day(jd ,isjd=true)
    jd += 0.5 if isjd==true
    z= jd.truncate 
    f= jd-jd.truncate
    if z < 2299161
      a = z
    elsif z >= 2299161
      x= ((z-1867216.25)/36524.25).truncate
      a=z+1+x-(x / 4 ).truncate
    end
    b = a+1524
    c = ((b-122.1)/365.25).truncate 
    d = (365.25*c).truncate 
    e = ((b-d)/30.6001).truncate 
    day = b - d - (30.6001*e).truncate# + f 
    month = e - 1 if  e < 14 
    month = e - 13 if e==14 or e==15 
    year = c - 4716  if month>2 
    year = c - 4715 if month ==1 or month==2
    t=day_time(f)
    return year,month,day,t[0],t[1],t[2]
  end
  #--------------------------------------------------------------------------
  # ● 计算某一天是星期几
  #--------------------------------------------------------------------------
  def is_week(year,month,day)
    jd = day_jd(year,month,day)
    jd+=1.5
    w=(jd%7).truncate
    return w
  end
  
  #--------------------------------------------------------------------------
  # ● 时分秒变成天(小数)
  #--------------------------------------------------------------------------
  def time_day(h,m,s)
    if h<0
      m=-m.abs
      s=-s.abs
    end
    
    day =(h*60*60+m*60+s)/(24*60*60.0)
    return day
  end
  
  #--------------------------------------------------------------------------
  # ● 读取天(小数)的时分秒
  #--------------------------------------------------------------------------
  def day_time(d)
    f=d-d.truncate
    f=f*24.000001 
    h=f.truncate
    f-=h
    f*=60.000001
    m=f.truncate
    f-=m
    f*=60.000001
    s=f.truncate
    return h,m,s
  end

  #--------------------------------------------------------------------------
  # ● 计算世界时与原子时之差,传入年,得到秒
  #--------------------------------------------------------------------------
  def deltatt(y) 
    i = 0
    while i <100      
      break if (y < dts[i + 5] or i == 95) 
      i += 5        
    end
    t1 = (y - dts[i]) / (dts[i + 5] - dts[i]) * 10;
    t2 = t1 * t1;
    t3 = t2 * t1;
    t =dts[i + 1] + dts[i + 2] * t1 + dts[i + 3] * t2 + dts[i + 4] * t3
    return t
  end
  #--------------------------------------------------------------------------
  # ● 
  #--------------------------------------------------------------------------
  def deltatt2(jd)
    year = jd_day(jd+jd_2000)[0]
    t = deltatt(year) / 86400.0
    return  t
  end
  #--------------------------------------------------------------------------
  # ● 返回黄赤交角(常规精度),短期精度很高
  #--------------------------------------------------------------------------
  def hcjj1(t) 
    t1 = t / 36525
    t2 = t1 * t1
    t3 = t2 * t1
    i=(hcjjB[0] + hcjjB[1]*t1+ hcjjB[2] * t2 + hcjjB[3] * t3) / n_rad
    return i
  end
  #--------------------------------------------------------------------------
  # ● 黄赤转换(黄赤坐标旋转)
  #--------------------------------------------------------------------------
  # 黄道赤道坐标变换,赤到黄E取负
  def hcconv(jw,e) 
    hj = rad2mrad(jw[0])
    hw = jw[1]
    sine = Math.sin(e)
    cose = Math.cos(e)
    sinw = cose * Math.sin(hw) + sine * Math.cos(hw) * Math.sin(hj)
    j = Math.atan2(Math.sin(hj) * cose - Math.tan(hw) * sine, Math.cos(hj));
    jw[0] = rad2mrad(j)
    jw[1] = Math.asin(sinw)
    return jw
  end
  #--------------------------------------------------------------------------
  # ● 补岁差
  #--------------------------------------------------------------------------
   def add_prece(jd, zb) 
     t = 1
     v = 0
     t1 = jd / 365250
     for i in 1...8
       t *= t1
       v += preceB[i] * t
     end
     zb[0] = rad2mrad(zb[0] + (v + 2.9965 * t1) / n_rad)
     return zb
   end
  #--------------------------------------------------------------------------
  # ● 对超过0-2PI的角度转为0-2PI
  #--------------------------------------------------------------------------
  def rad2mrad(v) 
    v = v % (2 * Math::PI)
    return v + 2 * Math::PI if v < 0
    return v
  end
  #--------------------------------------------------------------------------
  # ● 儒略日转变为j2000儒略日
  #--------------------------------------------------------------------------
  def jd2000(jd)
      jd -= jd_2000
    return jd
  end
  
  #--------------------------------------------------------------------------
  # ● J2000儒略日转变为当地时间
  #--------------------------------------------------------------------------

  def j2_dutc(jd,shiqu = 8 )
    u = jd + 0.5 + shiqu / 24.0  - deltatt2(jd) +jd_2000
    utc=jd_day(u,false)
    return utc
  end
  #--------------------------------------------------------------------------
  # ● 恒星周年光行差计算(黄道坐标中)
  #--------------------------------------------------------------------------
  def add_gxc( t,  zb) 
    t1 = t / 36525.0 
    t2 = t1 * t1 
    t3 = t2 * t1 
    t4 = t3 * t1 
    l = gxc_l[0] + gxc_l[1] * t1 + gxc_l[2] * t2 + 
        gxc_l[3] * t3 + gxc_l[4] * t4
    p = gxc_p[0] + gxc_p[1] * t1 + gxc_p[2] * t2
    e = gxc_e[0] + gxc_e[1] * t1 + gxc_e[2] * t2
    dl = l - zb[0]
    dp = p - zb[0]
    zb[0] -= gxc_k * (Math.cos(dl) - e * Math.cos(dp)) / Math.cos(zb[1]) 
    zb[1] -= gxc_k * Math.sin(zb[1]) * (Math.sin(dl) - e * Math.sin(dp)) 
    zb[0] = rad2mrad(zb[0])
    return zb
  end
  #--------------------------------------------------------------------------
  # ● 计算黄经章动及交角章动
  #--------------------------------------------------------------------------
  def nutation(t) 
    d=[]
    d[0]=0
    d[1]= 0
    t= t/36525.0 
    t1 = t
    t2 = t1 * t1
    t3 = t2 * t1 
    t4 = t3 * t1 # t5=t4*t1 
    i = 0 
    while i < nutB.length
      c = nutB[i] + nutB[i + 1] * t1 + nutB[i + 2] * t2 + nutB[i + 3]*
      t3 + nutB[i + 4] * t4 
      # 黄经章动
      d[0] += (nutB[i + 5] + nutB[i + 6] * t / 10) * Math.sin(c) 
      # 交角章动
      d[1]+= (nutB[i + 7] + nutB[i + 8] * t / 10) * Math.cos(c)
      i += 9
    end
    # 黄经章动
    d[0] /= n_rad * 10000
    # 交角章动
    d[1]/= n_rad * 10000 
    return d
  end
  #--------------------------------------------------------------------------
  # ●  本函数计算赤经章动及赤纬章动
  #--------------------------------------------------------------------------
  def  nutation_radec(t, zb) 
    ra = zb[0], dec = zb[1] 
    e = hcjj1(t), 
    sine = Math.sin(e)
    # 计算黄赤交角
    cose = Math.cos(e)  
    # 计算黄经章动及交角章动
    d = nutation(t)  
    cosra = Math.cos(ra)
    sinra = Math.sin(ra) 
    tandec = Math.tan(dec) 
    zb[0] += (cose + sine * sinra * tandec) * d[0]- cosra * tandec * d[1]
    # 赤经章动 赤纬章动
    zb[1] += sine * cosra * d[0]+ sinra * d[1] 
    zb[0] = rad2mrad(zb[0])
    return zb
  end
  #--------------------------------------------------------------------------
  # ●  日位置计算
  #--------------------------------------------------------------------------
   # 计算E10,E11,E20等,即:某一组周期项或泊松项算出,计算前先设置EnnT时间
  def enn(f,ennt) 
    v = 0 
    i= 0
    while i < f.length 
      v += f[i] * Math.cos(f[i + 1] + ennt * f[i + 2])
      i += 3
    end
    return v
  end
  # 返回地球位置,日心Date黄道分点坐标
  def ear_cal(jd) 
    ennt = jd / 365250.0 
    r = []
    t1 = ennt
    t2 = t1 * t1
    t3 = t2 * t1
    t4 = t3 * t1
    t5 = t4 * t1
    r[0] = enn(e10,ennt) + enn(e11,ennt) * t1 + enn(e12,ennt) * t2 + 
    enn(e13,ennt) * t3 + enn(e14,ennt) * t4 + enn(e15,ennt) * t5 
    r[1] = enn(e20,ennt) + enn(e21,ennt) * t1 
    r[2] = enn(e30,ennt) + enn(e31,ennt) * t1 + enn(e32,ennt) * t2 + enn(e33,ennt) * t3 
    r[0] = rad2mrad(r[0]) 
    return r 
  end
  # 传回jd时刻太阳的地心视黄经及黄纬
  def sun_cal2(jd) 
    sun = ear_cal(jd)
    sun[0] += Math::PI 
    sun[1] = -sun[1] # 计算太阳真位置
    d = nutation(jd) 
    sun[0] = rad2mrad(sun[0] + d[0])  # 补章动
    sun = add_gxc(jd, sun)  # 补周年黄经光行差
    return sun  # 返回太阳视位置
  end
  

  
  
  
  
  
  #--------------------------------------------------------------------------
  # ●  月位置计算
  #--------------------------------------------------------------------------
  # 计算M10,M11,@m30等,计算前先设置MnnT时间
  def mnn(f,mnnt) 
    v = 0
    t1 = mnnt
    t2 = t1 * t1
    t3 = t2 * t1
    t4 = t3 * t1 
    i = 0
    while i < f.length 
      v += f[i] * Math.sin(f[i + 1] + t1 * f[i + 2] + t2 * f[i + 3] + t3*
      f[i + 4] + t4 * f[i + 5])
      i += 6
    end
    return v
  end
  # 返回月球位置,返回地心Date黄道坐标
  def moon_cal(jd) 
    mnnt = jd / 36525.0
    t1 = mnnt 
    t2 = t1 * t1
    t3 = t2 * t1 
    t4 = t3 * t1
    r = []
    r[0] = (mnn(m10,mnnt) + mnn(m11,mnnt) * t1 + mnn(m12,mnnt) * t2) / n_rad
    r[1] = (mnn(m20,mnnt) + mnn(m21,mnnt) * t1) / n_rad
    r[2] = (mnn(m30,mnnt) + mnn(m31,mnnt) * t1) * 0.999999949827
    r[0] = r[0] + m1n[0] + m1n[1] * t1 + m1n[2] * t2 +
            m1n[3] * t3+ m1n[4] * t4
    r[0] = rad2mrad(r[0]) # 地心Date黄道原点坐标(不含岁差)
    r = add_prece(jd, r) # 补岁差
    return r
  end
   
  # 传回月球的地心视黄经及视黄纬
  def moon_cal2(jd) 
    moon = moon_cal(jd)
    d = nutation(jd)
    moon[0] = rad2mrad(moon[0] + d[0]) # 补章动
    return moon
  end
  # 传回月球的地心视赤经及视赤纬
  def moon_cal3( jd) 
    moon = moon_cal(jd)
    moon = hcconv(moon, hcjj1(jd))
    moon = nutation_radec(jd, moon) # 补赤经及赤纬章动
    # 如果黄赤转换前补了黄经章动及交章动,就不能再补赤经赤纬章动
    return moon
  end
  #--------------------------------------------------------------------------
  # ●  地心坐标中的日月位置计算
  #--------------------------------------------------------------------------
  # x=1时计算t时刻日月角距与jiao的差, x=0计算t时刻太阳黄经与jiao的差
  def jiao_cai(x, t, jiao) 
    sun = ear_cal(t) # 计算太阳真位置(先算出日心坐标中地球的位置)
    sun[0] += Math::PI
    sun[1] = -sun[1] # 转为地心坐标
    sun =add_gxc(t, sun) # 补周年光行差
    if x == 0 
      d = nutation(t)
      sun[0] += d[0]# 补黄经章动
      return rad2mrad(jiao - sun[0])
    end
    moon = moon_cal(t)  # 日月角差与章动无关
    return rad2mrad(jiao - (moon[0] - sun[0])) 
  end
  
  #--------------------------------------------------------------------------
  # ● 已知位置反求时间 
  #--------------------------------------------------------------------------
  # t1是J2000起算儒略日数
  # 已知角度(jiao)求时间(t)
  # x=0是太阳黄经达某角度的时刻计算(用于节气计算)
  # x=1是日月角距达某角度的时刻计算(用于定朔望等)
  # 传入的t1是指定角度对应真时刻t的前一些天
  # 对于节气计算,应满足t在t1到t1+360天之间,对于Y年第n个节气(n=0是春分),
  #   t1可取值Y*365.2422+n*15.2
  # 对于朔望计算,应满足t在t1到t1+25天之间,在此范围之外,求右边的根
  #--------------------------------------------------------------------------
  def jiao_cal(t1, jiao, x) 
    t2 = t1
    t = 0
    if x == 0
      t2 += 360  # 在t1到t2范围内求解(范气360天范围),结果置于t
    else
      t2 += 25 
    end
    jiao *= Math::PI / 180.0  # 待搜索目标角
    # 利用截弦法计算
    #  v1,v2为t1,t2时对应的黄经
    v1 = jiao_cai(x, t1, jiao)    
    v2 = jiao_cai(x, t2, jiao) 
    # 减2pi作用是将周期性角度转为连续角度
    v2 -= 2 * Math::PI if (v1 < v2)     
    # k是截弦的斜率
    k = 1         
    # 快速截弦求根,通常截弦三四次就已达所需精度                   
    for i in 0...10                
      # 算出斜率
      k2 = (v2 - v1) / (t2 - t1)                
      k = k2 if (k2).abs > 1e-15
      # 差商可能为零,应排除                               
      t = t1 - v1 / k 
      # 直线逼近法求根(直线方程的根)
      v = jiao_cai(x, t, jiao)
      v -= 2 * Math::PI if v > 1
      # 一次逼近后,v1就已接近0,如果很大,则应减1周
      # 已达精度
      break if (v).abs < 1e-8  
      t1 = t2 
      v1 = v2 
      t2 = t 
      v2 = v  
      # 下一次截弦
    end
    return t 
  end
  #--------------------------------------------------------------------------
  # ● 节气使计算范例,y是年分,这是个测试函数
  #--------------------------------------------------------------------------
   # 计算第i个节气(i=0是春分),结果转为北京时##
  def jqtest(y)
    jd = day_jd(y,1,1) -jd_2000 #365.2422 * (y - 2000) 
    s=[]
    for  i in 0...24
      q = jiao_cal(jd + i * 15.2, i * 15, 0)
      q -= deltatt2(q)
      q += jd_2000  + 8.0/24.0 
      s.push(q)
    end
    return s
  end
  

  #--------------------------------------------------------------------------
  # ● 定朔弦望计算范例,y是年分,这是个测试函数
  #--------------------------------------------------------------------------
  def ding_suo(y, arc=0)   
    jd =  day_jd(y,1,1) -jd_2000 #+ 0.5#  (365.2422 * (y - 2000)).truncate 
    s=[]
    for  i in  0...14
      q = jiao_cal(jd + 29.5 * i, arc, 1)  
      q -= deltatt2(q)
      q += jd_2000 + 8.0 / 24.0
      s.push(jd_day(q))
    end
    return s
  end
  
  #--------------------------------------------------------------------------
  # ● 农历计算
  #--------------------------------------------------------------------------
=begin 
  * 1.冬至所在的UTC日期保存在A[0],根据"规定1"得知在A[0]之前(含A[0])的那个UTC朔
  日定为年首日期
  * 冬至之后的中气分保存在A[1],A[2],A[3]...A[13],其中A[12]又回到了冬至,共计算
  13次中气
  * 2.连续计算冬至后14个朔日,即起算时间时A[0]+1 14个朔日编号为0,1...12,保存在
  C[0],C[1]...C[13]
  * 这14个朔日表示编号为0月,1月,...12月0月的各月终止日期,但要注意实际终止日是
  新月初一,不属本月
  * 这14个朔日同样表示编号为1月,2月...的开始日期
  * 设某月编号为n,那么开始日期为C[n-1],结束日期为C[n],如果每月都含中气,该月所
  含的中气为A[n]
  * 注:为了全总计算出13个月的大小月情况,须算出14个朔日。 3.闰年判断:含有13个月
  的年份是闰年 当第13月(月编号12月)终止日期大于冬至日,
  * 即C[12]〉A[12], 那么该月是新年,本年没月12月,本年共12个月
  * 当第13月(月编号12月)终止日期小等于冬至日,即C[12]≤A[12],那么该月是本年的有
  效月份,本年共13个月 4.闰年中处理闰月:
  * 13个月中至少1个月份无中气,首个无中气的月置闰,在n=1...12月中找到闰月,即
  C[n]≤A[n]
  * 从农历年首的定义知道,0月一定含有中气冬至,所以不可能是闰月。 首月有时很贪
  心,除冬至外还可能再吃掉本年或前年的另一个中气
  * 定出闰月后,该月及以后的月编号减1 5.以上所述的月编号不是日常生活中说的"正
  月","二月"等月名称:
  * 如果"建子",0月为首月,如果"建寅",2月的月名"正月",3月是"二月",其余类推
  #--------------------------------------------------------------------------
=end
  #--------------------------------------------------------------------------
  # ● jd转到当地UTC后,UTC日数的整数部分或小数部分
  #--------------------------------------------------------------------------
   #基于J2000力学时jd的起算点是12:00:00时,所以跳日时刻发生在12:00:00,这与日历计
   #算发生矛盾
   #把jd改正为00:00:00起算,这样儒略日的跳日动作就与日期的跳日同步
   #改正方法为jd=jd+0.5-deltatT+shiqu/24
   #把儒略日的起点移动-0.5(即前移12小时)
   #式中shiqu是时区,北京的起算点是-8小时,shiqu取8
  def dint_dec(jd, shiqu, dec ) 
    u = jd + 0.5 + shiqu / 24.0  - deltatt2(jd) #+ jds
    if dec == true
      return (u).truncate; # 返回整数部分
    else
      return u - (u).truncate # 返回小数部分
    end
  end
  
  #--------------------------------------------------------------------------
  # ● 农历排月序计算,可定出农历
  #--------------------------------------------------------------------------
  def pai_yue(y)
    zq = [] 
    jq = []
    hs = [] 
    # 从冬至开始,连续计算14个中气时刻
    # 农历年首始于前一年的冬至,为了节气中气一起算,取前年大雪之前
    t1 = 365.2422 * (y - 2000) - 70#50 
    for i in 0...14 
      # 计算节气(从冬至开始),注意:返回的是力学时    
      # 中气计算,冬至的太阳黄经是270度(或-90度)
      zq[i] = jiao_cal(t1 + i * 30.4, i * 30 - 90, 0)   
      # 计算节气,它不是农历定朔计算所必需的
      jq[i] = jiao_cal(t1 + i * 30.4, i * 30 - 105, 0) 
    end  
    # 在冬至过后,连续计算14个日月合朔时刻 
    # 冬至过后的第一天0点的儒略日数
    dongZhiJia1 = zq[0] + 1 - dint_dec(zq[0], 8, false)   
    # 首月结束的日月合朔时刻
    hs[0] = jiao_cal(dongZhiJia1, 0, 1)
    # 算出中气及合朔时刻的日数(不含小数的日数计数,以便计算日期之间的差值
    for i in 1...14
      hs[i] = jiao_cal(hs[i - 1] + 25, 0, 1)
    end
    a= []
    b= []
    c= []
    # 取当地UTC日数的整数部分
    for i in 0...14  
      a[i] = dint_dec(zq[i], 8, true)
      b[i] = dint_dec(jq[i], 8, true)
      c[i] = dint_dec(hs[i], 8, true)
    end
    # 闰月及大小月分析
    tot = 12
    nun = -1
    # 月编号
    yn = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0 ] 
    if( c[12]<=a[12] )
      #闰月分析
      yn[12]=12 
      #编号为12的月是本年的有效月份,本年总月数13个
      tot=13 
      for i in 1...13 
        break if( c[i]<=a[i] ) 
      end
      nun=i-1
      k = i
      for i in  k...13 
        yn[i-1]-=1
        #注意yn中不含农历首月(所以取i-1),公历中农历首月总是去年的所以不多做计算
      end 
    end
    yue=[]
    for i in 0...tot
      #转为建寅月名,并做大小月分析
      #转建寅月名      
      yue[i]=[]
      yue[i][0] = jd_day(c[i]+jd_2000)
      yue[i][1] = (yn[i]+10) % 12
      yn[i]=yueMing[(yn[i]+10)%12] 
      #标记是否闰月
      if i==nun   
        yn[i]+="闰"
        yue[i][2]=true
      else 
        yn[i]+="月"
        yue[i][2]=false
      end 
      #标记大小月
      if(c[i+1]-c[i]>29) 
        yn[i]+="大"
        yue[i][3]=true
      else 
        yn[i]+="小" 
        yue[i][3]=false
      end
    end
    return  yue#,zq ,jq ,hs ,yn
  end

end
module Lifa
  
 module_function
def getHuiLi(d0)      #回历计算
  #以下算法使用Excel测试得到,测试时主要关心年临界与月临界
  d = d0 + 503105.0 - 2451545  + 0.5
  z = ( d/10631.0 ).truncate              #10631为一周期(30年)
  d -= z*10631            
  y = ((d+0.5)/354.366).truncate      #加0.5的作用是保证闰年正确(一周中的闰年是第2,5,7,10,13,16,18,21,24,26,29年)
  d -= (y*354.366+0.5).truncate 
  m = ((d+0.11)/29.51).truncate       #分子加0.11,分母加0.01的作用是第354或355天的的月分保持为12月(m=11)
  d -= (m*29.5+0.5).truncate 
  hyear = z*30+y+1
  hmonth= m+1
  hday  = d+1
  return   hyear ,  hmonth,  hday 
end 


def nian_gz(year)
  i=calc_years(year,1984)
  g=listGan[i%10]   
  z=listZhi[i%12]
  return i,g+z
end




def yue_gz(year)
  s=calc_years(year,1984)
  s= ((s%10+1)*12)%10
  y_gz=[]
  k=jqtest(year-1)
  k.concat(jqtest(year))
  for i in 0...12
    g=listGan[(s+i)%10] 
    z=listZhi[(i+2)%12]
    y_gz[i]=[g+z,jd_day(k[i*2+21]),jd_day(k[i*2+23])]
  end
  return y_gz
end



def ri_gz(year,month,day)
  jdid=day_jd(year,month,day)+0.5
  year=jd_day(jdid,false)[0]
  k=jqtest(year-1)
  k.concat(jqtest(year))
  for i in 0...23
    yi=i
    a=(0.5+k[i*2+1]).truncate
    b=(0.5+k[i*2+3]).truncate
    break  if jdid >=a  and jdid<b
  end
  if yi*2+1<21
    yi+=2
    ni=calc_years(year-1,1984)
    ng=listGan[ni%10]   
    nz=listZhi[ni%12]
  else
    yi-=10
    ni=calc_years(year,1984)
    ng=listGan[ni%10]   
    nz=listZhi[ni%12]
  end
  yis =((ni%10+1)*12)%10
  yg=listGan[(yis+yi)%10] 
  yz=listZhi[(yi+26)%12]
  for i in 0...23
    sxi=i
    a=(0.5+k[i*2]).truncate
    b=(0.5+k[i*2+2]).truncate
    break if jdid >=a  and jdid<b
  end
  ri=((jdid-11+60).truncate)%60
  rg=listGan[ri%10]
  rz=listZhi[ri%12]
  return ng+nz,yg+yz,rg+rz
end



def mingli_bz(year,month,day,h,m,s)
  jdid=day_jd(year,month,day,h,m,s)+0.5
  year=jd_day(jdid,false)[0]
  k=jqtest(year-1)
  k.concat(jqtest(year))
  for i in 0...23
    yi=i
    a=(0.5+k[i*2+1]).truncate
    b=(0.5+k[i*2+3]).truncate
    break  if jdid >=a  and jdid<b
  end
  if yi*2+1<21
    yi+=2
    ni=calc_years(year-1,1984)
    ng=listGan[ni%10]   
    nz=listZhi[ni%12]
    shx=listShX[ni%12]
  else
    yi-=10
    ni=calc_years(year,1984)
    ng=listGan[ni%10]   
    nz=listZhi[ni%12]
  end
  yis = ((ni%10+1)*12)%10
  yg=listGan[(yis+yi)%10] 
  yz=listZhi[(yi+26)%12]
  for i in 0...23
    sxi=i
    a=(0.5+k[i*2]).truncate
    b=(0.5+k[i*2+2]).truncate
    break if jdid >=a  and jdid<b
  end
  xz=listXiZ[(sxi)%12]
  ri=((jdid-11+60).truncate )%60
  rg=listGan[ri%10]
  rz=listZhi[ri%12]
  td0=time_day(h,m,s)
  for ti in 0..12
    td1=time_day(ti*2-1,0,0)
    td2=time_day(ti*2+1,0,0)
    break if (td1 <= td0 and td0 <td2)
  end
  si=((ri%10)*12+100)%10
  sg=listGan[(si+ti)%10]   
  sz=listZhi[ti%12]
  return ng+nz,yg+yz,rg+rz,sg+sz,shx,xz
end

end
  
  #==============================================================================
# ■ Lifa
#------------------------------------------------------------------------------
#  处理历法的类。
#   jqtest(y) 节气  ding_suo(y, arc=0) 月朔   pai_yue(y) 排月 
#==============================================================================

module Lifa
  
 module_function
  #--------------------------------------------------------------------------
  # ● 参数
  #--------------------------------------------------------------------------
    
  def  jqmc     
    return   ['冬至','小寒','大寒','立春','雨水','惊蛰',
      '春分','清明','谷雨','立夏','小满','芒种',
      '夏至','小暑','大暑','立秋','处暑','白露',
      '秋分','寒露','霜降','立冬','小雪','大雪']
  end    
  
  def  listShX   
    return ["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]    
  end       
  
  def  listXiZ 
    return ['白羊','金牛','双子','巨蟹','狮子','处女',
    '天秤','天蝎','射手','摩羯','水瓶','双鱼']
  end      
  
  def  listGan     
    return ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]    
  end    
  def  listZhi
    return ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]  
  end      
    
  def  week     
    return  ['一','二','三','四','五','六','日']  
    
  end      
     
    # 节气表
  def  jqB 
    return [ 
    "春分","清明",
    "谷雨","立夏",
    "小满","芒种",
    "夏至","小暑",
    "大暑","立秋",
    "处暑","白露",
    "秋分","寒露",
    "霜降","立冬",
    "小雪","大雪",
    "冬至","小寒",
    "大寒","立春",
    "雨水","惊蛰"] 
  end
    
    # 月名表
  def yueMing 
    return [ "正", "二", "三", "四", "五", "六",
    "七", "八", "九", "十", "十一", "十二" ]      
  end 
  def  yxmc  
    return ["朔","上弦","望","下弦"]  
  end       
  
  
    #@lifa_day ={}
    # ● 日历计算参数
    # 每弧度的角度数
  def n_rad 
    return 180.0 * 3600 / Math::PI
  end
   
    # 每弧度的角秒数
  def n_rad1 
    return 180.0 / Math::PI
  end
    #2000年前儒略日数(2000-1-1 12:00:00格林威治平时)
  def jd_2000 
    return 2451545
  end

   
    # ● 世界时与原子时之差计算表
   
  def dts 
    return [
    -4000, 108371.7, -13036.80, 392.000, 0.0000, -500, 17201.0,
    -627.82, 16.170, -0.3413, -150, 12200.6, -346.41, 5.403, -0.1593,
    150, 9113.8, -328.13, -1.647, 0.0377, 500, 5707.5, -391.41, 0.915,
    0.3145, 900, 2203.4, -283.45, 13.034, -0.1778, 1300, 490.1, -57.35,
    2.085, -0.0072, 1600, 120.0, -9.81, -1.532, 0.1403, 1700, 10.2,
    -0.91, 0.510, -0.0370, 1800, 13.4, -0.72, 0.202, -0.0193, 1830,
    7.8, -1.81, 0.416, -0.0247, 1860, 8.3, -0.13, -0.406, 0.0292, 1880,
    -5.4, 0.32, -0.183, 0.0173, 1900, -2.3, 2.06, 0.169, -0.0135, 1920,
    21.2, 1.69, -0.304, 0.0167, 1940, 24.2, 1.22, -0.064, 0.0031, 1960,
    33.2, 0.51, 0.231, -0.0109, 1980, 51.0, 1.29, -0.026, 0.0032, 2000,
    64.7, -1.66, 5.224, -0.2905, 2150, 279.4, 732.95, 429.579, 0.0158,
    6000]
  end
  # ● 黄赤交角及黄赤坐标变换相关数据
  
  # 黄赤交角系数表
  def hcjjB  
    return [ 84381.448, -46.8150, -0.00059,0.001813 ]
  end
  # Date黄道上的岁差
  def preceB 
    return [ 0, 50287.92262, 111.24406,0.07699,
    -0.23479, -0.00178, 0.00018, 0.00001 ]         
  end 
    
 

    # ● 光行差相关参数
   
    # 离心率
  def gxc_e 
    return [ 0.016708634, -0.000042037,-0.0000001267 ]     
  end  
    # 近点
  def gxc_p 
    return [ 102.93735 /n_rad1, 1.71946 /n_rad1,  0.00046 /n_rad1 ]    
  end 
    # 太平黄经
  def gxc_l 
    return [ 280.4664567 /n_rad1,36000.76982779 /n_rad1,
    0.0003032028 /n_rad1, 1 / 49931000 /n_rad1,-1 / 153000000 /n_rad1 ]    
  end 
  # 光行差常数
  def  gxc_k 
    return 20.49552 / n_rad 
  end
   
    # ● 章动表
   
  def  nutB
    return [2.1824391966, -33.757045954, 0.0000362262, 3.7340e-08, -2.8793e-10,
    -171996, -1742, 92025, 89, 3.5069406862, 1256.663930738,
    0.0000105845, 6.9813e-10, -2.2815e-10, -13187, -16, 5736, -31,
    1.3375032491, 16799.418221925, -0.0000511866, 6.4626e-08,
    -5.3543e-10, -2274, -2, 977, -5, 4.3648783932, -67.514091907,
    0.0000724525, 7.4681e-08, -5.7586e-10, 2062, 2, -895, 5,
    0.0431251803, -628.301955171, 0.0000026820, 6.5935e-10, 5.5705e-11,
    -1426, 34, 54, -1, 2.3555557435, 8328.691425719, 0.0001545547,
    2.5033e-07, -1.1863e-09, 712, 1, -7, 0, 3.4638155059,
    1884.965885909, 0.0000079025, 3.8785e-11, -2.8386e-10, -517, 12,
    224, -6, 5.4382493597, 16833.175267879, -0.0000874129, 2.7285e-08,
    -2.4750e-10, -386, -4, 200, 0, 3.6930589926, 25128.109647645,
    0.0001033681, 3.1496e-07, -1.7218e-09, -301, 0, 129, -1,
    3.5500658664, 628.361975567, 0.0000132664, 1.3575e-09, -1.7245e-10,
    217, -5, -95, 3 ]        
  end 
   
    # ●月球及地球运动参数表
   
    #黄经周期项
  def e10 
    return [ 1.75347045673, 0.00000000000,     0.0000000000,  0.03341656456,
    4.66925680417,  6283.0758499914,  0.00034894275, 4.62610241759,
    12566.1516999828,  0.00003417571, 2.82886579606,     3.5231183490,
    0.00003497056, 2.74411800971,  5753.3848848968,  0.00003135896,
    3.62767041758, 77713.7714681205,  0.00002676218, 4.41808351397, 
    7860.4193924392,  0.00002342687, 6.13516237631,  3930.2096962196,
    0.00001273166, 2.03709655772,   529.6909650946,  0.00001324292, 
    0.74246356352, 11506.7697697936,  0.00000901855, 2.04505443513,   
    26.2983197998,  0.00001199167, 1.10962944315,  1577.3435424478,
    0.00000857223, 3.50849156957,   398.1490034082,  0.00000779786, 
    1.17882652114,  5223.6939198022,  0.00000990250, 5.23268129594, 
    5884.9268465832,  0.00000753141, 2.53339053818,  5507.5532386674,
    0.00000505264, 4.58292563052, 18849.2275499742,  0.00000492379, 
    4.20506639861,   775.5226113240,  0.00000356655, 2.91954116867,   
    0.0673103028,  0.00000284125, 1.89869034186,   796.2980068164,
    0.00000242810, 0.34481140906,  5486.7778431750,  0.00000317087,
    5.84901952218, 11790.6290886588,  0.00000271039, 0.31488607649, 
    10977.0788046990,  0.00000206160, 4.80646606059,  2544.3144198834,
    0.00000205385, 1.86947813692,  5573.1428014331,  0.00000202261, 
    2.45767795458,  6069.7767545534,  0.00000126184, 1.08302630210,  
    20.7753954924,  0.00000155516, 0.83306073807,   213.2990954380,
    0.00000115132, 0.64544911683,     0.9803210682,  0.00000102851,
    0.63599846727,  4694.0029547076,  0.00000101724, 4.26679821365,  
    7.1135470008,  0.00000099206, 6.20992940258,  2146.1654164752,
    0.00000132212, 3.41118275555,  2942.4634232916,  0.00000097607, 
    0.68101272270,   155.4203994342,  0.00000085128, 1.29870743025,  
    6275.9623029906,  0.00000074651, 1.75508916159,  5088.6288397668,
    0.00000101895, 0.97569221824, 15720.8387848784,  0.00000084711, 
    3.67080093025, 71430.6956181291,  0.00000073547, 4.67926565481,  
    801.8209311238,  0.00000073874, 3.50319443167,  3154.6870848956,
    0.00000078756, 3.03698313141, 12036.4607348882,  0.00000079637, 
    1.80791330700, 17260.1546546904,  0.00000085803, 5.98322631256,
    161000.6857376741,  0.00000056963, 2.78430398043,  6286.5989683404,
    0.00000061148, 1.81839811024,  7084.8967811152,  0.00000069627,
    0.83297596966,  9437.7629348870,  0.00000056116, 4.38694880779, 
    14143.4952424306,  0.00000062449, 3.97763880587,  8827.3902698748,
    0.00000051145, 0.28306864501,  5856.4776591154,  0.00000055577, 
    3.47006009062,  6279.5527316424,  0.00000041036, 5.36817351402, 
    8429.2412664666,  0.00000051605, 1.33282746983,  1748.0164130670,
    0.00000051992, 0.18914945834, 12139.5535091068,  0.00000049000,
    0.48735065033,  1194.4470102246,  0.00000039200, 6.16832995016, 
    10447.3878396044,  0.00000035566, 1.77597314691,  6812.7668150860,
    0.00000036770, 6.04133859347, 10213.2855462110,  0.00000036596, 
    2.56955238628,  1059.3819301892,  0.00000033291, 0.59309499459, 
    17789.8456197850,  0.00000035954, 1.70876111898,  2352.8661537718  ]
  end 
    #黄经泊松1项
  def  e11 
    return [ 
    6283.31966747491,0.00000000000,     0.0000000000,  0.00206058863, 
    2.67823455584,  6283.0758499914,  0.00004303430, 2.63512650414, 
    12566.1516999828,  0.00000425264, 1.59046980729,     3.5231183490,
    0.00000108977, 2.96618001993,  1577.3435424478,  0.00000093478, 
    2.59212835365, 18849.2275499742,  0.00000119261, 5.79557487799,
    26.2983197998,  0.00000072122, 1.13846158196,   529.6909650946,
    0.00000067768, 1.87472304791,   398.1490034082,  0.00000067327,
    4.40918235168,  5507.5532386674,  0.00000059027, 2.88797038460, 
    5223.6939198022,  0.00000055976, 2.17471680261,   155.4203994342,
    0.00000045407, 0.39803079805,   796.2980068164,  0.00000036369, 
    0.46624739835,   775.5226113240,  0.00000028958, 2.64707383882, 
    7.1135470008,  0.00000019097, 1.84628332577,  5486.7778431750,
    0.00000020844, 5.34138275149,     0.9803210682,  0.00000018508, 
    4.96855124577,   213.2990954380,  0.00000016233, 0.03216483047,  
    2544.3144198834,  0.00000017293, 2.99116864949,  6275.9623029906  ]
  end 
    #黄经泊松2项
  def   e12 
    return [ 0.00052918870, 0.00000000000,     0.0000000000,  0.00008719837,
    1.07209665242,  6283.0758499914,  0.00000309125, 0.86728818832,
    12566.1516999828,  0.00000027339, 0.05297871691,     3.5231183490,
    0.00000016334, 5.18826691036,    26.2983197998,  0.00000015752,
    3.68457889430,   155.4203994342,  0.00000009541, 0.75742297675,
    18849.2275499742,  0.00000008937, 2.05705419118, 77713.7714681205,
    0.00000006952, 0.82673305410,   775.5226113240,  0.00000005064, 
    4.66284525271,  1577.3435424478  ]     
  end 
  def   e13 
    return [ 0.00000289226, 5.84384198723,  6283.0758499914,  
    0.00000034955, 0.00000000000,     0.0000000000, 0.00000016819,
    5.48766912348, 12566.1516999828  ]    
    end 
  def  e14 
    return [ 0.00000114084, 3.14159265359,     0.0000000000, 
    0.00000007717, 4.13446589358,  6283.0758499914, 0.00000000765, 
    3.83803776214, 12566.1516999828  ]     
  end 
  def  e15
    return [ 0.00000000878, 3.14159265359,     0.0000000000   ]     
  end 
    #黄纬周期项
  def  e20 
    return [ 0.00000279620, 3.19870156017, 84334.6615813083,  0.00000101643,
    5.42248619256,  5507.5532386674,  0.00000080445, 3.88013204458, 
    5223.6939198022,  0.00000043806, 3.70444689758,  2352.8661537718,
    0.00000031933, 4.00026369781,  1577.3435424478,  0.00000022724, 
    3.98473831560,  1047.7473117547,  0.00000016392, 3.56456119782,
    5856.4776591154,  0.00000018141, 4.98367470263,  6283.0758499914,
    0.00000014443, 3.70275614914,  9437.7629348870,  0.00000014304, 
    3.41117857525, 10213.2855462110  ]      
  end 
  def  e21
    return [ 0.00000009030, 3.89729061890,  5507.5532386674, 
    0.00000006177, 1.73038850355,  5223.6939198022  ]  
  end 
    #距离周期项
  def  e30 
    return [ 1.00013988799, 0.00000000000,     0.0000000000,  0.01670699626,
    3.09846350771,  6283.0758499914,  0.00013956023, 3.05524609620, 
    12566.1516999828,  0.00003083720, 5.19846674381, 77713.7714681205,
    0.00001628461, 1.17387749012,  5753.3848848968,  0.00001575568, 
    2.84685245825,  7860.4193924392,  0.00000924799, 5.45292234084, 
    11506.7697697936,  0.00000542444, 4.56409149777,  3930.2096962196  ]   
  end 
  def  e31 
    return [ 0.00103018608, 1.10748969588, 6283.0758499914, 
    0.00001721238, 1.06442301418, 12566.1516999828, 0.00000702215, 
    3.14159265359, 0.0000000000  ]     
  end 
  def  e32 
    return [0.00004359385, 5.78455133738, 6283.0758499914   ]    
  end 
  def  e33 
    return [0.00000144595, 4.27319435148, 6283.0758499914   ]    
  end 
   #月球运动参数
  def  m10 
    return [ 22639.5858800,  2.3555545723,  8328.6914247251, 1.5231275e-04, 
    2.5041111e-07,-1.1863391e-09, 4586.4383203,  8.0413790709,  
    7214.0628654588,-2.1850087e-04,-1.8646419e-07, 8.7760973e-10, 
    2369.9139357, 10.3969336431, 15542.7542901840,-6.6188121e-05, 
    6.3946925e-08,-3.0872935e-10,  769.0257187,  4.7111091445, 
    16657.3828494503, 3.0462550e-04, 5.0082223e-07,-2.3726782e-09,
    -666.4175399, -0.0431256817,   628.3019552485,-2.6638815e-06,
    6.1639211e-10,-5.4439728e-11, -411.5957339,  3.2558104895,
    16866.9323152810,-1.2804259e-04,-9.8998954e-09, 4.0433461e-11, 
    211.6555524,  5.6858244986, -1114.6285592663,-3.7081362e-04,
    -4.3687530e-07, 2.0639488e-09,  205.4359530,  8.0845047526,  
    6585.7609102104,-2.1583699e-04,-1.8708058e-07, 9.3204945e-10,
    191.9561973, 12.7524882154, 23871.4457149091, 8.6124629e-05,
    3.1435804e-07,-1.4950684e-09,  164.7286185, 10.4400593249, 
    14914.4523349355,-6.3524240e-05, 6.3330532e-08,-2.5428962e-10, 
    -147.3213842, -2.3986802540, -7700.3894694766,-1.5497663e-04,
    -2.4979472e-07, 1.1318993e-09, -124.9881185,  5.1984668216, 
    7771.3771450920,-3.3094061e-05, 3.1973462e-08,-1.5436468e-10,
    -109.3803637,  2.3124288905,  8956.9933799736, 1.4964887e-04,
    2.5102751e-07,-1.2407788e-09,   55.1770578,  7.1411231536, 
    -1324.1780250970, 6.1854469e-05, 7.3846820e-08,-3.4916281e-10,
    -45.0996092,  5.6113650618, 25195.6237400061, 2.4270161e-05, 
    2.4051122e-07,-1.1459056e-09,   39.5333010, -0.9002559173, 
    -8538.2408905558, 2.8035534e-04, 2.6031101e-07,-1.2267725e-09,
    38.4298346, 18.4383127140, 22756.8171556428,-2.8468899e-04,
    -1.2251727e-07, 5.6888037e-10,   36.1238141,  7.0666637168, 
    24986.0742741754, 4.5693825e-04, 7.5123334e-07,-3.5590172e-09, 
    30.7725751, 16.0827581417, 14428.1257309177,-4.3700174e-04,
    -3.7292838e-07, 1.7552195e-09,  -28.3971008,  7.9982533891,
    7842.3648207073,-2.2116475e-04,-1.8584780e-07, 8.2317000e-10,
    -24.3582283, 10.3538079614, 16171.0562454324,-6.8852003e-05,
    6.4563317e-08,-3.6316908e-10,  -18.5847068,  2.8429122493, 
    -557.3142796331,-1.8540681e-04,-2.1843765e-07, 1.0319744e-09,  
    17.9544674,  5.1553411398,  8399.6791003405,-3.5757942e-05,
    3.2589854e-08,-2.0880440e-10,   14.5302779, 12.7956138971,
    23243.1437596606, 8.8788511e-05, 3.1374165e-07,-1.4406287e-09,
    14.3796974, 15.1080427876, 32200.1371396342, 2.3843738e-04,
    5.6476915e-07,-2.6814075e-09,   14.2514576,-24.0810366320, 
    -2.3011998397, 1.5231275e-04, 2.5041111e-07,-1.1863391e-09, 
    13.8990596, 20.7938672862, 31085.5085803679,-1.3237624e-04, 
    1.2789385e-07,-6.1745870e-10,   13.1940636,  3.3302699264,
    -9443.3199839914,-5.2312637e-04,-6.8728642e-07, 3.2502879e-09,
    -9.6790568, -4.7542348263,-16029.0808942018,-3.0728938e-04,
    -5.0020584e-07, 2.3182384e-09,   -9.3658635, 11.2971895604,
    24080.9951807398,-3.4654346e-04,-1.9636409e-07, 9.1804319e-10,
    8.6055318,  5.7289501804, -1742.9305145148,-3.6814974e-04,
    -4.3749170e-07, 2.1183885e-09,   -8.4530982,  7.5540213938,
    16100.0685698171, 1.1921869e-04, 2.8238458e-07,-1.3407038e-09,
    8.0501724, 10.4831850066, 14286.1503796870,-6.0860358e-05,
    6.2714140e-08,-1.9984990e-10,   -7.6301553,  4.6679834628,
    17285.6848046987, 3.0196162e-04, 5.0143862e-07,-2.4271179e-09,
    -7.4474952, -0.0862513635,  1256.6039104970,-5.3277630e-06, 
    1.2327842e-09,-1.0887946e-10,    7.3712011,  8.1276304344,
    5957.4589549619,-2.1317311e-04,-1.8769697e-07, 9.8648918e-10,
    7.0629900,  0.9591375719,    33.7570471374,-3.0829302e-05,
    -3.6967043e-08, 1.7385419e-10,   -6.3831491,  9.4966777258,  
    7004.5133996281, 2.1416722e-04, 3.2425793e-07,-1.5355019e-09, 
    -5.7416071, 13.6527441326, 32409.6866054649,-1.9423071e-04,
    5.4047029e-08,-2.6829589e-10,    4.3740095, 18.4814383957,
    22128.5152003943,-2.8202511e-04,-1.2313366e-07, 6.2332010e-10,
    -3.9976134,  7.9669196340, 33524.3151647312, 1.7658291e-04,
    4.9092233e-07,-2.3322447e-09,   -3.2096876, 13.2398458924, 
    14985.4400105508,-2.5159493e-04,-1.5449073e-07, 7.2324505e-10, 
    -2.9145404, 12.7093625336, 24499.7476701576, 8.3460748e-05,
    3.1497443e-07,-1.5495082e-09,    2.7318890, 16.1258838235,
    13799.8237756692,-4.3433786e-04,-3.7354477e-07, 1.8096592e-09,
    -2.5679459, -2.4418059357, -7072.0875142282,-1.5764051e-04,
    -2.4917833e-07, 1.0774596e-09,   -2.5211990,  7.9551277074, 
    8470.6667759558,-2.2382863e-04,-1.8523141e-07, 7.6873027e-10, 
    2.4888871,  5.6426988169,  -486.3266040178,-3.7347750e-04,
    -4.3625891e-07, 2.0095091e-09,    2.1460741,  7.1842488353,
    -1952.4799803455, 6.4518350e-05, 7.3230428e-08,-2.9472308e-10,
    1.9777270, 23.1494218585, 39414.2000050930, 1.9936508e-05, 
    3.7830496e-07,-1.8037978e-09,    1.9336825,  9.4222182890,
    33314.7656989005, 6.0925100e-04, 1.0016445e-06,-4.7453563e-09, 
    1.8707647, 20.8369929680, 30457.2066251194,-1.2971236e-04, 
    1.2727746e-07,-5.6301898e-10,   -1.7529659,  0.4873576771,
    -8886.0057043583,-3.3771956e-04,-4.6884877e-07, 2.2183135e-09,
    -1.4371624,  7.0979974718,  -695.8760698485, 5.9190587e-05,
    7.4463212e-08,-4.0360254e-10,   -1.3725701,  1.4552986550,  
    -209.5494658307, 4.3266809e-04, 5.1072212e-07,-2.4131116e-09,  
    1.2618162,  7.5108957121, 16728.3705250656, 1.1655481e-04, 
    2.8300097e-07,-1.3951435e-09  ]     
    end 
    def m11
    return [ 1.6768000, -0.0431256817,   628.3019552485,-2.6638815e-06, 
    6.1639211e-10,-5.4439728e-11,    0.5164200, 11.2260974062, 
    6585.7609102104,-2.1583699e-04,-1.8708058e-07, 9.3204945e-10,
    0.4138300, 13.5816519784, 14914.4523349355,-6.3524240e-05,
    6.3330532e-08,-2.5428962e-10,    0.3711500,  5.5402729076, 
    7700.3894694766, 1.5497663e-04, 2.4979472e-07,-1.1318993e-09,
    0.2756000,  2.3124288905,  8956.9933799736, 1.4964887e-04,
    2.5102751e-07,-1.2407788e-09,    0.2459863,-25.6198212459,  
    -2.3011998397, 1.5231275e-04, 2.5041111e-07,-1.1863391e-09,   
    0.0711800,  7.9982533891,  7842.3648207073,-2.2116475e-04,
    -1.8584780e-07, 8.2317000e-10,    0.0612800, 10.3538079614,
    16171.0562454324,-6.8852003e-05, 6.4563317e-08,-3.6316908e-10  ]   
    end 
   def  m12 
    return [ 0.0048700, -0.0431256817,   628.3019552485,-2.6638815e-06,
    6.1639211e-10,-5.4439728e-11,  0.0022800,-27.1705318325,    
    -2.3011998397, 1.5231275e-04, 2.5041111e-07,-1.1863391e-09,  
    0.0015000, 11.2260974062,  6585.7609102104,-2.1583699e-04,
    -1.8708058e-07, 9.3204945e-10  ]    
    end 
  def  m20 
    return [ 18461.2400600,  1.6279052448,  8433.4661576405,-6.4021295e-05,
    -4.9499477e-09, 2.0216731e-11, 1010.1671484,  3.9834598170, 
    16762.1575823656, 8.8291456e-05, 2.4546117e-07,-1.1661223e-09,
    999.6936555,  0.7276493275,  -104.7747329154, 2.1633405e-04, 
    2.5536106e-07,-1.2065558e-09,  623.6524746,  8.7690283983,  
    7109.2881325435,-2.1668263e-06, 6.8896872e-08,-3.2894608e-10,
    199.4837596,  9.6692843156, 15647.5290230993,-2.8252217e-04,
    -1.9141414e-07, 8.9782646e-10,  166.5741153,  6.4134738261, 
    -1219.4032921817,-1.5447958e-04,-1.8151424e-07, 8.5739300e-10, 
    117.2606951, 12.0248388879, 23976.2204478244,-1.3020942e-04,
    5.8996977e-08,-2.8851262e-10,   61.9119504,  6.3390143893, 
    25090.8490070907, 2.4060421e-04, 4.9587228e-07,-2.3524614e-09,
    33.3572027, 11.1245829706, 15437.9795572686, 1.5014592e-04,
    3.1930799e-07,-1.5152852e-09,   31.7596709,  3.0832038997, 
    8223.9166918098, 3.6864680e-04, 5.0577218e-07,-2.3928949e-09,   
    29.5766003,  8.8121540801,  6480.9861772950, 4.9705523e-07,
    6.8280480e-08,-2.7450635e-10,   15.5662654,  4.0579192538, 
    -9548.0947169068,-3.0679233e-04,-4.3192536e-07, 2.0437321e-09,
    15.1215543, 14.3803934601, 32304.9118725496, 2.2103334e-05,
    3.0940809e-07,-1.4748517e-09,  -12.0941511,  8.7259027166,  
    7737.5900877920,-4.8307078e-06, 6.9513264e-08,-3.8338581e-10,
    8.8681426,  9.7124099974, 15019.2270678508,-2.7985829e-04,
    -1.9203053e-07, 9.5226618e-10,    8.0450400,  0.6687636586,
    8399.7091105030,-3.3191993e-05, 3.2017096e-08,-1.5363746e-10,
    7.9585542, 12.0679645696, 23347.9184925760,-1.2754553e-04, 
    5.8380585e-08,-2.3407289e-10,    7.4345550,  6.4565995078, 
    -1847.7052474301,-1.5181570e-04,-1.8213063e-07, 9.1183272e-10,  
    -6.7314363, -4.0265854988,-16133.8556271171,-9.0955337e-05,
    -2.4484477e-07, 1.1116826e-09,    6.5795750, 16.8104074692,
    14323.3509980023,-2.2066770e-04,-1.1756732e-07, 5.4866364e-10,
    -6.4600721,  1.5847795630,  9061.7681128890,-6.6685176e-05,
    -4.3335556e-09,-3.4222998e-11,   -6.2964773,  4.8837157343,
    25300.3984729215,-1.9206388e-04,-1.4849843e-08, 6.0650192e-11, 
    -5.6323538, -0.7707750092,   733.0766881638,-2.1899793e-04,
    -2.5474467e-07, 1.1521161e-09,   -5.3683961,  6.8263720663, 
    16204.8433027325,-9.7115356e-05, 2.7023515e-08,-1.3414795e-10,
    -5.3112784,  3.9403341353, 17390.4595376141, 8.5627574e-05,
    2.4607756e-07,-1.2205621e-09,   -5.0759179,  0.6845236457, 
    523.5272223331, 2.1367016e-04, 2.5597745e-07,-1.2609955e-09, 
    -4.8396143, -1.6710309265, -7805.1642023920, 6.1357413e-05, 
    5.5663398e-09,-7.4656459e-11,   -4.8057401,  3.5705615768, 
    -662.0890125485, 3.0927234e-05, 3.6923410e-08,-1.7458141e-10,
    3.9840545,  8.6945689615, 33419.5404318159, 3.9291696e-04,
    7.4628340e-07,-3.5388005e-09,    3.6744619, 19.1659620415,
    22652.0424227274,-6.8354947e-05, 1.3284380e-07,-6.3767543e-10, 
    2.9984815, 20.0662179587, 31190.2833132833,-3.4871029e-04,
    -1.2746721e-07, 5.8909710e-10,    2.7986413, -2.5281611620,
    -16971.7070481963, 3.4437664e-04, 2.6526096e-07,-1.2469893e-09,
    2.4138774, 17.7106633865, 22861.5918885581,-5.0102304e-04,
    -3.7787833e-07, 1.7754362e-09,    2.1863132,  5.5132179088, 
    -9757.6441827375, 1.2587576e-04, 7.8796768e-08,-3.6937954e-10,
    2.1461692, 13.4801375428, 23766.6709819937, 3.0245868e-04, 
    5.6971910e-07,-2.7016242e-09,    1.7659832, 11.1677086523,
    14809.6776020201, 1.5280981e-04, 3.1869159e-07,-1.4608454e-09,
    -1.6244212,  7.3137297434,  7318.8375983742,-4.3483492e-04,
    -4.4182525e-07, 2.0841655e-09,    1.5813036,  5.4387584720,
    16552.6081165349, 5.2095955e-04, 7.5618329e-07,-3.5792340e-09,
    1.5197528, 16.7359480324, 40633.6032972747, 1.7441609e-04, 
    5.5981921e-07,-2.6611908e-09,    1.5156341,  1.7023646816,
    -17876.7861416319,-4.5910508e-04,-6.8233647e-07, 3.2300712e-09,
    1.5102092,  5.4977296450,  8399.6847301375,-3.3094061e-05,
    3.1973462e-08,-1.5436468e-10,   -1.3178223,  9.6261586339, 
    16275.8309783478,-2.8518605e-04,-1.9079775e-07, 8.4338673e-10,  
    -1.2642739, 11.9817132061, 24604.5224030729,-1.3287330e-04,
    5.9613369e-08,-3.4295235e-10,    1.1918723, 22.4217725310,
    39518.9747380084,-1.9639754e-04, 1.2294390e-07,-5.9724197e-10,
    1.1346110, 14.4235191419, 31676.6099173011, 2.4767216e-05,
    3.0879170e-07,-1.4204120e-09,    1.0857810,  8.8552797618,
    5852.6842220465, 3.1609367e-06, 6.7664088e-08,-2.2006663e-10,  
    -1.0193852,  7.2392703065, 33629.0898976466,-3.9751134e-05,
    2.3556127e-07,-1.1256889e-09,   -0.8227141, 11.0814572888, 
    16066.2815125171, 1.4748204e-04, 3.1992438e-07,-1.5697249e-09,
    0.8042238,  3.5274358950,   -33.7870573000, 2.8263353e-05, 
    3.7539802e-08,-2.2902113e-10,    0.8025939,  6.7832463846, 
    16833.1452579809,-9.9779237e-05, 2.7639907e-08,-1.8858767e-10,   
    -0.7931866, -6.3821400710,-24462.5470518423,-2.4326809e-04,
    -4.9525589e-07, 2.2980217e-09,   -0.7910153,  6.3703481443, 
    -591.1013369332,-1.5714346e-04,-1.8089785e-07, 8.0295327e-10,
    -0.6674056,  9.1819266386, 24533.5347274576, 5.5197395e-05,
    2.7743463e-07,-1.3204870e-09,    0.6502226,  4.1010449356,
    -10176.3966721553,-3.0412845e-04,-4.3254175e-07, 2.0981718e-09,
    -0.6388131,  6.2958887075, 25719.1509623392, 2.3794032e-04,
    4.9648867e-07,-2.4069012e-09  ]      
  end 
  def   m21 
    return [ 0.0743000, 11.9537467337,  6480.9861772950, 4.9705523e-07,
    6.8280480e-08,-2.7450635e-10,    0.0304300,  8.7259027166,
    7737.5900877920,-4.8307078e-06, 6.9513264e-08,-3.8338581e-10,
    0.0222900, 12.8540026510, 15019.2270678508,-2.7985829e-04,
    -1.9203053e-07, 9.5226618e-10,    0.0199900, 15.2095572232,
    23347.9184925760,-1.2754553e-04, 5.8380585e-08,-2.3407289e-10,
    0.0186900,  9.5981921614, -1847.7052474301,-1.5181570e-04,
    -1.8213063e-07, 9.1183272e-10,    0.0169600,  7.1681781524, 
    16133.8556271171, 9.0955337e-05, 2.4484477e-07,-1.1116826e-09,  
    0.0162300,  1.5847795630,  9061.7681128890,-6.6685176e-05,
    -4.3335556e-09,-3.4222998e-11,    0.0141900, -0.7707750092,   
    733.0766881638,-2.1899793e-04,-2.5474467e-07, 1.1521161e-09  ]    
  end 
  def  m30 
    return [ 385000.5290396,  1.5707963268,     0.0000000000, 0.0000000e+00,
    0.0000000e+00, 0.0000000e+00,-20905.3551378, 3.9263508990, 
    8328.6914247251, 1.5231275e-04, 2.5041111e-07,-1.1863391e-09,
    -3699.1109330,  9.6121753977,  7214.0628654588,-2.1850087e-04,
    -1.8646419e-07, 8.7760973e-10,-2955.9675626, 11.9677299699,
    15542.7542901840,-6.6188121e-05, 6.3946925e-08,-3.0872935e-10,
    -569.9251264,  6.2819054713, 16657.3828494503, 3.0462550e-04,
    5.0082223e-07,-2.3726782e-09,  246.1584797,  7.2566208254, 
    -1114.6285592663,-3.7081362e-04,-4.3687530e-07, 2.0639488e-09,
    -204.5861179, 12.0108556517, 14914.4523349355,-6.3524240e-05, 
    6.3330532e-08,-2.5428962e-10, -170.7330791, 14.3232845422, 
    23871.4457149091, 8.6124629e-05, 3.1435804e-07,-1.4950684e-09,
    -152.1378118,  9.6553010794,  6585.7609102104,-2.1583699e-04,
    -1.8708058e-07, 9.3204945e-10, -129.6202242, -0.8278839272, 
    -7700.3894694766,-1.5497663e-04,-2.4979472e-07, 1.1318993e-09, 
    108.7427014,  6.7692631483,  7771.3771450920,-3.3094061e-05,
    3.1973462e-08,-1.5436468e-10,  104.7552944,  3.8832252173,  
    8956.9933799736, 1.4964887e-04, 2.5102751e-07,-1.2407788e-09,
    79.6605685,  0.6705404095, -8538.2408905558, 2.8035534e-04,
    2.6031101e-07,-1.2267725e-09,   48.8883284,  1.5276706450, 
    628.3019552485,-2.6638815e-06, 6.1639211e-10,-5.4439728e-11, 
    -34.7825237, 20.0091090408, 22756.8171556428,-2.8468899e-04,
    -1.2251727e-07, 5.6888037e-10,   30.8238599, 11.9246042882,
    16171.0562454324,-6.8852003e-05, 6.4563317e-08,-3.6316908e-10,
    24.2084985,  9.5690497159,  7842.3648207073,-2.2116475e-04,
    -1.8584780e-07, 8.2317000e-10,  -23.2104305,  8.6374600436,
    24986.0742741754, 4.5693825e-04, 7.5123334e-07,-3.5590172e-09, 
    -21.6363439, 17.6535544685, 14428.1257309177,-4.3700174e-04,
    -3.7292838e-07, 1.7552195e-09,  -16.6747239,  6.7261374666, 
    8399.6791003405,-3.5757942e-05, 3.2589854e-08,-2.0880440e-10,
    14.4026890,  4.9010662531, -9443.3199839914,-5.2312637e-04,
    -6.8728642e-07, 3.2502879e-09,  -12.8314035, 14.3664102239,
    23243.1437596606, 8.8788511e-05, 3.1374165e-07,-1.4406287e-09,
    -11.6499478, 22.3646636130, 31085.5085803679,-1.3237624e-04, 
    1.2789385e-07,-6.1745870e-10,  -10.4447578, 16.6788391144, 
    32200.1371396342, 2.3843738e-04, 5.6476915e-07,-2.6814075e-09,
    10.3211071,  8.7119194804, -1324.1780250970, 6.1854469e-05, 
    7.3846820e-08,-3.4916281e-10,   10.0562033,  7.2997465071, 
    -1742.9305145148,-3.6814974e-04,-4.3749170e-07, 2.1183885e-09, 
    -9.8844667, 12.0539813334, 14286.1503796870,-6.0860358e-05,
    6.2714140e-08,-1.9984990e-10,    8.7515625,  6.3563649081,
    -9652.8694498221,-9.0458282e-05,-1.7656429e-07, 8.3717626e-10,
    -8.3791067,  4.4137085761,  -557.3142796331,-1.8540681e-04,
    -2.1843765e-07, 1.0319744e-09,   -7.0026961, -3.1834384995,
    -16029.0808942018,-3.0728938e-04,-5.0020584e-07, 2.3182384e-09, 
    6.3220032,  9.1248177206, 16100.0685698171, 1.1921869e-04,
    2.8238458e-07,-1.3407038e-09,    5.7508579,  6.2387797896,
    17285.6848046987, 3.0196162e-04, 5.0143862e-07,-2.4271179e-09,
    -4.9501349,  9.6984267611,  5957.4589549619,-2.1317311e-04,
    -1.8769697e-07, 9.8648918e-10,   -4.4211770,  3.0260949818, 
    -209.5494658307, 4.3266809e-04, 5.1072212e-07,-2.4131116e-09,   
    4.1311145, 11.0674740526,  7004.5133996281, 2.1416722e-04, 
    3.2425793e-07,-1.5355019e-09,   -3.9579827, 20.0522347225, 
    22128.5152003943,-2.8202511e-04,-1.2313366e-07, 6.2332010e-10,
    3.2582371, 14.8106422192, 14985.4400105508,-2.5159493e-04,
    -1.5449073e-07, 7.2324505e-10,   -3.1483020,  4.8266068163,
    16866.9323152810,-1.2804259e-04,-9.8998954e-09, 4.0433461e-11, 
    2.6164092, 14.2801588604, 24499.7476701576, 8.3460748e-05,
    3.1497443e-07,-1.5495082e-09,    2.3536310,  9.5259240342,
    8470.6667759558,-2.2382863e-04,-1.8523141e-07, 7.6873027e-10,
    -2.1171283, -0.8710096090, -7072.0875142282,-1.5764051e-04,
    -2.4917833e-07, 1.0774596e-09,   -1.8970368, 17.6966801503,
    13799.8237756692,-4.3433786e-04,-3.7354477e-07, 1.8096592e-09,  
    -1.7385258,  2.0581540038, -8886.0057043583,-3.3771956e-04,
    -4.6884877e-07, 2.2183135e-09,   -1.5713944, 22.4077892948, 
    30457.2066251194,-1.2971236e-04, 1.2727746e-07,-5.6301898e-10,
    -1.4225541, 24.7202181853, 39414.2000050930, 1.9936508e-05,
    3.7830496e-07,-1.8037978e-09,   -1.4189284, 17.1661967915,
    23314.1314352759,-9.9282182e-05, 9.5920387e-08,-4.6309403e-10, 
    1.1655364,  3.8400995356,  9585.2953352221, 1.4698499e-04, 
    2.5164390e-07,-1.2952185e-09,   -1.1169371, 10.9930146158, 
    33314.7656989005, 6.0925100e-04, 1.0016445e-06,-4.7453563e-09,
    1.0656723,  1.4845449633,  1256.6039104970,-5.3277630e-06,
    1.2327842e-09,-1.0887946e-10,    1.0586190, 11.9220903668, 
    8364.7398411275,-2.1850087e-04,-1.8646419e-07, 8.7760973e-10,
    -0.9333176,  9.0816920389, 16728.3705250656, 1.1655481e-04,
    2.8300097e-07,-1.3951435e-09,    0.8624328, 12.4550876470, 
    6656.7485858257,-4.0390768e-04,-4.0490184e-07, 1.9095841e-09,
    0.8512404,  4.3705828944,    70.9876756153,-1.8807069e-04,
    -2.1782126e-07, 9.7753467e-10,   -0.8488018, 16.7219647962, 
    31571.8351843857, 2.4110126e-04, 5.6415276e-07,-2.6269678e-09, 
    -0.7956264,  3.5134526588, -9095.5551701890, 9.4948529e-05,
    4.1873358e-08,-1.9479814e-10  ]    
  end 
  def m31 
    return [ 0.5139500, 12.0108556517, 14914.4523349355,-6.3524240e-05, 
    6.3330532e-08,-2.5428962e-10,    0.3824500,  9.6553010794, 
    6585.7609102104,-2.1583699e-04,-1.8708058e-07, 9.3204945e-10, 
    0.3265400,  3.9694765808,  7700.3894694766, 1.5497663e-04, 
    2.4979472e-07,-1.1318993e-09,    0.2639600,  0.7416325637, 
    8956.9933799736, 1.4964887e-04, 2.5102751e-07,-1.2407788e-09,
    0.1230200, -1.6139220085,   628.3019552485,-2.6638815e-06, 
    6.1639211e-10,-5.4439728e-11,    0.0775400,  8.7830116346, 
    16171.0562454324,-6.8852003e-05, 6.4563317e-08,-3.6316908e-10,  
    0.0606800,  6.4274570623,  7842.3648207073,-2.2116475e-04,
    -1.8584780e-07, 8.2317000e-10,    0.0497000, 12.0539813334,
    14286.1503796870,-6.0860358e-05, 6.2714140e-08,-1.9984990e-10  ]    
  end  
    #月球平黄经系数
  def m1n
    return [ 3.81034392032, 8.39968473021e+03,-3.31919929753e-05,
    3.20170955005e-08,-1.53637455544e-10  ]        
  end 
    
end


class Lifa_Windos < Window
  
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :index                    # 光标位置
  attr_reader   :in_max 
  attr_reader   :in_min 
  attr_reader   :window_id
  attr_reader   :help_window              # 帮助窗口
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     x      : 窗口的 X 坐标
  #     y      : 窗口的 Y 坐标
  #     width  : 窗口的宽
  #     height : 窗口的宽
  #--------------------------------------------------------------------------
  def initialize(x=0,y=0,width=32*8,height=32*9)
    super()
    @d_win = Window.new
    @d_win.windowskin = RPG::Cache.windowskin("001-Blue01.png")
    @d_win.x = x
    @d_win.y = y + 60
    @d_win.width = width
    @d_win.height = height - 32
    @d_win.z = 100 
    @d_win.contents = Bitmap.new(width-32, height-64 )
    
    @y_win = Window.new
    @y_win.windowskin = RPG::Cache.windowskin("001-Blue01.png")
    @y_win.x = x
    @y_win.y = y
    @y_win.width = width/2.0
    @y_win.height = 60
    @y_win.z = 100 
    @y_win.contents = Bitmap.new( width/2.0-32 ,28)
    
    @m_win = Window.new
    @m_win.windowskin = RPG::Cache.windowskin("001-Blue01.png")
    @m_win.x = x + width/2.0
    @m_win.y = y 
    @m_win.width = width/2.0
    @m_win.height = 60
    @m_win.z = 100 
    @m_win.contents = Bitmap.new(width/2.0 - 32, 28)
    
    
    @help_window = Window.new
    @help_window.windowskin = RPG::Cache.windowskin("001-Blue01.png")
    @help_window.x = x + width
    @help_window.y = y 
    @help_window.width = width/2.0
    @help_window.height = height+28
    @help_window.z = 100 
    @help_window.contents = Bitmap.new( width/2.0-32 ,height+28 -32)
    
    
    @help_id =[0,0,0]
    
    @time=30
    
    @in_max = 41
    @in_min = -1
    @index = 0
    t = Time.new
    @day= t.mday 
    @month= t.mon 
    @year= t.year
    @window_id=2
    huizhi
  end
  
   def main
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if Input.trigger?(Input::C)
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    Graphics.transition
    Graphics.freeze
    dispose
  end
  
  
  
  def clear    
    if  @d_win.contents  != nil
      @d_win.contents.clear
    end
    if  @y_win.contents  != nil
      @y_win.contents.clear
    end
    if  @m_win.contents  != nil
      @m_win.contents.clear
    end
    if  @help_window.contents  != nil
      @help_window.contents.clear
    end
  end
  
  
  def huizhi
    clear
    @y_win.contents.font.color =    crisis_color
    k=@year
    draw_txt(0,k.to_s,10,0)
    @y_win.contents.font.color = knockout_color
    draw_txt(0,"年",32*2,0)
    @m_win.contents.font.color =    crisis_color
    if @month<10
      draw_txt(1,"0#{@month}",32,0)
    else
      draw_txt(1,"#{@month}",32,0)
    end
    @m_win.contents.font.color = knockout_color
    draw_txt(1,"月",32*2,0)
    @d_win.contents.font.color = knockout_color
    for i in 0...7
      draw_txt(2,Lifa.week[(i)%7],i*32,0)
    end
    days=Lifa.days_of_month(@year,@month)
    stweek=Lifa.is_week(@year,@month,1)
    stweek=stweek + 7 if stweek == 0
    if @month > 1
      s_days=Lifa.days_of_month(@year,@month-1)
    else
      s_days=Lifa.days_of_month(@year-1,12)
    end
    if @month < 12
      x_days=Lifa.days_of_month(@year,@month+1)
    else
      x_days=Lifa.days_of_month(@year+1,1)
    end
    @in_min=  stweek - 2
    @in_max=  days + stweek - 1
    for y in 0...6
      for x in 0...7
        i=y*7+x
        if stweek-1 > i 
          @d_win.contents.font.color =  disabled_color
          d = s_days - stweek +  i + 2
        elsif  i <=  days + stweek - 2
          @d_win.contents.font.color =    crisis_color
          d= i - stweek + 2           
          d +=10 if @year==1582 and @month==10 and d>4
           if @day == d 
             @index  = i
           end
        else
          @d_win.contents.font.color =  disabled_color
          d=i-days-stweek+2
        end
        if (d)<10
          draw_txt(2,"0#{d}",x*32,y*32+32)
        else
          draw_txt(2,"#{d}",x*32,y*32+32)
        end
      end
    end
    if  @help_window != nil
      update_help
    end
    # 刷新光标矩形
    update_cursor_rect
  end

  
  
  def update_help
    
       @time-=1 if @time >= 0
    if @help_id != [@year,@month,@day] 
       @time=30
       @help_window.contents.clear
       @help_window.contents.font.size = 36
       size=  @help_window.contents.font.size
       width=    @help_window.width
       height=   @help_window.height
       @help_window.contents.font.size = 22
      if @month<10  
        
        @help_window.contents.draw_text(0,0, size,size,"年") 
        st ="#{@year}"
               @help_window.contents.font.size = 36
        @help_window.contents.draw_text(0,25, st.size * size,size,st) 
        st ="0#{@month}"
               @help_window.contents.font.size = 22
        @help_window.contents.draw_text(0,25+36+5,  size,size,"月") 
               @help_window.contents.font.size = 36
        @help_window.contents.draw_text(0,25+36+22+10, st.size * size,size,st) 
      else
         
        @help_window.contents.draw_text(0,0, size,size,"年") 
        st ="#{@year}"
               @help_window.contents.font.size = 36
        @help_window.contents.draw_text(0,25, st.size * size,size,st) 
        st ="#{@month}"
               @help_window.contents.font.size = 22
        @help_window.contents.draw_text(0,25+36+5,  size,size,"月") 
               @help_window.contents.font.size = 36
        @help_window.contents.draw_text(0,25+36+22+10,
        st.size * size,size,st) 
       end    
      
        @help_window.contents.font.size = 22
      @help_window.contents.draw_text(0,25+36+22+10+36+5, 4* size,size,"日期")      
                 @help_window.contents.font.size = 36                   
    if @day < 10
       @help_window.contents.draw_text(0,25+36+22+10+36+5+22+5, 
       size*2,size,"0#{@day}") 
      else
       @help_window.contents.draw_text(0,25+36+22+10+36+5+22+5, 
       size*2, size, "#{@day}") 
     end   
                    @help_window.contents.font.size = 22
     week=Lifa.is_week(@year,@month,@day)
     st="星期"+Lifa.week[(week)%7]
    @help_window.contents.draw_text(0,25+36+22+10+36+5+22+5+36+5, 
    st.size * size,size,st) 

     @help_id= [@year,@month,@day] 
   end
 if @time==0
   
       @help_window.contents.clear
       @help_window.contents.font.size = 48
       size=  @help_window.contents.font.size
       width=    @help_window.width
       height=   @help_window.height
    if @day < 10
    @help_window.contents.draw_text((width-size*2)/2.0 ,10, 
      size*2,size,"0#{@day}") 
    else
      @help_window.contents.draw_text((width-size*2)/2.0 ,10, 
      size*2, size, "#{@day}") 
    end
      @help_window.contents.font.size = 12
      size= @help_window.contents.font.size
      if @month<10  
        st ="#{@year}年0#{@month}月"
        @help_window.contents.draw_text(0,0, st.size * size,size,st) 
     else
       st="#{@year}年#{@month}月"
        @help_window.contents.draw_text(0,0, st.size * size,size,st) 
     end
     @help_id= [@year,@month,@day] 
    gz= Lifa.ri_gz(@year,@month,@day)
    @help_window.contents.font.size = 22
    size= @help_window.contents.font.size
    @help_window.contents.draw_text((width-size*4)/2.0 ,80, 
     size*3, size, "#{gz[0]}年") 
    @help_window.contents.draw_text((width-size*4)/2.0 ,80+size, 
     size*3, size, "#{gz[1]}月") 
    @help_window.contents.draw_text((width-size*4)/2.0,80+size*2, 
     size*3, size, "#{gz[2]}日") 
  end


  end
  
  
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    # 如果窗口的内容已经被设置就被释放
    if @d_win.contents != nil
      @d_win.contents.dispose
    end
    if @m_win.contents != nil
      @m_win.contents.dispose
    end
    if @y_win.contents != nil
      @y_win.contents.dispose
    end
    if  @help_window.contents  != nil
      @help_window.contents.dispose
    end
    super
  end
  #--------------------------------------------------------------------------
  # ● 获取文字色
  #     n : 文字色编号 (0~7)
  #--------------------------------------------------------------------------
  def text_color(n)
    case n
    when 0
      return Color.new(255, 255, 255, 255)
    when 1
      return Color.new(128, 128, 255, 255)
    when 2
      return Color.new(255, 128, 128, 255)
    when 3
      return Color.new(128, 255, 128, 255)
    when 4
      return Color.new(128, 255, 255, 255)
    when 5
      return Color.new(255, 128, 255, 255)
    when 6
      return Color.new(255, 255, 128, 255)
    when 7
      return Color.new(192, 192, 192, 255)
    else
      normal_color
    end
  end

  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    @d_win.update
    @y_win.update 
    @m_win.update 
    
    if @help_window != nil
      update_help
    end
    
    # 方向键下被按下的情况下
    if Input.repeat?(Input::DOWN)
      case @window_id
      when 0
        @year+=1
        huizhi
        return
      when 1
        if @month<12 
          @month+=1
        else 
          @year+=1
          @month= 1
        end
        days= Lifa.days_of_month(@year,@month)
        @day= days if @day>days
        huizhi
        return
      when 2
        if @index +7 < @in_max  
          @index +=7
          @day+=7
        elsif @index  +7 >= @in_max 
          if @month<12 
            @month+=1
          else 
            @year+=1
            @month= 1
          end
          @day = @index  +8 -@in_max 
          huizhi
          return
        end
      end
    end
    
    if Input.repeat?(Input::UP)
      case @window_id
      when 0
        @year-=1
        huizhi
        return
      when 1
        if @month>1 
          @month-=1
        else 
          @year-=1
          @month=12
        end
        days= Lifa.days_of_month(@year,@month)
        @day= days if @day>days
        huizhi
        return
      when 2
        if @index -7 > @in_min
          @index  -=7
          @day  -= 7
        elsif  @index -7 <= @in_min 
          if @month>1 
            @month-=1
          else 
            @year-=1
            @month=12
          end
          days= Lifa.days_of_month(@year,@month)
          @day= days+( @index -7  - @in_min)  #if @day > days
          huizhi
          return
        end
      end
    end
    
    
    if Input.repeat?(Input::RIGHT)
      case @window_id
      when 0
        @year+=1
        huizhi
        return
      when 1
        if @month<12 
          @month+=1
        else 
          @year+=1
          @month= 1
        end
        days= Lifa.days_of_month(@year,@month)
        @day= days if @day>days
        huizhi
        return
      when 2
        if @index  < @in_max -1 
          @index  += 1
          @day += 1
        elsif @index  >= @in_max -1 
          if @month<12 
            @month+=1
          else 
            @year+=1
            @month= 1
          end
          @day = 1
          huizhi
          return
        end
      end
    end
    if Input.repeat?(Input::LEFT)      
      case @window_id
      when 0
        @year-=1
        huizhi
        return
      when 1
        if @month>1 
          @month-=1
        else 
          @year-=1
          @month=12
        end
        days= Lifa.days_of_month(@year,@month)
        @day= days
        huizhi
        return
      when 2
        if @index  > @in_min +1 
          @index  -=1
          @day -= 1
        elsif  @index  <= @in_min +1
          if @month>1 
            @month-=1
          else 
            @year-=1
            @month=12
          end
          days= Lifa.days_of_month(@year,@month)
          @day= days
          huizhi
          return
        end
      end
    end
    # R 键被按下的情况下
    if Input.repeat?(Input::R)
      @window_id +=1
      @window_id=@window_id%3
    end
      # L 键被按下的情况下
    if Input.repeat?(Input::L)
      @window_id -=1
      @window_id=@window_id%3
    end

    # 刷新光标矩形
    update_cursor_rect
  end

  
  #--------------------------------------------------------------------------
  # ● 文字的描绘
  #     x     : 描画目标 X 坐标
  #     y     : 描画目标 Y 坐标
  #--------------------------------------------------------------------------
  def draw_txt(wz,txt, x, y)
    @y_win.contents.draw_text(x, y, 32*2, 32, txt) if wz==0
    @m_win.contents.draw_text(x, y, 32, 32, txt) if wz==1
    @d_win.contents.draw_text(x, y, 32, 32, txt) if wz==2
  end
  #--------------------------------------------------------------------------
  # ● 设置光标的位置
  #     index : 新的光标位置
  #--------------------------------------------------------------------------
  def index=(index)
    @index = index
    # 刷新帮助文本 (update_help 定义了继承目标)
    if @d_win.active and @help_window != nil
      update_help
    end
    # 刷新光标矩形
    update_cursor_rect
  end

  #--------------------------------------------------------------------------
  # ● 帮助窗口的设置
  #     help_window : 新的帮助窗口
  #--------------------------------------------------------------------------
  def help_window=(help_window)
    @help_window = help_window
    # 刷新帮助文本 (update_help 定义了继承目标)
    if @d_win.active and @help_window != nil
      update_help
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新光标矩形
  #--------------------------------------------------------------------------
  def update_cursor_rect
    # 光标位置不满 0 的情况下

    case @window_id 
   #@d_win.cursor_rect.set(0,0, 32*4, 0)
    when 0
      
      @m_win.active =false
      @d_win.active =false
      @y_win.active =true
    when 1
   
      @y_win.active =false
      @d_win.active =false
      @m_win.active =true
    when 2
           
      @m_win.active =false
      @y_win.active =false 
      @d_win.active =true
    end
    @y_win.cursor_rect.set(2,0,60, 30)
    @m_win.cursor_rect.set(28,0,30, 30)
  
    if @index  >= 0
        # 计算光标坐标
        cx =  (@index )%7
        cy = ((@index )/7).truncate 
        #   x =  % @column_max * (cursor_width + 32)
     #   y = @index  / @column_max * 32 - @d_win.oy
      # 更新光标矩形
        @d_win.cursor_rect.set(cx*32-3,cy*32+65-32,30, 30)
      #@d_win.active=true 
    #end
  end
end



  #--------------------------------------------------------------------------
  # ● 获取普通文字色
  #--------------------------------------------------------------------------
  def normal_color
    return Color.new(255, 255, 255, 255)
  end
  #--------------------------------------------------------------------------
  # ● 获取无效文字色
  #--------------------------------------------------------------------------
  def disabled_color
    return Color.new(255, 255, 255, 128)
  end
  #--------------------------------------------------------------------------
  # ● 获取系统文字色
  #--------------------------------------------------------------------------
  def system_color
    return Color.new(192, 224, 255, 255)
  end
  #--------------------------------------------------------------------------
  # ● 获取危机文字色
  #--------------------------------------------------------------------------
  def crisis_color
    return Color.new(255, 255, 64, 255)
  end
  #--------------------------------------------------------------------------
  # ● 获取战斗不能文字色
  #--------------------------------------------------------------------------
  def knockout_color
    return Color.new(255, 64, 0)
  end
  
end

  

鸡蛋

鲜花

评论 (0 个评论)

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-10 23:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部