From bc68bb81233ef82b1ab5a944fdff23caa402697b Mon Sep 17 00:00:00 2001 From: GoThrones Date: Wed, 25 Mar 2026 21:50:42 +0530 Subject: [PATCH 1/3] Refactor reduce_across_dimension to get_extreme_coord_along_dimension --- manim/mobject/mobject.py | 46 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 9f3818c188..39b9a9cb58 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -2157,30 +2157,30 @@ def restore(self) -> Self: self.become(self.saved_state) return self - def reduce_across_dimension( - self, reduce_func: Callable[[Iterable[float]], float], dim: int + def get_extreme_coord_along_dimension( + self, measurement_function: Callable[[Iterable[float]], float], dim: int = 0 ) -> float: - """Find the min or max value from a dimension across all points in this and submobjects.""" - assert dim >= 0 - assert dim <= 2 - if len(self.submobjects) == 0 and len(self.points) == 0: - # If we have no points and no submobjects, return 0 (e.g. center) - return 0 - - # If we do not have points (but do have submobjects) - # use only the points from those. - if len(self.points) == 0: # noqa: SIM108 - rv = None - else: - # Otherwise, be sure to include our own points - rv = reduce_func(self.points[:, dim]) - # Recursively ask submobjects (if any) for the biggest/ - # smallest dimension they have and compare it to the return value. - for mobj in self.submobjects: - value = mobj.reduce_across_dimension(reduce_func, dim) - rv = value if rv is None else reduce_func([value, rv]) - assert rv is not None - return rv + """ + Finds the minimum or maximum coordinate value in a given dimension, across all points in self and its submobjects. + + measurement_function can be either max or min. + """ + + if not (0 <= dim <= 2): + raise ValueError("dim must be either 0, 1 or 2") + + extreme_coord = None + + if self.points.size > 0: + extreme_coord = measurement_function(self.points[:, dim]) + + + for submobject in self.submobjects: + submobject_extreme_coord = submobject.get_extreme_coord_along_dimension(measurement_function, dim) + extreme_coord = submobject_extreme_coord if extreme_coord is None else measurement_function([submobject_extreme_coord,extreme_coord]) + + return extreme_coord if extreme_coord is not None else 0.0 + def nonempty_submobjects(self) -> Sequence[Mobject]: return [ From 7f3e17bab28a163d0e22cdc2ca75041e8068fe50 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:31:15 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/mobject/mobject.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 39b9a9cb58..b9bfb15875 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -2160,27 +2160,30 @@ def restore(self) -> Self: def get_extreme_coord_along_dimension( self, measurement_function: Callable[[Iterable[float]], float], dim: int = 0 ) -> float: - """ + """ Finds the minimum or maximum coordinate value in a given dimension, across all points in self and its submobjects. - + measurement_function can be either max or min. """ - if not (0 <= dim <= 2): - raise ValueError("dim must be either 0, 1 or 2") - + raise ValueError("dim must be either 0, 1 or 2") + extreme_coord = None if self.points.size > 0: extreme_coord = measurement_function(self.points[:, dim]) - - + for submobject in self.submobjects: - submobject_extreme_coord = submobject.get_extreme_coord_along_dimension(measurement_function, dim) - extreme_coord = submobject_extreme_coord if extreme_coord is None else measurement_function([submobject_extreme_coord,extreme_coord]) - - return extreme_coord if extreme_coord is not None else 0.0 + submobject_extreme_coord = submobject.get_extreme_coord_along_dimension( + measurement_function, dim + ) + extreme_coord = ( + submobject_extreme_coord + if extreme_coord is None + else measurement_function([submobject_extreme_coord, extreme_coord]) + ) + return extreme_coord if extreme_coord is not None else 0.0 def nonempty_submobjects(self) -> Sequence[Mobject]: return [ From 8ae393cbf7f44445c4e1035bc256d5e924b22a47 Mon Sep 17 00:00:00 2001 From: GoThrones Date: Thu, 26 Mar 2026 01:43:34 +0530 Subject: [PATCH 3/3] Update reduce_across_dimension to get_extreme_coord_along_dimension --- manim/mobject/mobject.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 39b9a9cb58..be9dba39b1 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -2333,11 +2333,11 @@ def get_nadir(self) -> Point3D: def length_over_dim(self, dim: int) -> float: """Measure the length of an :class:`~.Mobject` in a certain direction.""" - max_coord: float = self.reduce_across_dimension( + max_coord: float = self.get_extreme_coord_along_dimension( max, dim, ) - min_coord: float = self.reduce_across_dimension(min, dim) + min_coord: float = self.get_extreme_coord_along_dimension(min, dim) return max_coord - min_coord def get_coord(self, dim: int, direction: Vector3DLike = ORIGIN) -> float: