feat: 完善日月食与月掩几何链路并扩展历法接口
- 新增日月食中心带、偏食带、阴影足迹、等时线、食分线及升落边界计算,支持极区与混合食拓扑 - 新增日食单时刻阴影求解器、站心状态查询、批量采样和 ΔT 覆盖接口 - 重构恒星与行星月掩路径,补充有限盘面接触、站心修正、掩带宽度、极区投影及升落边界 - 扩展 SVG 与 GeoJSON 输出,支持详细面板、全球/极区/地球投影、边界闭合、时间标记和拓扑签名 - 扩展日月食候选搜索、局地搜索、沙罗序列预计算与范围外推,补充系列锚点和成员一致性校验 - 补齐古历纪年、儒略历独有闰日、多公历候选、历法改革跨日及精确日期运算接口 - 优化 ΔT、章动、恒星时、月球地平线、事件根搜索和本地星历缓存,降低重复计算开销并提升边界稳定
This commit is contained in:
@@ -2,6 +2,7 @@ package svg
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
"strings"
|
||||
"testing"
|
||||
@@ -56,6 +57,54 @@ func TestFindLocalStarOccultationSVGsHR4799(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestLocalStarOccultationSVGUsesGreatestMoonPhase(t *testing.T) {
|
||||
info := localHR4799Occultation(t)
|
||||
diagram, err := LocalStarOccultationSVG(info, hr4799StarCoordinate(), LocalStarOccultationSVGOptions{
|
||||
Location: time.UTC,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("LocalStarOccultationSVG() 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 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-star-occultation-moon-overview">`) {
|
||||
t.Fatal("non-full Moon overview is missing its phase clip path")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLocalOccultationMoonPhasePathSelectsIlluminatedArea(t *testing.T) {
|
||||
gibbous := localOccultationMoonPhasePath(100, 0.75)
|
||||
if !strings.Contains(gibbous, `A 50.000 100.000 0 0 1 0 -100.000`) {
|
||||
t.Fatalf("waxing or waning gibbous terminator uses the wrong arc: %s", gibbous)
|
||||
}
|
||||
crescent := localOccultationMoonPhasePath(100, 0.25)
|
||||
if !strings.Contains(crescent, `A 50.000 100.000 0 0 0 0 -100.000`) {
|
||||
t.Fatalf("crescent terminator uses the wrong arc: %s", crescent)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLocalOccultationMoonSVGRotationUsesNorthUpEastLeft(t *testing.T) {
|
||||
tests := []struct {
|
||||
positionAngle float64
|
||||
rotation float64
|
||||
}{
|
||||
{positionAngle: 0, rotation: -90},
|
||||
{positionAngle: 90, rotation: -180},
|
||||
{positionAngle: 180, rotation: -270},
|
||||
{positionAngle: 270, rotation: -360},
|
||||
}
|
||||
for _, test := range tests {
|
||||
if got := localOccultationMoonSVGRotation(test.positionAngle); got != test.rotation {
|
||||
t.Fatalf("bright-limb PA %.1f rotation = %.1f, want %.1f", test.positionAngle, got, test.rotation)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestLocalStarOccultationSVGEnglishAndCustomText(t *testing.T) {
|
||||
info := localHR4799Occultation(t)
|
||||
diagram, err := LocalStarOccultationSVG(info, hr4799StarCoordinate(), LocalStarOccultationSVGOptions{
|
||||
|
||||
Reference in New Issue
Block a user