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
+21
View File
@@ -2,6 +2,7 @@ package svg
import (
"errors"
"fmt"
"math"
"strings"
"testing"
@@ -52,6 +53,26 @@ func TestFindLocalPlanetOccultationSVGsSaturnFiveContacts(t *testing.T) {
}
}
func TestLocalPlanetOccultationSVGUsesGreatestMoonPhase(t *testing.T) {
info := localSaturnOccultation(t)
diagram, err := LocalPlanetOccultationSVG(info, LocalPlanetOccultationSVGOptions{
Location: time.UTC,
})
if err != nil {
t.Fatalf("LocalPlanetOccultationSVG() error = %v", err)
}
appearance := localOccultationMoonAppearanceAt(info.Greatest, info.Observer)
want := fmt.Sprintf(`data-illumination="%.6f" data-bright-limb-position-angle="%.3f"`,
appearance.illumination, appearance.brightLimbPA)
if !strings.Contains(diagram, want) {
t.Fatalf("local planetary SVG does not carry greatest-time Moon appearance %q", want)
}
if appearance.illumination > 1e-6 && appearance.illumination < 1-1e-6 &&
!strings.Contains(diagram, `<clipPath id="local-planet-occultation-moon-overview">`) {
t.Fatal("non-full Moon overview is missing its phase clip path")
}
}
func TestLocalPlanetOccultationSVGStageCentersPreserveDisplayedTangency(t *testing.T) {
event := localPlanetOccultationEventFrame{
label: "C2",