mirror of
https://github.com/3b1b/manim.git
synced 2025-04-13 09:47:07 +00:00
Update TexTransformExample, and pull out TexIndexing
This commit is contained in:
parent
3bf9e40aba
commit
e3b95276fa
1 changed files with 52 additions and 32 deletions
|
@ -174,16 +174,17 @@ class TexTransformExample(Scene):
|
||||||
self.add(lines[0])
|
self.add(lines[0])
|
||||||
# The animation TransformMatchingStrings will line up parts
|
# The animation TransformMatchingStrings will line up parts
|
||||||
# of the source and target which have matching substring strings.
|
# of the source and target which have matching substring strings.
|
||||||
# Here, giving it a little path_arc makes each part sort of
|
# Here, giving it a little path_arc makes each part rotate into
|
||||||
# rotate into their final positions, which feels appropriate
|
# their final positions, which feels appropriate for the idea of
|
||||||
# for the idea of rearranging an equation
|
# rearranging an equation
|
||||||
self.play(
|
self.play(
|
||||||
TransformMatchingStrings(
|
TransformMatchingStrings(
|
||||||
lines[0].copy(), lines[1],
|
lines[0].copy(), lines[1],
|
||||||
# matched_keys specifies which substring should
|
# matched_keys specifies which substring should
|
||||||
# line up. If it's not specified, the animation
|
# line up. If it's not specified, the animation
|
||||||
# will try its best, but may not quite give the
|
# will align the longest matching substrings.
|
||||||
# intended effect
|
# In this case, the substring "^2 = C^2" would
|
||||||
|
# trip it up
|
||||||
matched_keys=["A^2", "B^2", "C^2"],
|
matched_keys=["A^2", "B^2", "C^2"],
|
||||||
# When you want a substring from the source
|
# When you want a substring from the source
|
||||||
# to go to a non-equal substring from the target,
|
# to go to a non-equal substring from the target,
|
||||||
|
@ -206,25 +207,57 @@ class TexTransformExample(Scene):
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
self.wait(2)
|
self.wait(2)
|
||||||
|
|
||||||
# You can also index into Tex mobject (or other StringMobjects)
|
|
||||||
# by substrings and regular expressions
|
|
||||||
top_equation = lines[0]
|
|
||||||
low_equation = lines[3]
|
|
||||||
|
|
||||||
self.play(LaggedStartMap(FlashAround, low_equation["C"], lag_ratio=0.5))
|
|
||||||
self.play(LaggedStartMap(FlashAround, low_equation["B"], lag_ratio=0.5))
|
|
||||||
self.play(LaggedStartMap(FlashAround, top_equation[re.compile(r"\w\^2")]))
|
|
||||||
self.play(Indicate(low_equation[R"\sqrt"]))
|
|
||||||
self.wait()
|
|
||||||
self.play(LaggedStartMap(FadeOut, lines, shift=2 * RIGHT))
|
self.play(LaggedStartMap(FadeOut, lines, shift=2 * RIGHT))
|
||||||
|
|
||||||
|
# TransformMatchingShapes will try to line up all pieces of a
|
||||||
|
# source mobject with those of a target, regardless of the
|
||||||
|
# what Mobject type they are.
|
||||||
|
source = Text("the morse code", height=1)
|
||||||
|
target = Text("here come dots", height=1)
|
||||||
|
saved_source = source.copy()
|
||||||
|
|
||||||
|
self.play(Write(source))
|
||||||
|
self.wait()
|
||||||
|
kw = dict(run_time=3, path_arc=PI / 2)
|
||||||
|
self.play(TransformMatchingShapes(source, target, **kw))
|
||||||
|
self.wait()
|
||||||
|
self.play(TransformMatchingShapes(target, saved_source, **kw))
|
||||||
|
self.wait()
|
||||||
|
|
||||||
|
|
||||||
|
class TexIndexing(Scene):
|
||||||
|
def construct(self):
|
||||||
|
# You can index into Tex mobject (or other StringMobjects) by substrings
|
||||||
|
equation = Tex(R"e^{\pi i} = -1", font_size=144)
|
||||||
|
|
||||||
|
self.add(equation)
|
||||||
|
self.play(FlashAround(equation["e"]))
|
||||||
|
self.wait()
|
||||||
|
self.play(Indicate(equation[R"\pi"]))
|
||||||
|
self.wait()
|
||||||
|
self.play(TransformFromCopy(
|
||||||
|
equation[R"e^{\pi i}"].copy().set_opacity(0.5),
|
||||||
|
equation["-1"],
|
||||||
|
path_arc=-PI / 2,
|
||||||
|
run_time=3
|
||||||
|
))
|
||||||
|
self.play(FadeOut(equation))
|
||||||
|
|
||||||
|
# Or regular expressions
|
||||||
|
equation = Tex("A^2 + B^2 = C^2", font_size=144)
|
||||||
|
|
||||||
|
self.play(Write(equation))
|
||||||
|
for part in equation[re.compile(r"\w\^2")]:
|
||||||
|
self.play(FlashAround(part))
|
||||||
|
self.wait()
|
||||||
|
self.play(FadeOut(equation))
|
||||||
|
|
||||||
# Indexing by substrings like this may not work when
|
# Indexing by substrings like this may not work when
|
||||||
# the order in which Latex draws symbols does not match
|
# the order in which Latex draws symbols does not match
|
||||||
# the order in which they show up in the string.
|
# the order in which they show up in the string.
|
||||||
# For example, here the infinity is drawn before the sigma
|
# For example, here the infinity is drawn before the sigma
|
||||||
# so we don't get the desired behavior.
|
# so we don't get the desired behavior.
|
||||||
equation = Tex(R"\sum_{n = 1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}")
|
equation = Tex(R"\sum_{n = 1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}", font_size=72)
|
||||||
self.play(FadeIn(equation))
|
self.play(FadeIn(equation))
|
||||||
self.play(equation[R"\infty"].animate.set_color(RED)) # Doesn't hit the infinity
|
self.play(equation[R"\infty"].animate.set_color(RED)) # Doesn't hit the infinity
|
||||||
self.wait()
|
self.wait()
|
||||||
|
@ -236,27 +269,14 @@ class TexTransformExample(Scene):
|
||||||
equation = Tex(
|
equation = Tex(
|
||||||
R"\sum_{n = 1}^\infty {1 \over n^2} = {\pi^2 \over 6}",
|
R"\sum_{n = 1}^\infty {1 \over n^2} = {\pi^2 \over 6}",
|
||||||
# Explicitly mark "\infty" as a substring you might want to access
|
# Explicitly mark "\infty" as a substring you might want to access
|
||||||
isolate=[R"\infty"]
|
isolate=[R"\infty"],
|
||||||
|
font_size=72
|
||||||
)
|
)
|
||||||
self.play(FadeIn(equation))
|
self.play(FadeIn(equation))
|
||||||
self.play(equation[R"\infty"].animate.set_color(RED)) # Got it!
|
self.play(equation[R"\infty"].animate.set_color(RED)) # Got it!
|
||||||
self.wait()
|
self.wait()
|
||||||
self.play(FadeOut(equation))
|
self.play(FadeOut(equation))
|
||||||
|
|
||||||
# TransformMatchingShapes will try to line up all pieces of a
|
|
||||||
# source mobject with those of a target, regardless of the
|
|
||||||
# what Mobject type they are.
|
|
||||||
source = Text("the morse code", height=1)
|
|
||||||
target = Text("here come dots", height=1)
|
|
||||||
|
|
||||||
self.play(Write(source))
|
|
||||||
self.wait()
|
|
||||||
kw = dict(run_time=3, path_arc=PI / 2)
|
|
||||||
self.play(TransformMatchingShapes(source, target, **kw))
|
|
||||||
self.wait()
|
|
||||||
self.play(TransformMatchingShapes(target, source, **kw))
|
|
||||||
self.wait()
|
|
||||||
|
|
||||||
|
|
||||||
class UpdatersExample(Scene):
|
class UpdatersExample(Scene):
|
||||||
def construct(self):
|
def construct(self):
|
||||||
|
|
Loading…
Add table
Reference in a new issue