From a632966c419c98a73f98d5f55038716536367274 Mon Sep 17 00:00:00 2001 From: Boris Filin Date: Fri, 18 Oct 2024 20:41:24 +1100 Subject: [PATCH 1/7] Add option to scale object outlines with objects --- manim/mobject/mobject.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 1fed8a60eb..ba55e867d3 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -1221,7 +1221,11 @@ def shift(self, *vectors: Vector3D) -> Self: return self - def scale(self, scale_factor: float, **kwargs) -> Self: + def scale( + self, + scale_factor: float, + scale_stroke: bool = False, + **kwargs) -> Self: r"""Scale the size by a factor. Default behavior is to scale about the center of the mobject. @@ -1232,6 +1236,9 @@ def scale(self, scale_factor: float, **kwargs) -> Self: The scaling factor :math:`\alpha`. If :math:`0 < |\alpha| < 1`, the mobject will shrink, and for :math:`|\alpha| > 1` it will grow. Furthermore, if :math:`\alpha < 0`, the mobject is also flipped. + scale_stroke + Boolean determining if the object's outline is scaled when the object is scaled. + If enabled, and object with 2px outline sclaed by a factor of .5 will have an outline of 1px. kwargs Additional keyword arguments passed to :meth:`apply_points_function_about_point`. @@ -1265,6 +1272,9 @@ def construct(self): self.apply_points_function_about_point( lambda points: scale_factor * points, **kwargs ) + if scale_stroke and self.get_stroke_width and self.set_stroke: + self.set_stroke(width=abs(scale_factor) * self.get_stroke_width()) + self.set_stroke(width=abs(scale_factor) * self.get_stroke_width(background=True), background=True) return self def rotate_about_origin(self, angle: float, axis: Vector3D = OUT, axes=[]) -> Self: From 88ccd74ca5b2cef0a401527f54ad58465727e0b1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 20 Oct 2024 06:06:35 +0000 Subject: [PATCH 2/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/mobject/mobject.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 7d60c81cf8..9a61cd090f 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -1221,11 +1221,7 @@ def shift(self, *vectors: Vector3D) -> Self: return self - def scale( - self, - scale_factor: float, - scale_stroke: bool = False, - **kwargs) -> Self: + def scale(self, scale_factor: float, scale_stroke: bool = False, **kwargs) -> Self: r"""Scale the size by a factor. Default behavior is to scale about the center of the mobject. @@ -1274,7 +1270,10 @@ def construct(self): ) if scale_stroke and self.get_stroke_width and self.set_stroke: self.set_stroke(width=abs(scale_factor) * self.get_stroke_width()) - self.set_stroke(width=abs(scale_factor) * self.get_stroke_width(background=True), background=True) + self.set_stroke( + width=abs(scale_factor) * self.get_stroke_width(background=True), + background=True, + ) return self def rotate_about_origin(self, angle: float, axis: Vector3D = OUT, axes=[]) -> Self: From 4ed9fb371517dc0ae90e5f9477a8901c85339b18 Mon Sep 17 00:00:00 2001 From: Boris Filin Date: Wed, 23 Oct 2024 14:41:13 +1100 Subject: [PATCH 3/7] Move outline scaling into VMobject.scale() --- manim/mobject/mobject.py | 7 --- manim/mobject/types/vectorized_mobject.py | 61 +++++++++++++++++++++++ 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index 7d60c81cf8..197bf1e51e 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -1224,7 +1224,6 @@ def shift(self, *vectors: Vector3D) -> Self: def scale( self, scale_factor: float, - scale_stroke: bool = False, **kwargs) -> Self: r"""Scale the size by a factor. @@ -1236,9 +1235,6 @@ def scale( The scaling factor :math:`\alpha`. If :math:`0 < |\alpha| < 1`, the mobject will shrink, and for :math:`|\alpha| > 1` it will grow. Furthermore, if :math:`\alpha < 0`, the mobject is also flipped. - scale_stroke - Boolean determining if the object's outline is scaled when the object is scaled. - If enabled, and object with 2px outline sclaed by a factor of .5 will have an outline of 1px. kwargs Additional keyword arguments passed to :meth:`apply_points_function_about_point`. @@ -1272,9 +1268,6 @@ def construct(self): self.apply_points_function_about_point( lambda points: scale_factor * points, **kwargs ) - if scale_stroke and self.get_stroke_width and self.set_stroke: - self.set_stroke(width=abs(scale_factor) * self.get_stroke_width()) - self.set_stroke(width=abs(scale_factor) * self.get_stroke_width(background=True), background=True) return self def rotate_about_origin(self, angle: float, axis: Vector3D = OUT, axes=[]) -> Self: diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index 1bbc32a092..b365b43ec4 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -477,6 +477,67 @@ def set_opacity(self, opacity: float, family: bool = True) -> Self: self.set_stroke(opacity=opacity, family=family, background=True) return self + + def scale( + self, + scale_factor: float, + scale_stroke: bool = False, + **kwargs + ) -> Self: + r"""Scale the size by a factor. + + Default behavior is to scale about the center of the vmobject. + + Parameters + ---------- + scale_factor + The scaling factor :math:`\alpha`. If :math:`0 < |\alpha| < 1`, the mobject + will shrink, and for :math:`|\alpha| > 1` it will grow. Furthermore, + if :math:`\alpha < 0`, the mobject is also flipped. + scale_stroke + Boolean determining if the object's outline is scaled when the object is scaled. + If enabled, and object with 2px outline is scaled by a factor of .5, it will have an outline of 1px. + kwargs + Additional keyword arguments passed to + :meth:`apply_points_function_about_point`. + + Returns + ------- + :class:`VMobject` + ``self`` + + Examples + -------- + + .. manim:: MobjectScaleExample + :save_last_frame: + + class MobjectScaleExample(Scene): + def construct(self): + c1 = Circle(1, RED).set_x(-1) + c2 = Circle(1, GREEN).set_x(1) + + vg = VGroup(c1, c2) + vg.set_stroke(width=50) + self.add(vg) + + self.play( + c1.animate.scale(.25), + c2.animate.scale(.25, + scale_stroke=True) + ) + + See also + -------- + :meth:`move_to` + + """ + if scale_stroke and self.get_stroke_width and self.set_stroke: + self.set_stroke(width=abs(scale_factor) * self.get_stroke_width()) + self.set_stroke(width=abs(scale_factor) * self.get_stroke_width(background=True), background=True) + super().scale(scale_factor, **kwargs) + return self + def fade(self, darkness: float = 0.5, family: bool = True) -> Self: factor = 1.0 - darkness self.set_fill(opacity=factor * self.get_fill_opacity(), family=False) From eae02099e7711cd3c468ef31235f65e9b17ba554 Mon Sep 17 00:00:00 2001 From: Boris Filin Date: Wed, 23 Oct 2024 15:01:03 +1100 Subject: [PATCH 4/7] Add unit tests for stroke width --- .../types/vectorized_mobject/test_stroke.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/module/mobject/types/vectorized_mobject/test_stroke.py b/tests/module/mobject/types/vectorized_mobject/test_stroke.py index 1110db14b8..d30c510227 100644 --- a/tests/module/mobject/types/vectorized_mobject/test_stroke.py +++ b/tests/module/mobject/types/vectorized_mobject/test_stroke.py @@ -39,3 +39,24 @@ def test_streamline_attributes_for_single_color(): ) assert vector_field[0].stroke_width == 1.0 assert vector_field[0].stroke_opacity == 0.2 + + +def test_stroke_scale(): + a = VMobject() + b = VMobject() + a.set_stroke(width=50) + b.set_stroke(width=50) + a.scale(.5) + b.scale(.5, scale_stroke=True) + assert a.get_stroke_width() == 50 + assert b.get_stroke_width() == 25 + +def test_background_stroke_scale(): + a = VMobject() + b = VMobject() + a.set_stroke(width=50, background=True) + b.set_stroke(width=50, background=True) + a.scale(.5) + b.scale(.5, scale_stroke=True) + assert a.get_stroke_width(background=True) == 50 + assert b.get_stroke_width(background=True) == 25 From 0b5ba56a7664b6277017899617238c096ad11df1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 05:44:32 +0000 Subject: [PATCH 5/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/mobject/mobject.py | 5 +---- manim/mobject/types/vectorized_mobject.py | 15 ++++++--------- .../types/vectorized_mobject/test_stroke.py | 9 +++++---- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/manim/mobject/mobject.py b/manim/mobject/mobject.py index b29bbaccdb..2079de7923 100644 --- a/manim/mobject/mobject.py +++ b/manim/mobject/mobject.py @@ -1221,10 +1221,7 @@ def shift(self, *vectors: Vector3D) -> Self: return self - def scale( - self, - scale_factor: float, - **kwargs) -> Self: + def scale(self, scale_factor: float, **kwargs) -> Self: r"""Scale the size by a factor. Default behavior is to scale about the center of the mobject. diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index b365b43ec4..93755d86e8 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -477,13 +477,7 @@ def set_opacity(self, opacity: float, family: bool = True) -> Self: self.set_stroke(opacity=opacity, family=family, background=True) return self - - def scale( - self, - scale_factor: float, - scale_stroke: bool = False, - **kwargs - ) -> Self: + def scale(self, scale_factor: float, scale_stroke: bool = False, **kwargs) -> Self: r"""Scale the size by a factor. Default behavior is to scale about the center of the vmobject. @@ -525,7 +519,7 @@ def construct(self): c1.animate.scale(.25), c2.animate.scale(.25, scale_stroke=True) - ) + ) See also -------- @@ -534,7 +528,10 @@ def construct(self): """ if scale_stroke and self.get_stroke_width and self.set_stroke: self.set_stroke(width=abs(scale_factor) * self.get_stroke_width()) - self.set_stroke(width=abs(scale_factor) * self.get_stroke_width(background=True), background=True) + self.set_stroke( + width=abs(scale_factor) * self.get_stroke_width(background=True), + background=True, + ) super().scale(scale_factor, **kwargs) return self diff --git a/tests/module/mobject/types/vectorized_mobject/test_stroke.py b/tests/module/mobject/types/vectorized_mobject/test_stroke.py index d30c510227..25c09cd294 100644 --- a/tests/module/mobject/types/vectorized_mobject/test_stroke.py +++ b/tests/module/mobject/types/vectorized_mobject/test_stroke.py @@ -46,17 +46,18 @@ def test_stroke_scale(): b = VMobject() a.set_stroke(width=50) b.set_stroke(width=50) - a.scale(.5) - b.scale(.5, scale_stroke=True) + a.scale(0.5) + b.scale(0.5, scale_stroke=True) assert a.get_stroke_width() == 50 assert b.get_stroke_width() == 25 + def test_background_stroke_scale(): a = VMobject() b = VMobject() a.set_stroke(width=50, background=True) b.set_stroke(width=50, background=True) - a.scale(.5) - b.scale(.5, scale_stroke=True) + a.scale(0.5) + b.scale(0.5, scale_stroke=True) assert a.get_stroke_width(background=True) == 50 assert b.get_stroke_width(background=True) == 25 From 0809daaa5ef6cf40ea140125edc5d80d03f924c8 Mon Sep 17 00:00:00 2001 From: Nemo2510 <68891035+Boris-Filin@users.noreply.github.com> Date: Fri, 25 Oct 2024 10:40:25 +1100 Subject: [PATCH 6/7] Fix docstring for VMobject.scale Co-authored-by: Aarush Deshpande <110117391+JasonGrace2282@users.noreply.github.com> --- manim/mobject/types/vectorized_mobject.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index 93755d86e8..80f34429bb 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -493,7 +493,7 @@ def scale(self, scale_factor: float, scale_stroke: bool = False, **kwargs) -> Se If enabled, and object with 2px outline is scaled by a factor of .5, it will have an outline of 1px. kwargs Additional keyword arguments passed to - :meth:`apply_points_function_about_point`. + :meth:`~.Mobject.scale`. Returns ------- From d6f58f1ab2c51df3684545457216d5ed33f4de59 Mon Sep 17 00:00:00 2001 From: Nemo2510 <68891035+Boris-Filin@users.noreply.github.com> Date: Fri, 25 Oct 2024 10:41:20 +1100 Subject: [PATCH 7/7] Remove tautology from VMobject.scale Co-authored-by: Aarush Deshpande <110117391+JasonGrace2282@users.noreply.github.com> --- manim/mobject/types/vectorized_mobject.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/mobject/types/vectorized_mobject.py b/manim/mobject/types/vectorized_mobject.py index 80f34429bb..1b03bd4f41 100644 --- a/manim/mobject/types/vectorized_mobject.py +++ b/manim/mobject/types/vectorized_mobject.py @@ -526,7 +526,7 @@ def construct(self): :meth:`move_to` """ - if scale_stroke and self.get_stroke_width and self.set_stroke: + if scale_stroke: self.set_stroke(width=abs(scale_factor) * self.get_stroke_width()) self.set_stroke( width=abs(scale_factor) * self.get_stroke_width(background=True),