Source code for monalisa.geometry._volume_element_center_out_radial3
"""Port of src/geom3/bmVolumeElement_center_out_radial3.m."""
import numpy as np
from monalisa._mat import msize
from monalisa.geometry._volume_element_voronoi_center_out_radial2 import _radial_dr
from monalisa.trajectory._traj_format import traj_format
from monalisa.trajectory._traj_line_reshape import traj_line_reshape
from monalisa.trajectory._traj_squared_norm import traj_squared_norm
[docs]
def volume_element_center_out_radial3(t):
"""Volume elements of a 3D center-out radial trajectory (uniform solid angle)."""
if msize(t, 1) != 3:
raise ValueError("The trajectory must be 3Dim")
t, _, formatedIndex, formatedWeight = traj_format(t, nargout=4)
centerFlag = np.linalg.norm(t[:, 0]) < 100 * np.finfo(np.float64).eps
if centerFlag:
t = t[:, 1:]
t = traj_line_reshape(t)
N, nLine = msize(t, 2), msize(t, 3)
t3 = np.reshape(t, (3, N, nLine), order="F")
dr, _, r_1 = _radial_dr(t3, centerFlag)
ds = np.reshape(4 * np.pi * traj_squared_norm(t) / nLine, (N, nLine), order="F")
v = np.ravel(dr, order="F") * np.ravel(ds, order="F")
if centerFlag:
dr_0 = np.mean(r_1 / 2)
v = np.concatenate([[(4 / 3) * np.pi * dr_0**3], v])
idx = np.ravel(formatedIndex).astype(np.int64) - 1
return (v[idx] * np.ravel(formatedWeight))[None, :]