Source code for talon.utils
import numpy as np
import talon
[docs]def directions(number_of_points=180):
"""
Get a list of 3D vectors representing the directions of the fibonacci
covering of a hemisphere of radius 1 computed with the golden spiral method.
The :math:`z` coordinate of the points is always strictly positive.
Args:
number_of_points : number of points of the wanted covering (default=180)
Returns:
ndarray : ``number_of_points`` x 3 array with the cartesian coordinates
of a point of the covering in each row.
Raises:
ValueError : if ``number_of_points <= 0`` .
References:
https://stackoverflow.com/questions/9600801/evenly-distributing-n-points-on-a-sphere/44164075#44164075
"""
number_of_points = int(number_of_points)
if number_of_points <= 0:
raise ValueError('The number of points for the covering must be >= 1 .')
n = 2 * number_of_points
indices = np.arange(0, n, dtype=float) + 0.5
phi = np.arccos(1 - 2 * indices / n)
theta = np.pi * (1 + np.sqrt(5)) * indices
x = np.cos(theta) * np.sin(phi)
y = np.sin(theta) * np.sin(phi)
z = np.cos(phi)
x, y, z = map(lambda a: a[:number_of_points], [x, y, z])
points = np.c_[x, y, z].astype(talon.core.DATATYPE)
return np.asarray([p / np.linalg.norm(p) for p in points])