Source code for schedview.sphere
import numpy as np
[docs]
def offset_sep_bear(ra, decl, sep, bearing, degrees=False):
"""Calculate coordinates after an offset by a separation.
Parameters
----------
ra : `float`
R.A. as a float in radians
decl : `float`
declination as a float in radians
sep : `float`
separation in radians
bearing : `float`
bearing (east of north) in radians
degrees : `bool`
arguments and returnes are in degrees (False for radians).
Returns
-------
ra : `float`
R.A. Right Ascension
decl : `float`
declination
"""
# Use cos formula:
# cos(a)=cos(b)*cos(c)+sin(b)*sin(c)*cos(A)
if degrees:
ra = np.radians(ra)
decl = np.radians(decl)
sep = np.radians(sep)
bearing = np.radians(bearing)
np_sep = np.pi / 2 - decl
new_np_sep = np.arccos(np.cos(np_sep) * np.cos(sep) + np.sin(np_sep) * np.sin(sep) * np.cos(bearing))
new_decl = np.pi / 2 - new_np_sep
# use tan = sin/cos, sin rule to get sin, cos rule to get cos,
# cancel sin(np_sep) to avoid problems when new_np_sep=90 deg.
dra = np.arctan2(
np.sin(sep) * np.sin(bearing) * np.sin(np_sep),
np.cos(sep) - np.cos(new_np_sep) * np.cos(np_sep),
)
# Hack to match astropy behaviour at poles
near_pole = np.abs(np.cos(decl)) < 1e-12
if near_pole:
dra = np.pi / 2 + np.cos(np_sep) * (np.pi / 2 - bearing)
new_ra = ra + dra
if degrees:
new_ra = np.degrees(new_ra)
new_decl = np.degrees(new_decl)
return new_ra, new_decl
[docs]
def rotate_cart(ux, uy, uz, angle, x0, y0, z0):
"""Rotate coordinates on a unit sphere around an axis
Parameters
----------
ux : `float`
x coordinate of a point on the axis of rotation
uy : `float`
y coordinate of a point on the axis of rotation
uz : `float`
z coordinate of a point on the axis of rotation
angle : `float`
Magnitude of the rotation.
x0 : `float`
Input x coordinate
y0 : `float`
Input y coordinate
z0 : `float`
Input z coordinate
Returns
-------
ux : `float`
Output x coordinate
uy : `float`
Output y coordinate
uz : `float`
Output z coordinate
"""
cosa = np.cos(np.radians(angle))
ccosa = 1 - cosa
sina = np.sin(np.radians(angle))
rxx = cosa + ux * ux * ccosa
rxy = ux * uy * ccosa - uz * sina
rxz = ux * uz * ccosa + uy * sina
ryx = uy * ux * ccosa + uz * sina
ryy = cosa + uy * uy * ccosa
ryz = uy * uz * ccosa - ux * sina
rzx = uz * ux * ccosa - uy * sina
rzy = uz * uy * ccosa + ux * sina
rzz = cosa + uz * uz * ccosa
x = rxx * x0 + rxy * y0 + rxz * z0
y = ryx * x0 + ryy * y0 + ryz * z0
z = rzx * x0 + rzy * y0 + rzz * z0
return x, y, z