From 705f1a528b7ef299f7486181022600cfb641274f Mon Sep 17 00:00:00 2001 From: Grant Sanderson Date: Mon, 11 Apr 2022 10:47:11 -0700 Subject: [PATCH] Separate functionality of ordinary linear interpolation from that using np.outer on arrays --- manimlib/utils/bezier.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/manimlib/utils/bezier.py b/manimlib/utils/bezier.py index 16ec3e10..71d3d2b9 100644 --- a/manimlib/utils/bezier.py +++ b/manimlib/utils/bezier.py @@ -80,15 +80,10 @@ def partial_quadratic_bezier_points( # Linear interpolation variants -def interpolate(start: T, end: T, alpha: float) -> T: + +def interpolate(start: T, end: T, alpha: np.ndarray | float) -> T: try: - if isinstance(alpha, float): - return (1 - alpha) * start + alpha * end - # Otherwise, assume alpha is a list or array, and return - # an appropriated shaped array of all corresponding - # interpolations - result = np.outer(1 - alpha, start) + np.outer(alpha, end) - return result.reshape((*np.shape(alpha), *np.shape(start))) + return (1 - alpha) * start + alpha * end except TypeError: log.debug(f"`start` parameter with type `{type(start)}` and dtype `{start.dtype}`") log.debug(f"`end` parameter with type `{type(end)}` and dtype `{end.dtype}`") @@ -97,6 +92,15 @@ def interpolate(start: T, end: T, alpha: float) -> T: sys.exit(2) +def outer_interpolate( + start: np.ndarray | float, + end: np.ndarray | float, + alpha: np.ndarray | float, +) -> T: + result = np.outer(1 - alpha, start) + np.outer(alpha, end) + return result.reshape((*np.shape(alpha), *np.shape(start))) + + def set_array_by_interpolation( arr: np.ndarray, arr1: np.ndarray,