feat: 完善日月食与月掩几何链路并扩展历法接口

- 新增日月食中心带、偏食带、阴影足迹、等时线、食分线及升落边界计算,支持极区与混合食拓扑
- 新增日食单时刻阴影求解器、站心状态查询、批量采样和 ΔT 覆盖接口
- 重构恒星与行星月掩路径,补充有限盘面接触、站心修正、掩带宽度、极区投影及升落边界
- 扩展 SVG 与 GeoJSON 输出,支持详细面板、全球/极区/地球投影、边界闭合、时间标记和拓扑签名
- 扩展日月食候选搜索、局地搜索、沙罗序列预计算与范围外推,补充系列锚点和成员一致性校验
- 补齐古历纪年、儒略历独有闰日、多公历候选、历法改革跨日及精确日期运算接口
- 优化 ΔT、章动、恒星时、月球地平线、事件根搜索和本地星历缓存,降低重复计算开销并提升边界稳定
This commit is contained in:
2026-09-17 12:27:40 +08:00
parent 9ee2163cc7
commit 2bf8478639
428 changed files with 85981 additions and 7998 deletions
+28 -14
View File
@@ -3,6 +3,7 @@ package calendar
import (
"fmt"
"math"
"sync"
"time"
"b612.me/astro/basic"
@@ -58,22 +59,35 @@ func hanQingJieQiPatternDelta(patternID, pos int) int {
return 15
}
// hanQingJieQiPatternExceptions 是未排序的 95 项例外表,先缓存成 map 再查,避免每次线性扫描。
var (
hanQingJieQiPatternExceptionOnce sync.Once
hanQingJieQiPatternExceptionByKey map[int]int
)
func hanQingJieQiPatternExceptionDelta(key int) (int, bool) {
for _, item := range hanQingJieQiPatternExceptions {
if int(item&0x0FFF) != key {
continue
hanQingJieQiPatternExceptionOnce.Do(func() {
m := make(map[int]int, len(hanQingJieQiPatternExceptions))
for _, item := range hanQingJieQiPatternExceptions {
k := int(item & 0x0FFF)
if _, exists := m[k]; exists {
continue
}
switch item >> 12 {
case 0:
m[k] = 12
case 1:
m[k] = 14
case 2:
m[k] = 17
default:
m[k] = 15
}
}
switch item >> 12 {
case 0:
return 12, true
case 1:
return 14, true
case 2:
return 17, true
}
return 15, true
}
return 0, false
hanQingJieQiPatternExceptionByKey = m
})
delta, ok := hanQingJieQiPatternExceptionByKey[key]
return delta, ok
}
func packedBits(data []byte, offset, width int) int {