Skip to content

Approximation

approximation

approximate

approximate(
    trajectory: Trajectory,
    approximation_settings: ApproximationSettings
    | None = None,
    inplace: bool = False,
) -> Trajectory

Approximate the trajectory using piecewise cubic polynomials based on the provided settings.

Parameters:

  • trajectory (Trajectory) –

    The trajectory to approximate.

  • approximation_settings (ApproximationSettings, default: None ) –

    Settings for the approximation.

  • inplace (bool, default: False ) –

    If True, modify the trajectory in place. Defaults to False.

Returns:

  • Trajectory ( Trajectory ) –

    The approximated trajectory.

Source code in trajectopy\processing\approximation.py
def approximate(
    trajectory: Trajectory,
    approximation_settings: ApproximationSettings | None = None,
    inplace: bool = False,
) -> Trajectory:
    """Approximate the trajectory using piecewise cubic polynomials based on the provided settings.

    Args:
        trajectory (Trajectory): The trajectory to approximate.
        approximation_settings (ApproximationSettings): Settings for the approximation.
        inplace (bool): If True, modify the trajectory in place. Defaults to False.

    Returns:
        Trajectory: The approximated trajectory.
    """
    if approximation_settings is None:
        approximation_settings = ApproximationSettings()

    if approximation_settings.position_approximation_method == PositionApproximationMethod.CUBIC:
        xyz_approx = _piecewise_cubic(
            index=trajectory.index,
            values=trajectory.xyz,
            min_win_size=approximation_settings.position_interval_size,
            min_obs=approximation_settings.position_min_observations,
        )
    else:
        raise ValueError(
            f"Unknown position approximation method: {approximation_settings.position_approximation_method}"
        )

    traj_approx = trajectory if inplace else trajectory.copy()
    traj_approx.positions.xyz = xyz_approx

    if not traj_approx.has_orientation:
        return traj_approx

    if approximation_settings.rotation_approximation_method == RotationApproximationMethod.AVERAGE_PER_PATH_LENGTH:
        quat_approx = _average_rotations_per_path_length(
            trajectory, max_gap_size=approximation_settings.max_path_length_gap
        )
    elif approximation_settings.rotation_approximation_method == RotationApproximationMethod.AVERAGE_IN_WINDOW:
        quat_approx = _average_rotations_in_window(
            index=trajectory.index,
            quat=trajectory.quat,
            win_size=approximation_settings.rotation_window_size,
        )
    else:
        raise ValueError(
            f"Unknown rotation approximation method: {approximation_settings.rotation_approximation_method}"
        )
    traj_approx.rotations = Rotations.from_quat(quat_approx)

    return traj_approx