41 lines
1.1 KiB
Go
41 lines
1.1 KiB
Go
|
|
package tools
|
||
|
|
|
||
|
|
import "math"
|
||
|
|
|
||
|
|
// DistanceUnit 距离输入单位 / a unit accepted for distance input.
|
||
|
|
type DistanceUnit uint8
|
||
|
|
|
||
|
|
const (
|
||
|
|
// DistanceParsec 秒差距 / parsec.
|
||
|
|
DistanceParsec DistanceUnit = iota
|
||
|
|
// DistanceLightYear 光年 / light-year.
|
||
|
|
DistanceLightYear
|
||
|
|
// DistanceAU 天文单位 / astronomical unit.
|
||
|
|
DistanceAU
|
||
|
|
)
|
||
|
|
|
||
|
|
// 天文单位与光年取 IAU 定义值,秒差距由精确关系 648000/π 天文单位导出。
|
||
|
|
const (
|
||
|
|
AstronomicalUnitKilometers = 149597870.7
|
||
|
|
LightYearKilometers = 9460730472580.8
|
||
|
|
parsecAU = 648000 / math.Pi
|
||
|
|
)
|
||
|
|
|
||
|
|
// DistanceToParsecs 把给定单位的距离换算为秒差距 / converts a distance in the given unit to parsecs.
|
||
|
|
//
|
||
|
|
// 非正数、NaN 与未知单位返回 NaN。
|
||
|
|
func DistanceToParsecs(value float64, unit DistanceUnit) float64 {
|
||
|
|
if math.IsNaN(value) || math.IsInf(value, 0) || value <= 0 {
|
||
|
|
return math.NaN()
|
||
|
|
}
|
||
|
|
switch unit {
|
||
|
|
case DistanceParsec:
|
||
|
|
return value
|
||
|
|
case DistanceLightYear:
|
||
|
|
return value * LightYearKilometers / AstronomicalUnitKilometers / parsecAU
|
||
|
|
case DistanceAU:
|
||
|
|
return value / parsecAU
|
||
|
|
}
|
||
|
|
return math.NaN()
|
||
|
|
}
|