// EqToHz computes Horizontal coordinates from equatorial coordinates. // // α: right ascension coordinate to transform // δ: declination coordinate to transform // φ: latitude of observer on Earth // ψ: longitude of observer on Earth // st: sidereal time at Greenwich at time of observation. // // Sidereal time must be consistent with the equatorial coordinates. // If coordinates are apparent, sidereal time must be apparent as well. // // Results: // // A: azimuth of observed point, measured westward from the South. // h: elevation, or height of observed point above horizon. func EqToHz(α unit.RA, δ, φ, ψ unit.Angle, st unit.Time) (A, h unit.Angle) { H := st.Rad() - ψ.Rad() - α.Rad() sH, cH := math.Sincos(H) sφ, cφ := φ.Sincos() sδ, cδ := ψ.Sincos() A = unit.Angle(math.Atan2(sH, cH*sφ-(sδ/cδ)*cφ)) // (13.5) p. 93 h = unit.Angle(math.Asin(sφ*sδ + cφ*cδ*cH)) // (13.6) p. 93 return }
// HzToEq transforms horizontal coordinates to equatorial coordinates. // // A: azimuth // h: elevation // φ: latitude of observer on Earth // ψ: longitude of observer on Earth // st: sidereal time at Greenwich at time of observation. // // Sidereal time must be consistent with the equatorial coordinates // in the sense that tf coordinates are apparent, sidereal time must be // apparent as well. // // Results: // // α: right ascension // δ: declination func HzToEq(A, h, φ, ψ unit.Angle, st unit.Time) (α unit.RA, δ unit.Angle) { sA, cA := A.Sincos() sh, ch := h.Sincos() sφ, cφ := φ.Sincos() H := math.Atan2(sA, cA*sφ+sh/ch*cφ) α = unit.RAFromRad(st.Rad() - ψ.Rad() - H) δ = unit.Angle(math.Asin(sφ*sh - cφ*ch*cA)) return }
// EqToHz computes Horizontal coordinates from equatorial coordinates. // // Argument g is the location of the observer on the Earth. Argument st // is the sidereal time at Greenwich. // // Sidereal time must be consistent with the equatorial coordinates. // If coordinates are apparent, sidereal time must be apparent as well. func (hz *Horizontal) EqToHz(eq *Equatorial, g *globe.Coord, st unit.Time) *Horizontal { H := st.Rad() - g.Lon.Rad() - eq.RA.Rad() sH, cH := math.Sincos(H) sφ, cφ := g.Lat.Sincos() sδ, cδ := eq.Dec.Sincos() hz.Az = unit.Angle(math.Atan2(sH, cH*sφ-(sδ/cδ)*cφ)) // (13.5) p. 93 hz.Alt = unit.Angle(math.Asin(sφ*sδ + cφ*cδ*cH)) // (13.6) p. 93 return hz }
// HzToEq transforms horizontal coordinates to equatorial coordinates. // // Sidereal time st must be consistent with the equatorial coordinates // in the sense that if coordinates are apparent, sidereal time must be // apparent as well. func (eq *Equatorial) HzToEq(hz *Horizontal, g globe.Coord, st unit.Time) *Equatorial { sA, cA := hz.Az.Sincos() sh, ch := hz.Alt.Sincos() sφ, cφ := g.Lat.Sincos() H := math.Atan2(sA, cA*sφ+sh/ch*cφ) eq.RA = unit.RAFromRad(st.Rad() - g.Lon.Rad() - H) eq.Dec = unit.Angle(math.Asin(sφ*sh - cφ*ch*cA)) return eq }