Beispiel #1
0
        /// <summary>
        /// jd 应靠近所要取得的气朔日, 当参数 qs="气" 时,算节气的儒略日
        /// </summary>
        /// <param name="jd"></param>
        /// <param name="qs"></param>
        /// <returns></returns>
        public static double calc(double jd, string qs)
        {
            jd += LunarHelper.J2000;    // C#: 改为常量
            int    i;
            double D;
            string n;

            double[] B  = SSQ.suoKB;
            double   pc = 14;

            if (qs == "气")
            {
                B = SSQ.qiKB; pc = 7;
            }
            double f1 = B[0] - pc, f2 = B[B.Length - 1] - pc, f3 = 2436935;

            if (jd < f1 || jd >= f3)
            {
                // 平气朔表中首个之前,使用现代天文算法。1960.1.1以后,使用现代天文算法 (这一部分调用了qi_high和so_high,所以需星历表支持)
                if (qs == "气")
                {
                    return(Math.Floor(SSQ.qi_high(Math.Floor((jd + pc - 2451259) / 365.2422 * 24) * Math.PI / 12) + 0.5)); //2451259是1999.3.21,太阳视黄经为0,春分.定气计算
                }
                else
                {
                    return(Math.Floor(SSQ.so_high(Math.Floor((jd + pc - 2451551) / 29.5306) * Math.PI * 2) + 0.5)); //2451551是2000.1.7的那个朔日,黄经差为0.定朔计算
                }
            }

            if (jd >= f1 && jd < f2)
            {
                // 平气或平朔
                for (i = 0; i < B.Length; i += 2)
                {
                    if (jd + pc < B[i + 2])
                    {
                        break;
                    }
                }
                D = B[i] + B[i + 1] * Math.Floor((jd + pc - B[i]) / B[i + 1]);
                D = Math.Floor(D + 0.5);
                if (D == 1683460)
                {
                    D++;                       //如果使用太初历计算-103年1月24日的朔日,结果得到的是23日,这里修正为24日(实历)。修正后仍不影响-103的无中置闰。如果使用秦汉历,得到的是24日,本行D不会被执行。
                }
                return(D - LunarHelper.J2000); // C#: 改为常量
            }

            if (jd >= f2 && jd < f3)
            {
                // 定气或定朔
                if (qs == "气")
                {
                    D = Math.Floor(SSQ.qi_low(Math.Floor((jd + pc - 2451259) / 365.2422 * 24) * Math.PI / 12) + 0.5); //2451259是1999.3.21,太阳视黄经为0,春分.定气计算
                    n = SSQ.QB.Substring((int)(Math.Floor((jd - f2) / 365.2422 * 24)), 1);                            //找定气修正值
                }
                else
                {
                    D = Math.Floor(SSQ.so_low(Math.Floor((jd + pc - 2451551) / 29.5306) * Math.PI * 2) + 0.5); //2451551是2000.1.7的那个朔日,黄经差为0.定朔计算
                    n = SSQ.SB.Substring((int)(Math.Floor((jd - f2) / 29.5306)), 1);                           //找定朔修正值
                }
                if (n == "1")
                {
                    return(D + 1);
                }
                if (n == "2")
                {
                    return(D - 1);
                }
                return(D);
            }

            return(0);    // C#: 新增
        }