From 201b76d9725df81c828845a59c9077c5d5854c6e Mon Sep 17 00:00:00 2001 From: We-unite <3205135446@qq.com> Date: Thu, 13 Feb 2025 22:57:19 +0800 Subject: 无中气置闰,每个月的界限是按日,而非按朔的时刻 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/List.cpp | 9 +++++++-- src/calendar.cpp | 43 ++++++++----------------------------------- 2 files changed, 15 insertions(+), 37 deletions(-) diff --git a/src/List.cpp b/src/List.cpp index b4600bc..67af9ce 100644 --- a/src/List.cpp +++ b/src/List.cpp @@ -1,4 +1,5 @@ #include "calendar.h" +#include List::List() { // 为方便初始化,链表头结点设为空节点,注意不要使用 @@ -116,8 +117,12 @@ void List::Run() { int i = 0, j = 0; int mon_index = 11; bool flag; - while (later(zhongqi_vec[12], shuori_vec[i])) { - i++; + point *p = head->next->next; + + while (!(p->isZhongqi && p->JieqiIndex == 24)) { + if (p->isShuo) + i++; + p = p->next; } if (i == 13) { diff --git a/src/calendar.cpp b/src/calendar.cpp index dcb96d7..7f64baa 100644 --- a/src/calendar.cpp +++ b/src/calendar.cpp @@ -50,57 +50,30 @@ void JieQi(Date *date) { t = julian.getJulianKiloYear(time); t_end = julian.getJulianKiloYear(time + day); - //定春分 if (target_angle == 0) { - /* 春分太阳地心视黄经为0,一般二分法不便于计算 - * 因而限定范围为[355,360)∪(0,5],即春分前后各5度 - * 当t_end时刻太阳地心视黄经在[355,360)时,证明春分在后边,t和t_end前进24h - */ - while (p.sun_longitude(t_end) < 360 && - p.sun_longitude(t_end) > 355) { + while (p.sun_longitude(t_end) > 300) { time += day; t = t_end; t_end = julian.getJulianKiloYear(time + day); } - /* 循环体time每次在已经计算出的上一节气基础上前进12日,理论上春分在t_end之后 - * 当跳出上一while循环时理论上春分时刻正在t与t_end之间 - * 为保险起见,添加这个循环 - * 当t时刻太阳地心视黄经在[0,5]时,证明春分在前边,t和t_end后退24h - */ - while (p.sun_longitude(t) < 5) { - time -= day; - t_end = t; - t = julian.getJulianKiloYear(time); + if (!(p.sun_longitude(t) > 300 && p.sun_longitude(t_end) < 2)) { + fprintf(stderr, "Error: Can't find the target angle\n"); + exit(1); } - - //二分法计算春分 while (t_end - t > delta) { t_middle = (t + t_end) / 2; - if (p.sun_longitude(t_middle) < 360 && - p.sun_longitude(t_middle) > 355) { - t = t_middle; - } else { + if (p.sun_longitude(t_middle) < 2) { t_end = t_middle; + } else { + t = t_middle; } } - } - //其他情况 - else { - //当t_end时刻太阳地心视黄经小于目标角度,节气在后,t和t_end前进24h + } else { while (p.sun_longitude(t_end) < target_angle) { time += day; t = t_end; t_end = julian.getJulianKiloYear(time + day); } - - //当t时刻太阳地心视黄经大于目标角度,节气在前,t和t_end后退24h - //该循环也是一个保险循环 - while (p.sun_longitude(t) > target_angle) { - time -= day; - t_end = t; - t = julian.getJulianKiloYear(time); - } - while (t_end - t > delta) { t_middle = (t + t_end) / 2; if (p.sun_longitude(t_middle) < target_angle) { -- cgit v1.2.3-70-g09d2