# Source code for halotools.utils.spherical_geometry

```"""
"""
from __future__ import absolute_import, division, print_function, unicode_literals

import numpy as np
from astropy.utils.misc import NumpyRNGContext

__all__ = ['spherical_to_cartesian', 'chord_to_cartesian', 'sample_spherical_surface']
__author__ = ('Duncan Campbell', )

[docs]
def spherical_to_cartesian(ra, dec):
"""
Calculate cartesian coordinates on a unit sphere given two angular coordinates.
parameters

Parameters
-----------
ra : array
Angular coordinate in degrees

dec : array
Angular coordinate in degrees

Returns
--------
x,y,z : sequence of arrays
Cartesian coordinates.

Examples
---------
>>> ra, dec = 0.1, 1.5
>>> x, y, z = spherical_to_cartesian(ra, dec)

"""

x = np.cos(rar) * np.cos(decr)
y = np.sin(rar) * np.cos(decr)
z = np.sin(decr)

return x, y, z

[docs]
"""
Calculate chord distance on a unit sphere given an angular distance between two
points.

Parameters
-----------
theta : array
angular distance

If True, input is interpreted as radians.
If False, input in degrees. Default is True.

Returns
--------
C : array
chord distance

Examples
--------
>>> theta = np.linspace(0, 1, 100)
>>> chord_distance = chord_to_cartesian(theta)
"""

theta = np.atleast_1d(theta)

C = 2.0*np.sin(theta/2.0)

return C

[docs]
def sample_spherical_surface(N_points, seed=None):
"""
Randomly sample the sky.

Parameters
----------
N_points : int
number of points to sample.

seed : int, optional
Random number seed permitting deterministic behavior.
Default is None for stochastic results.

Returns
----------
coords : list
(ra,dec) coordinate pairs in degrees.

Examples
---------
>>> angular_coords_in_degrees = sample_spherical_surface(100, seed=43)
"""

with NumpyRNGContext(seed):
ran1 = np.random.rand(N_points)  # oversample, to account for box sample
ran2 = np.random.rand(N_points)  # oversample, to account for box sample

ran1 = ran1 * 2.0 * np.pi  # convert to radians
ran2 = np.arccos(2.0 * ran2 - 1.0) - 0.5*np.pi  # convert to radians

ran1 = ran1 * 360.0 / (2.0 * np.pi)  # convert to degrees
ran2 = ran2 * 360.0 / (2.0 * np.pi)  # convert to degrees

ran_ra = ran1
ran_dec = ran2

coords = list(zip(ran_ra, ran_dec))

return coords

```