/// <summary> /// 把太阳月亮信息形成纯文本字符串 /// </summary> /// <param name="fs">是否显示ΔT, 黄经章等信息</param> /// <returns></returns> public string toText(double fs) { StringBuilder sb = new StringBuilder(); sb.Append("平太阳 " + JD.timeStr(this.pty) + " 真太阳 " + JD.timeStr(this.zty) + "\r\n"); sb.Append("时差 " + LunarHelper.m2fm(this.sc * 86400, 2, 1) + " 月亮被照亮 " + (this.mIll * 100).ToString("F2") + "% "); sb.Append("\r\n"); sb.Append("\r\n表一 月亮 太阳\r\n"); sb.Append("视黄经 " + LunarHelper.rad2str(this.mHJ, 0) + " " + LunarHelper.rad2str(this.sHJ, 0) + "\r\n"); sb.Append("视黄纬 " + LunarHelper.rad2str(this.mHW, 0) + " " + LunarHelper.rad2str(this.sHW, 0) + "\r\n"); sb.Append("视赤经 " + LunarHelper.rad2str(this.mCJ, 1) + " " + LunarHelper.rad2str(this.sCJ, 1) + "\r\n"); sb.Append("视赤纬 " + LunarHelper.rad2str(this.mCW, 0) + " " + LunarHelper.rad2str(this.sCW, 0) + "\r\n"); sb.Append("距离 " + this.mR.ToString("F0") + "千米 " + this.sR.ToString("F6") + "AU" + "\r\n"); sb.Append("\r\n表二 月亮 太阳\r\n"); sb.Append("方位角 " + LunarHelper.rad2str(this.mPJ, 0) + " " + LunarHelper.rad2str(this.sPJ, 0) + "\r\n"); sb.Append("高度角 " + LunarHelper.rad2str(this.mPW, 0) + " " + LunarHelper.rad2str(this.sPW, 0) + "\r\n"); sb.Append("时角 " + LunarHelper.rad2str(this.mShiJ, 0) + " " + LunarHelper.rad2str(this.sShiJ, 0) + "\r\n"); sb.Append("视半径(观测点) " + LunarHelper.m2fm(this.mRad, 2, 0) + " " + LunarHelper.m2fm(this.sRad, 2, 0) + "\r\n"); if (fs != 0) { sb.Append("\r\n力学时 " + JD.setFromJD_str(this.T + LunarHelper.J2000)); sb.Append(" ΔT=" + (this.dt * 86400).ToString("F1") + "秒\r\n"); sb.Append("黄经章 " + (this.dL / LunarHelper.pi2 * 360 * 3600).ToString("F2") + "\" "); sb.Append("交角章 " + (this.dE / LunarHelper.pi2 * 360 * 3600).ToString("F2") + "\" "); sb.Append("\r\nε=" + LunarHelper.trim(LunarHelper.rad2str(this.E, 0))); } return(sb.ToString()); }
/// <summary> /// 命理八字计算(普通计算, 不转换为当地真太阳时), 并保存到日对象 ob 中 /// </summary> /// <param name="jd">格林尼治UT(J2000起算)</param> /// <param name="J">本地经度</param> /// <param name="ob">日对象</param> /// <param name="southernHemisphere">南半球的标志</param> public static void mingLiBaZiNormal(double jd, double J, OB ob, BaZiTypeS baziTypeS) { int i; string c; double v; double jd2 = jd + JD.deltatT2(jd); // 力学时 double w = XL.S_aLon(jd2 / 36525, -1); // 此刻太阳视黄经 double k = LunarHelper.int2((w / LunarHelper.pi2 * 360 + 45 + 15 * 360) / 30); // 1984年立春起算的节气数(不含中气) //---------------------------------------------------------------------------------------------- // C#: 注: 仅有下列代码段与 mingLiBaZi 方法中的代码不同, 其余部分都是相同的 //---------------------------------------------------------------------------------------------- jd += 0 - J / Math.PI / 2; // 将格林尼治UT(J2000起算), 转换为本地时间, 不必考虑真太阳与平太阳时之间的时差 ob.bz_zty = ""; // 真太阳时置空串 ob.bz_pty = JD.timeStr(jd); // 计算平太阳时 jd += 13d / 24d; // 转为前一日23点起算(原jd为本日中午12点起算) // C#: 注意数据类型 double D = Math.Floor(jd), SC = LunarHelper.int2((jd - D) * 12); // 日数与时辰 v = LunarHelper.int2(k / 12 + 6000000); ob.bz_jn = obb.Gan[(int)(v % 10)] + obb.Zhi[(int)(v % 12)]; v = k + 2 + 60000000; ob.bz_jy = obb.Gan[(int)(v % 10)] + obb.Zhi[(int)(v % 12)]; // C#: 新增的代码段, 计算南半球八字(仅纪月不同) switch (baziTypeS) { case BaZiTypeS.TianChongDiChong: ob.bz_jy = obb.Gan[(int)((v + 4) % 10)] + obb.Zhi[(int)((v + 6) % 12)]; break; case BaZiTypeS.TianKeDiChong: ob.bz_jy = obb.Gan[(int)((v + 6) % 10)] + obb.Zhi[(int)((v + 6) % 12)]; break; case BaZiTypeS.TianTongDiChong: ob.bz_jy = obb.Gan[(int)((v + 0) % 10)] + obb.Zhi[(int)((v + 6) % 12)]; break; default: break; } v = D - 6 + 9000000; ob.bz_jr = obb.Gan[(int)(v % 10)] + obb.Zhi[(int)(v % 12)]; v = (D - 1) * 12 + 90000000 + SC; ob.bz_js = obb.Gan[(int)(v % 10)] + obb.Zhi[(int)(v % 12)]; v -= SC; ob.bz_JS = ""; // 全天纪时表 for (i = 0; i < 13; i++) { // 一天中包含有13个纪时 c = obb.Gan[(int)((v + i) % 10)] + obb.Zhi[(int)((v + i) % 12)]; // 各时辰的八字 if (SC == i) { ob.bz_js = c; // c = "<font color=red>" + c + "</font>"; //红色显示这时辰 // C#: 注释, 即取消格式显示 } ob.bz_JS += (i != 0 ? " " : "") + c; } }
/// <summary> /// 多天升中降计算,jd是当地起始儒略日(中午时刻),sq是时区 /// </summary> /// <param name="jd"></param> /// <param name="n"></param> /// <param name="Jdl"></param> /// <param name="Wdl"></param> /// <param name="sq"></param> public static void calcRTS(double jd, double n, double Jdl, double Wdl, double sq) { int i; double c; LunarInfoListT <double> r; // C#: 不需要实例化, 因此注释语句的后半部分: = new LunarInfoListT<double>(3, 0d); // C#: 由于将 rts 设置为自动实现的公共属性, 故添加了以下代码段来初始化 if (SZJ.rts == null) { SZJ.rts = new LunarInfoListT <LunarInfoListT <double> >(); } if (SZJ.rts.Count == 0) { for (i = 0; i < 31; i++) { SZJ.rts.Add(new LunarInfoListT <double>()); // SZJ.rts[i] = new LunarInfoListT(); } } SZJ.L = Jdl; SZJ.fa = Wdl; sq /= 24; //设置站点参数 for (i = 0; i < n; i++) { r = SZJ.rts[i]; r.Ms = r.Mz = r.Mj = ""; } for (i = -1; i <= n; i++) { if (i >= 0 && i < n) { //太阳 r = SZJ.St(jd + i + sq); ((SZJ.rts[i])).s = JD.timeStr(r.s__ - sq); //升 ((SZJ.rts[i])).z = JD.timeStr(r.z__ - sq); //中 ((SZJ.rts[i])).j = JD.timeStr(r.j__ - sq); //降 ((SZJ.rts[i])).c = JD.timeStr(r.c__ - sq); //晨 ((SZJ.rts[i])).h = JD.timeStr(r.h__ - sq); //昏 ((SZJ.rts[i])).ch = JD.timeStr(r.h__ - r.c__ - 0.5); //光照时间,timeStr()内部+0.5,所以这里补上-0.5 ((SZJ.rts[i])).sj = JD.timeStr(r.j__ - r.s__ - 0.5); //昼长 } r = SZJ.Mt(jd + i + sq); //月亮 c = LunarHelper.int2(r.s__ - sq + 0.5) - jd; if (c >= 0 && c < n) { (SZJ.rts[(int)c]).Ms = JD.timeStr(r.s__ - sq); } c = LunarHelper.int2(r.z__ - sq + 0.5) - jd; if (c >= 0 && c < n) { (SZJ.rts[(int)c]).Mz = JD.timeStr(r.z__ - sq); } c = LunarHelper.int2(r.j__ - sq + 0.5) - jd; if (c >= 0 && c < n) { (SZJ.rts[(int)c]).Mj = JD.timeStr(r.j__ - sq); } } SZJ.rts.dn = n; }
/// <summary> /// 把太阳月亮信息形成 HTML 字符串 /// </summary> /// <param name="fs">是否显示ΔT, 黄经章等信息</param> /// <returns></returns> public string toHTML(double fs) { StringBuilder sb = new StringBuilder(); sb.Append("<table width='100%' cellspacing=1 cellpadding=0 bgcolor='#FFC0C0'>"); sb.Append("<tr><td bgcolor=white align=center>"); sb.Append("平太阳 " + JD.timeStr(this.pty) + " 真太阳 <font color=red>" + JD.timeStr(this.zty) + "</font><br>"); sb.Append("时差 " + LunarHelper.m2fm(this.sc * 86400, 2, 1) + " 月亮被照亮 " + (this.mIll * 100).ToString("F2") + "% "); sb.Append("</td></tr>"); sb.Append("<tr><td bgcolor=white><center><pre style='margin-top: 0; margin-bottom: 0'><font color=blue><b>表一 月亮 太阳</b></font>\r\n"); sb.Append("视黄经 " + LunarHelper.rad2str(this.mHJ, 0) + " " + LunarHelper.rad2str(this.sHJ, 0) + "\r\n"); sb.Append("视黄纬 " + LunarHelper.rad2str(this.mHW, 0) + " " + LunarHelper.rad2str(this.sHW, 0) + "\r\n"); sb.Append("视赤经 " + LunarHelper.rad2str(this.mCJ, 1) + " " + LunarHelper.rad2str(this.sCJ, 1) + "\r\n"); sb.Append("视赤纬 " + LunarHelper.rad2str(this.mCW, 0) + " " + LunarHelper.rad2str(this.sCW, 0) + "\r\n"); sb.Append("距离 " + this.mR.ToString("F0") + "千米 " + this.sR.ToString("F6") + "AU" + "\r\n"); sb.Append("</pre></center></td></tr>"); sb.Append("<tr><td bgcolor=white><center><pre style='margin-top: 0; margin-bottom: 0'><font color=blue><b>表二 月亮 太阳</b></font>\r\n"); sb.Append("方位角 " + LunarHelper.rad2str(this.mPJ, 0) + " " + LunarHelper.rad2str(this.sPJ, 0) + "\r\n"); sb.Append("高度角 " + LunarHelper.rad2str(this.mPW, 0) + " " + LunarHelper.rad2str(this.sPW, 0) + "\r\n"); sb.Append("时角 " + LunarHelper.rad2str(this.mShiJ, 0) + " " + LunarHelper.rad2str(this.sShiJ, 0) + "\r\n"); sb.Append("视半径(观测点) " + LunarHelper.m2fm(this.mRad, 2, 0) + " " + LunarHelper.m2fm(this.sRad, 2, 0) + "\r\n"); sb.Append("</pre></center></td></tr>"); if (fs != 0) { sb.Append("<tr><td bgcolor=white align=center>"); sb.Append("力学时 " + JD.setFromJD_str(this.T + LunarHelper.J2000)); sb.Append(" ΔT=" + (this.dt * 86400).ToString("F1") + "秒<br>"); sb.Append("黄经章 " + (this.dL / LunarHelper.pi2 * 360 * 3600).ToString("F2") + "\" "); sb.Append("交角章 " + (this.dE / LunarHelper.pi2 * 360 * 3600).ToString("F2") + "\" "); sb.Append("ε=" + LunarHelper.trim(LunarHelper.rad2str(this.E, 0))); sb.Append("</td></tr>"); } sb.Append("</table>"); return(sb.ToString()); }
/// <summary> /// 计算公历某一个月的"公农回"三合历, 并把相关信息保存到月对象 lun, 以及日对象 lun[?] 中 /// </summary> /// <param name="By">要计算月历的年</param> /// <param name="Bm">要计算月历的月</param> public void yueLiCalc(int By, int Bm) { int i, j; double c, Bd0, Bdn; // 日历物件初始化 JD.h = 12; JD.m = 0; JD.s = 0.1; JD.Y = By; JD.M = Bm; JD.D = 1; Bd0 = LunarHelper.int2(JD.toJD()) - LunarHelper.J2000; // 公历某年的月首,中午 JD.M++; if (JD.M > 12) { JD.Y++; JD.M = 1; } // C#: 如果月份大于 12, 则年数 + 1, 月数取 1 Bdn = LunarHelper.int2(JD.toJD()) - LunarHelper.J2000 - Bd0; // 本月天数(公历) this.w0 = (Bd0 + LunarHelper.J2000 + 1) % 7; //本月第一天的星期 this.y = By; // 公历年份 this.m = Bm; // 公历月分 this.d0 = Bd0; this.dn = Bdn; // 所属公历年对应的农历干支纪年 c = By - 1984 + 9000; this.Ly = obb.Gan[(int)(c % 10)] + obb.Zhi[(int)(c % 12)]; //干支纪年 this.ShX = obb.ShX[(int)(c % 12)]; // 该年对应的生肖 this.nianhao = obb.getNH(By); double D, w; OB ob, ob2; // 循环提取各日信息 for (i = 0, j = 0; i < Bdn; i++) { ob = (this.lun[i]); ob.d0 = Bd0 + i; // 儒略日,北京时12:00 ob.di = i; // 公历月内日序数 ob.y = By; // 公历年 ob.m = Bm; // 公历月 ob.dn = Bdn; // 公历月天数 ob.week0 = this.w0; // 月首的星期 ob.week = (this.w0 + i) % 7; // 当前日的星期 ob.weeki = LunarHelper.int2((this.w0 + i) / 7); // 本日所在的周序号 ob.weekN = LunarHelper.int2((this.w0 + Bdn - 1) / 7) + 1; // 本月的总周数 JD.setFromJD(ob.d0 + LunarHelper.J2000); ob.d = (int)JD.D; //公历日名称 // 农历月历 if (SSQ.ZQ.Count == 0 || ob.d0 < SSQ.ZQ[0] || ob.d0 >= SSQ.ZQ[24]) // 如果d0已在计算农历范围内则不再计算 { SSQ.calcY(ob.d0); } int mk = (int)LunarHelper.int2((ob.d0 - SSQ.HS[0]) / 30); if (mk < 13 && SSQ.HS[mk + 1] <= ob.d0) { mk++; // 农历所在月的序数 } ob.Ldi = (int)(ob.d0 - SSQ.HS[mk]); // 距农历月首的编移量,0对应初一 ob.Ldc = obb.rmc[(int)(ob.Ldi)]; // 农历日名称 ob.cur_dz = ob.d0 - SSQ.ZQ[0]; // 距冬至的天数 ob.cur_xz = ob.d0 - SSQ.ZQ[12]; // 距夏至的天数 ob.cur_lq = ob.d0 - SSQ.ZQ[15]; // 距立秋的天数 ob.cur_mz = ob.d0 - SSQ.ZQ[11]; // 距芒种的天数 ob.cur_xs = ob.d0 - SSQ.ZQ[13]; // 距小暑的天数 if (ob.d0 == SSQ.HS[mk] || ob.d0 == Bd0) { // 月的信息 ob.Lmc = SSQ.ym[mk]; // 月名称 ob.Ldn = SSQ.dx[mk]; // 月大小 ob.Lleap = (SSQ.leap != 0 && SSQ.leap == mk) ? "闰" : ""; // 闰状况 ob.Lmc2 = mk < 13 ? SSQ.ym[mk + 1] : "未知"; // 下个月名称,判断除夕时要用到 } else { ob2 = (this.lun[i - 1]); ob.Lmc = ob2.Lmc; ob.Ldn = ob2.Ldn; ob.Lleap = ob2.Lleap; ob.Lmc2 = ob2.Lmc2; } int qk = (int)LunarHelper.int2((ob.d0 - SSQ.ZQ[0] - 7) / 15.2184); if (qk < 23 && ob.d0 >= SSQ.ZQ[qk + 1]) { qk++; //节气的取值范围是0-23 } if (ob.d0 == SSQ.ZQ[qk]) { ob.Ljq = obb.jqmc[qk]; } else { ob.Ljq = ""; } ob.yxmc = ob.yxjd = ob.yxsj = ""; // 月相名称,月相时刻(儒略日),月相时间串 ob.jqmc = ob.jqjd = ob.jqsj = ""; // 定气名称,节气时刻(儒略日),节气时间串 // 干支纪年处理 // 以立春为界定年首 D = SSQ.ZQ[3] + (ob.d0 < SSQ.ZQ[3] ? -365 : 0) + 365.25 * 16 - 35; //以立春为界定纪年 ob.Lyear = Math.Floor(D / 365.2422 + 0.5); //农历纪年(10进制,1984年起算) // 以下几行以正月初一定年首 D = SSQ.HS[2]; // 一般第3个月为春节 for (j = 0; j < 14; j++) { // 找春节 if (SSQ.ym[j] != "正") { continue; } D = SSQ.HS[j]; if (ob.d0 < D) { D -= 365; break; } // 无需再找下一个正月 } D = D + 5810; // 计算该年春节与1984年平均春节(立春附近)相差天数估计 ob.Lyear0 = Math.Floor(D / 365.2422 + 0.5); // 农历纪年(10进制,1984年起算) D = ob.Lyear + 9000; ob.Lyear2 = obb.Gan[(int)(D % 10)] + obb.Zhi[(int)(D % 12)]; // 干支纪年(立春) D = ob.Lyear0 + 9000; ob.Lyear3 = obb.Gan[(int)(D % 10)] + obb.Zhi[(int)(D % 12)]; // 干支纪年(正月) ob.Lyear4 = ob.Lyear0 + 1984 + 2698; // 黄帝纪年 // 纪月处理,1998年12月7(大雪)开始连续进行节气计数,0为甲子 mk = (int)LunarHelper.int2((ob.d0 - SSQ.ZQ[0]) / 30.43685); if (mk < 12 && ob.d0 >= SSQ.ZQ[2 * mk + 1]) { mk++; //相对大雪的月数计算,mk的取值范围0-12 } D = mk + LunarHelper.int2((SSQ.ZQ[12] + 390) / 365.2422) * 12 + 900000; //相对于1998年12月7(大雪)的月数,900000为正数基数 ob.Lmonth = D % 12; ob.Lmonth2 = obb.Gan[(int)(D % 10)] + obb.Zhi[(int)(D % 12)]; // 纪日,2000年1月7日起算 D = ob.d0 - 6 + 9000000; ob.Lday2 = obb.Gan[(int)(D % 10)] + obb.Zhi[(int)(D % 12)]; // 星座 mk = (int)LunarHelper.int2((ob.d0 - SSQ.ZQ[0] - 15) / 30.43685); if (mk < 11 && ob.d0 >= SSQ.ZQ[2 * mk + 2]) { mk++; //星座所在月的序数,(如果j=13,ob.d0不会超过第14号中气) } ob.XiZ = obb.XiZ[(int)((mk + 12) % 12)] + "座"; // 回历 oba.getHuiLi(ob.d0, ob); // 节日 ob.A = ob.B = ob.C = ""; ob.Fjia = 0; oba.getDayName(ob, ob); //公历 obb.getDayName(ob, ob); //农历 } // 以下是月相与节气的处理 double d, jd2 = Bd0 + JD.deltatT2(Bd0) - 8d / 24d; int xn; // 月相查找 w = XL.MS_aLon(jd2 / 36525, 10, 3); w = LunarHelper.int2((w - 0.78) / Math.PI * 2) * Math.PI / 2; do { d = obb.so_accurate(w); D = LunarHelper.int2(d + 0.5); xn = (int)LunarHelper.int2(w / LunarHelper.pi2 * 4 + 4000000.01) % 4; w += LunarHelper.pi2 / 4; if (D >= Bd0 + Bdn) { break; } if (D < Bd0) { continue; } ob = (this.lun[(int)(D - Bd0)]); ob.yxmc = obb.yxmc[xn]; // 取得月相名称 ob.yxjd = d.ToString(); ob.yxsj = JD.timeStr(d); } while (D + 5 < Bd0 + Bdn); // 节气查找 w = XL.S_aLon(jd2 / 36525, 3); w = LunarHelper.int2((w - 0.13) / LunarHelper.pi2 * 24) * LunarHelper.pi2 / 24; do { d = obb.qi_accurate(w); D = LunarHelper.int2(d + 0.5); xn = (int)LunarHelper.int2(w / LunarHelper.pi2 * 24 + 24000006.01) % 24; w += LunarHelper.pi2 / 24; if (D >= Bd0 + Bdn) { break; } if (D < Bd0) { continue; } ob = (this.lun[(int)(D - Bd0)]); ob.jqmc = obb.jqmc[xn]; // 取得节气名称 ob.jqjd = d.ToString(); ob.jqsj = JD.timeStr(d); } while (D + 12 < Bd0 + Bdn); // C#: 转换时新增的代码行 this.CalcRiJianThisMonth(); // 计算本月所有日期的日十二建信息 }