Source code for monalisa.trajectory._phyllotaxis_angle3
"""Port of src/traj3/bmPhyllotaxisAngle3.m."""
import numpy as np
[docs]
def phyllotaxis_angle3(nseg, nshot, flagSelfNav=0):
"""Polar ``theta`` and azimuthal ``phi`` angles (rows of length ``nseg*nshot``)
of the 3D golden-angle phyllotaxis spiral; with ``flagSelfNav`` the first
segment of each shot points along z (theta = phi = 0)."""
nseg = int(nseg)
nshot = int(nshot)
goldNum = (1 + np.sqrt(5)) / 2
goldAngle = 2 * np.pi - (2 * np.pi / goldNum)
nseg_tot = nseg * nshot
nseg_pure = nseg_tot - nshot if flagSelfNav else nseg_tot
q = np.pi / (2 * np.sqrt(nseg_pure))
phi = np.zeros((1, nseg_tot))
theta = np.zeros((1, nseg_tot))
i, j = np.meshgrid(np.arange(1, nseg + 1), np.arange(1, nshot + 1), indexing="ij")
i = i.ravel() # loop order: i outer, j inner
j = j.ravel()
myIndex = i + (j - 1) * nseg - 1
nav = (i == 1) if flagSelfNav else np.zeros(i.size, dtype=bool)
myCounter = np.cumsum(~nav).astype(np.float64)
pure = ~nav
phi[0, myIndex[pure]] = np.mod(myCounter[pure] * goldAngle, 2 * np.pi)
theta[0, myIndex[pure]] = q * np.sqrt(myCounter[pure])
return theta, phi