feat: 扩展天文计算能力
- 新增日食、月食、本地可见性、中心线、半影区域、SVG 图示与沙罗周期信息 - 新增行星冲合、留、方照、物理星历、视直径、相位、亮肢角、轨道节点等计算 - 新增木星伽利略卫星位置、现象与接触事件计算 - 新增恒星星表、星座判定、自行修正与观测辅助能力 - 新增 coord、formula、orbit、sundial、lite/sun、lite/moon 等扩展包 - 完善农历年号、月相英文别名、视差角、大气质量、折射、日晷与双星计算 - 增加 NASA、JPL Horizons、IMCCE 等回归测试数据与基线测试 - 重构基础算法文件组织,补充大量公开 API 注释和语义回归测试 - 更新中文和英文 README,补充示例、精度说明、SVG 配图
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user