Source code for fury.animation.helpers
import numpy as np
from fury.decorators import warn_on_args_to_kwargs
[docs]
@warn_on_args_to_kwargs()
def get_previous_timestamp(timestamps, current_time, *, include_last=False):
    """Return the maximum previous timestamp of a given time.
    Parameters
    ----------
    timestamps : ndarray
        Sorted list of timestamps.
    current_time : float or int
        The time to get previous timestamp for.
    include_last: bool, optional, default: False
        If `True`, even the last timestamp will be considered a valid previous
        timestamp.
    Returns
    -------
    float or int
        The previous timestamp
    """
    for timestamp in timestamps[::-1] if include_last else timestamps[-2::-1]:
        if timestamp <= current_time:
            return timestamp
    return timestamps[0] 
[docs]
@warn_on_args_to_kwargs()
def get_next_timestamp(timestamps, current_time, *, include_first=False):
    """Return the minimum next timestamp of a given time.
    Parameters
    ----------
    timestamps : ndarray
        Sorted list of timestamps.
    current_time : float or int
        The time to get previous timestamp for.
    include_first: bool, optional, default: False
        If `True`, even the first timestamp will be considered a valid next
        timestamp.
    Returns
    -------
    float or int
        The next timestamp
    """
    for timestamp in timestamps[:] if include_first else timestamps[1:]:
        if timestamp > current_time:
            return timestamp
    return timestamps[-1] 
[docs]
def get_timestamps_from_keyframes(keyframes):
    """Return a sorted array of timestamps given dict of keyframes.
    Parameters
    ----------
    keyframes : dict
        keyframes dict that contains timestamps as keys.
    Returns
    -------
    ndarray
        Array of sorted timestamps extracted from the keyframes.
    """
    return np.sort(np.array(list(keyframes)), axis=None) 
[docs]
def get_values_from_keyframes(keyframes):
    """Return an array of keyframes values sorted using timestamps.
    Parameters
    ----------
    keyframes : dict
        keyframes dict that contains timestamps as keys and data as values.
    Returns
    -------
    ndarray
        Array of sorted values extracted from the keyframes.
    """
    return np.asarray(
        [keyframes.get(t, {}).get("value", None) for t in sorted(keyframes.keys())]
    ) 
[docs]
def get_time_tau(t, t0, t1):
    """Return a capped time tau between 0 and 1.
    Parameters
    ----------
    t : float or int
        Current time to calculate tau for.
    t0 : float or int
        Lower timestamp of the time period.
    t1 : float or int
        Higher timestamp of the time period.
    Returns
    -------
    float
        The time tau
    """
    return 0 if t <= t0 else 1 if t >= t1 else (t - t0) / (t1 - t0) 
[docs]
def lerp(v0, v1, t0, t1, t):
    """Return a linearly interpolated value.
    Parameters
    ----------
    v0: ndarray or float or int.
        The first value
    v1: ndarray or float or int.
        The second value
    t : float or int
        Current time to interpolate at.
    t0 : float or int
        Timestamp associated with v0.
    t1 : float or int
        Timestamp associated with v1.
    Returns
    -------
    ndarray or float
        The interpolated value
    """
    if t0 == t1:
        return v0
    v = v1 - v0
    dt = get_time_tau(t, t0, t1)
    return dt * v + v0 
[docs]
def euclidean_distances(points):
    """Return a list of euclidean distances of a list of points or values.
    Parameters
    ----------
    points: ndarray
        Array of points or valued to calculate euclidean distances between.
    Returns
    -------
    list
        A List of euclidean distance between each consecutive points or values.
    """
    return [np.linalg.norm(x - y) for x, y in zip(points, points[1:])]