astro/basic/orbital_nodes_test.go
starainrt 3ffdbe0034
feat: 扩展天文计算能力
- 新增日食、月食、本地可见性、中心线、半影区域、SVG 图示与沙罗周期信息
- 新增行星冲合、留、方照、物理星历、视直径、相位、亮肢角、轨道节点等计算
- 新增木星伽利略卫星位置、现象与接触事件计算
- 新增恒星星表、星座判定、自行修正与观测辅助能力
- 新增 coord、formula、orbit、sundial、lite/sun、lite/moon 等扩展包
- 完善农历年号、月相英文别名、视差角、大气质量、折射、日晷与双星计算
- 增加 NASA、JPL Horizons、IMCCE 等回归测试数据与基线测试
- 重构基础算法文件组织,补充大量公开 API 注释和语义回归测试
- 更新中文和英文 README,补充示例、精度说明、SVG 配图
2026-05-01 22:38:44 +08:00

78 lines
2.6 KiB
Go

package basic
import (
"math"
"testing"
)
func TestOrbitalNodesDescendingOpposesAscending(t *testing.T) {
jde := 2461157.5
testCases := []struct {
name string
ascending func(float64) float64
descending func(float64) float64
}{
{name: "moon", ascending: MoonAscendingNode, descending: MoonDescendingNode},
{name: "mercury", ascending: MercuryAscendingNode, descending: MercuryDescendingNode},
{name: "venus", ascending: VenusAscendingNode, descending: VenusDescendingNode},
{name: "mars", ascending: MarsAscendingNode, descending: MarsDescendingNode},
{name: "jupiter", ascending: JupiterAscendingNode, descending: JupiterDescendingNode},
{name: "saturn", ascending: SaturnAscendingNode, descending: SaturnDescendingNode},
{name: "uranus", ascending: UranusAscendingNode, descending: UranusDescendingNode},
{name: "neptune", ascending: NeptuneAscendingNode, descending: NeptuneDescendingNode},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
ascending := tc.ascending(jde)
descending := tc.descending(jde)
want := ascending + 180
if want >= 360 {
want -= 360
}
if diff := angularDifference(descending, ascending+180); diff > 1e-10 {
t.Fatalf("descending node mismatch: got %.12f want %.12f diff=%.12g", descending, want, diff)
}
})
}
}
func TestOrbitalNodesNFullMatchesDefault(t *testing.T) {
jde := 2461157.5
testCases := []struct {
name string
defaultFn func(float64) float64
truncatedN func(float64, int) float64
}{
{name: "moon", defaultFn: MoonAscendingNode, truncatedN: MoonAscendingNodeN},
{name: "mercury", defaultFn: MercuryAscendingNode, truncatedN: MercuryAscendingNodeN},
{name: "venus", defaultFn: VenusAscendingNode, truncatedN: VenusAscendingNodeN},
{name: "mars", defaultFn: MarsAscendingNode, truncatedN: MarsAscendingNodeN},
{name: "jupiter", defaultFn: JupiterAscendingNode, truncatedN: JupiterAscendingNodeN},
{name: "saturn", defaultFn: SaturnAscendingNode, truncatedN: SaturnAscendingNodeN},
{name: "uranus", defaultFn: UranusAscendingNode, truncatedN: UranusAscendingNodeN},
{name: "neptune", defaultFn: NeptuneAscendingNode, truncatedN: NeptuneAscendingNodeN},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
got := tc.defaultFn(jde)
gotN := tc.truncatedN(jde, -1)
if diff := angularDifference(got, gotN); diff > 1e-10 {
t.Fatalf("full-series N mismatch: got %.12f want %.12f diff=%.12g", gotN, got, diff)
}
})
}
}
func angularDifference(a, b float64) float64 {
diff := math.Mod(a-b, 360)
if diff < -180 {
diff += 360
}
if diff > 180 {
diff -= 360
}
return math.Abs(diff)
}