mirror of
https://github.com/3b1b/manim.git
synced 2025-08-05 16:49:03 +00:00
Final animations for diffyq chapter 3
This commit is contained in:
parent
62c2772982
commit
dfeb11a2ab
4 changed files with 211 additions and 5 deletions
|
@ -99,7 +99,7 @@ class ShowNewRuleAtDiscreteBoundary(DiscreteSetup):
|
||||||
)
|
)
|
||||||
self.wait()
|
self.wait()
|
||||||
|
|
||||||
# Point to inward neighbord
|
# Point to inward neighbor
|
||||||
new_arrows = VGroup(*[
|
new_arrows = VGroup(*[
|
||||||
Arrow(
|
Arrow(
|
||||||
d1.get_center(),
|
d1.get_center(),
|
||||||
|
|
|
@ -1140,7 +1140,7 @@ class EndScreen(PatreonEndScreen):
|
||||||
"Jonathan Eppele",
|
"Jonathan Eppele",
|
||||||
"Kai-Siang Ang",
|
"Kai-Siang Ang",
|
||||||
"Kanan Gill",
|
"Kanan Gill",
|
||||||
"Kartik Cating-Subramanian",
|
"Kartik\\\\Cating-Subramanian",
|
||||||
"L0j1k",
|
"L0j1k",
|
||||||
"Lee Redden",
|
"Lee Redden",
|
||||||
"Linh Tran",
|
"Linh Tran",
|
||||||
|
|
|
@ -45,7 +45,7 @@ class TemperatureGraphScene(SpecialThreeDScene):
|
||||||
if include_labels:
|
if include_labels:
|
||||||
self.add_axes_labels(axes)
|
self.add_axes_labels(axes)
|
||||||
|
|
||||||
# Adjust axis orinetations
|
# Adjust axis orientation
|
||||||
axes.x_axis.rotate(
|
axes.x_axis.rotate(
|
||||||
90 * DEGREES, RIGHT,
|
90 * DEGREES, RIGHT,
|
||||||
about_point=axes.c2p(0, 0, 0),
|
about_point=axes.c2p(0, 0, 0),
|
||||||
|
@ -674,9 +674,9 @@ class OceanOfPossibilities(TemperatureGraphScene):
|
||||||
def setup_axes(self):
|
def setup_axes(self):
|
||||||
axes = self.get_three_d_axes(include_numbers=True)
|
axes = self.get_three_d_axes(include_numbers=True)
|
||||||
axes.add(axes.input_plane)
|
axes.add(axes.input_plane)
|
||||||
axes.scale(0.9)
|
axes.scale(0.8)
|
||||||
axes.center()
|
axes.center()
|
||||||
axes.shift(0.5 * OUT + RIGHT)
|
axes.shift(OUT + RIGHT)
|
||||||
|
|
||||||
self.add(axes)
|
self.add(axes)
|
||||||
self.axes = axes
|
self.axes = axes
|
||||||
|
@ -2073,6 +2073,7 @@ class ManipulateSinExpSurface(TemperatureGraphScene):
|
||||||
"^2": WHITE,
|
"^2": WHITE,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"graph_config": {},
|
||||||
"initial_phi": -90 * DEGREES,
|
"initial_phi": -90 * DEGREES,
|
||||||
"initial_omega": 1,
|
"initial_omega": 1,
|
||||||
}
|
}
|
||||||
|
@ -2094,6 +2095,7 @@ class ManipulateSinExpSurface(TemperatureGraphScene):
|
||||||
L = TexMobject("L")
|
L = TexMobject("L")
|
||||||
L.rotate(90 * DEGREES, RIGHT)
|
L.rotate(90 * DEGREES, RIGHT)
|
||||||
L.next_to(axes.x_axis.get_end(), IN)
|
L.next_to(axes.x_axis.get_end(), IN)
|
||||||
|
axes.x_axis.label = L
|
||||||
axes.x_axis.add(L)
|
axes.x_axis.add(L)
|
||||||
|
|
||||||
axes.shift(5 * LEFT + 0.5 * IN)
|
axes.shift(5 * LEFT + 0.5 * IN)
|
||||||
|
@ -2424,6 +2426,7 @@ class ManipulateSinExpSurface(TemperatureGraphScene):
|
||||||
lambda: self.get_time_slice_graph(
|
lambda: self.get_time_slice_graph(
|
||||||
self.axes, self.func,
|
self.axes, self.func,
|
||||||
t=self.t_tracker.get_value(),
|
t=self.t_tracker.get_value(),
|
||||||
|
**self.graph_config
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -2769,3 +2772,58 @@ class ShowHarmonicSurfaces(ManipulateSinExpSurface):
|
||||||
)
|
)
|
||||||
result.to_edge(UP)
|
result.to_edge(UP)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
class Thumbnail(ShowHarmonicSurfaces):
|
||||||
|
CONFIG = {
|
||||||
|
"default_surface_config": {
|
||||||
|
"resolution": (40, 30),
|
||||||
|
# "resolution": (10, 10),
|
||||||
|
},
|
||||||
|
"graph_config": {
|
||||||
|
"stroke_width": 8,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def construct(self):
|
||||||
|
self.setup_axes()
|
||||||
|
self.initialize_parameter_trackers()
|
||||||
|
self.add_surface()
|
||||||
|
self.add_graph()
|
||||||
|
#
|
||||||
|
self.omega_tracker.set_value(3 * PI / 10)
|
||||||
|
self.set_camera_orientation(
|
||||||
|
theta=-70 * DEGREES,
|
||||||
|
)
|
||||||
|
|
||||||
|
axes = self.axes
|
||||||
|
for axis in [axes.y_axis, axes.z_axis]:
|
||||||
|
axis.numbers.set_opacity(0)
|
||||||
|
axis.remove(*axis.numbers)
|
||||||
|
axes.x_axis.label.set_opacity(0)
|
||||||
|
axes.z_axis.label.set_opacity(0)
|
||||||
|
|
||||||
|
for n in range(2, 16, 2):
|
||||||
|
new_graph = self.get_time_slice_graph(
|
||||||
|
axes, self.func, t=n,
|
||||||
|
**self.graph_config
|
||||||
|
)
|
||||||
|
new_graph.set_shade_in_3d(True)
|
||||||
|
new_graph.set_stroke(
|
||||||
|
width=8 / np.sqrt(n),
|
||||||
|
# opacity=1 / n**(1 / 4),
|
||||||
|
)
|
||||||
|
self.add(new_graph)
|
||||||
|
|
||||||
|
words = TextMobject(
|
||||||
|
"Sine waves + Linearity + Fourier = Solution"
|
||||||
|
)
|
||||||
|
words.set_width(FRAME_WIDTH - 1)
|
||||||
|
words.to_edge(DOWN)
|
||||||
|
words.shift(2 * DOWN)
|
||||||
|
self.add_fixed_in_frame_mobjects(words)
|
||||||
|
|
||||||
|
self.camera.frame_center.shift(DOWN)
|
||||||
|
self.update_mobjects(0)
|
||||||
|
self.surface.set_stroke(width=0.1)
|
||||||
|
self.surface.set_fill(opacity=0.2)
|
||||||
|
|
|
@ -176,6 +176,94 @@ class BorderRect(Scene):
|
||||||
self.add(rect)
|
self.add(rect)
|
||||||
|
|
||||||
|
|
||||||
|
class SeekIdealized(Scene):
|
||||||
|
def construct(self):
|
||||||
|
phrases = VGroup(*[
|
||||||
|
TextMobject(
|
||||||
|
"Seek", text, "problems",
|
||||||
|
tex_to_color_map={
|
||||||
|
"realistic": GREEN,
|
||||||
|
"{idealized}": YELLOW,
|
||||||
|
"over-idealized": YELLOW,
|
||||||
|
"general": BLUE,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
for text in [
|
||||||
|
"realistic",
|
||||||
|
"{idealized}",
|
||||||
|
"over-idealized",
|
||||||
|
"general",
|
||||||
|
]
|
||||||
|
])
|
||||||
|
phrases.scale(2)
|
||||||
|
words = VGroup()
|
||||||
|
for phrase in phrases:
|
||||||
|
phrase.center()
|
||||||
|
word = phrase[1]
|
||||||
|
words.add(word)
|
||||||
|
phrase.remove(word)
|
||||||
|
arrow = Vector(DOWN)
|
||||||
|
arrow.set_stroke(WHITE, 6)
|
||||||
|
arrow.next_to(words[3], UP)
|
||||||
|
low_arrow = arrow.copy()
|
||||||
|
low_arrow.next_to(words[3], DOWN)
|
||||||
|
|
||||||
|
solutions = TextMobject("solutions")
|
||||||
|
solutions.scale(2)
|
||||||
|
solutions.move_to(phrases[3][1], UL)
|
||||||
|
models = TextMobject("models")
|
||||||
|
models.scale(2)
|
||||||
|
models.next_to(
|
||||||
|
words[0], RIGHT, buff=0.35,
|
||||||
|
aligned_edge=DOWN
|
||||||
|
)
|
||||||
|
|
||||||
|
phrases.center()
|
||||||
|
phrase = phrases[0]
|
||||||
|
|
||||||
|
self.add(phrase)
|
||||||
|
self.add(words[0])
|
||||||
|
self.wait()
|
||||||
|
words[0].save_state()
|
||||||
|
self.play(
|
||||||
|
words[0].to_edge, DOWN,
|
||||||
|
words[0].set_opacity, 0.5,
|
||||||
|
Transform(phrase, phrases[1]),
|
||||||
|
FadeInFrom(words[1], UP)
|
||||||
|
)
|
||||||
|
self.wait()
|
||||||
|
# self.play(
|
||||||
|
# words[1].move_to, words[2], RIGHT,
|
||||||
|
# FadeIn(words[2]),
|
||||||
|
# Transform(phrase, phrases[2])
|
||||||
|
# )
|
||||||
|
# self.wait()
|
||||||
|
self.play(
|
||||||
|
words[1].next_to, arrow, UP,
|
||||||
|
ShowCreation(arrow),
|
||||||
|
MaintainPositionRelativeTo(
|
||||||
|
phrase, words[1]
|
||||||
|
),
|
||||||
|
FadeInFrom(solutions, LEFT),
|
||||||
|
FadeIn(words[3]),
|
||||||
|
)
|
||||||
|
self.wait()
|
||||||
|
|
||||||
|
words[0].generate_target()
|
||||||
|
words[0].target.next_to(low_arrow, DOWN)
|
||||||
|
words[0].target.set_opacity(1)
|
||||||
|
models.shift(
|
||||||
|
words[0].target.get_center() -
|
||||||
|
words[0].saved_state.get_center()
|
||||||
|
)
|
||||||
|
self.play(
|
||||||
|
MoveToTarget(words[0]),
|
||||||
|
ShowCreation(low_arrow),
|
||||||
|
FadeInFrom(models, LEFT)
|
||||||
|
)
|
||||||
|
self.wait()
|
||||||
|
|
||||||
|
|
||||||
class SecondDerivativeOfSine(Scene):
|
class SecondDerivativeOfSine(Scene):
|
||||||
def construct(self):
|
def construct(self):
|
||||||
equation = TexMobject(
|
equation = TexMobject(
|
||||||
|
@ -769,3 +857,63 @@ class CompareFreqDecays2to4(CompareFreqDecays1to2):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"freqs": [2, 4],
|
"freqs": [2, 4],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class WorryAboutGenerality(TeacherStudentsScene, WriteHeatEquationTemplate):
|
||||||
|
def construct(self):
|
||||||
|
eq = self.get_d1_equation()
|
||||||
|
diffyq = self.get_diffyq_set()
|
||||||
|
is_in = TexMobject("\\in")
|
||||||
|
is_in.scale(2)
|
||||||
|
|
||||||
|
group = VGroup(eq, is_in, diffyq)
|
||||||
|
group.arrange(RIGHT, buff=MED_LARGE_BUFF)
|
||||||
|
group.to_edge(UP)
|
||||||
|
|
||||||
|
arrow = Vector(DOWN)
|
||||||
|
arrow.set_stroke(WHITE, 5)
|
||||||
|
arrow.next_to(eq, DOWN)
|
||||||
|
themes = TextMobject("Frequent themes")
|
||||||
|
themes.scale(1.5)
|
||||||
|
themes.next_to(arrow, DOWN)
|
||||||
|
|
||||||
|
self.play(
|
||||||
|
self.get_student_changes(
|
||||||
|
"sad", "tired", "pleading"
|
||||||
|
),
|
||||||
|
self.teacher.change, "raise_right_hand",
|
||||||
|
FadeInFromDown(eq)
|
||||||
|
)
|
||||||
|
self.play(Write(group[1:]))
|
||||||
|
self.wait(2)
|
||||||
|
self.play(
|
||||||
|
ShowCreation(arrow),
|
||||||
|
self.get_student_changes(*3 * ["pondering"]),
|
||||||
|
)
|
||||||
|
self.play(
|
||||||
|
FadeInFrom(themes, UP),
|
||||||
|
self.get_student_changes(*3 * ["thinking"]),
|
||||||
|
self.teacher.change, "happy"
|
||||||
|
)
|
||||||
|
self.wait(4)
|
||||||
|
|
||||||
|
|
||||||
|
# def get_d1_equation(self):
|
||||||
|
# result = super().get_d1_equation()
|
||||||
|
# lp, rp = parens = TexMobject("(", ")")
|
||||||
|
# parens.match_height(result)
|
||||||
|
# lp.next_to(result, LEFT, SMALL_BUFF)
|
||||||
|
# rp.next_to(result, RIGHT, SMALL_BUFF)
|
||||||
|
# result.add_to_back(lp)
|
||||||
|
# result.add(rp)
|
||||||
|
# return result
|
||||||
|
|
||||||
|
def get_diffyq_set(self):
|
||||||
|
words = TextMobject(
|
||||||
|
"Differential\\\\equations"
|
||||||
|
)
|
||||||
|
words.scale(1.5)
|
||||||
|
words.set_color(BLUE)
|
||||||
|
lb = Brace(words, LEFT)
|
||||||
|
rb = Brace(words, RIGHT)
|
||||||
|
return VGroup(lb, words, rb)
|
||||||
|
|
Loading…
Add table
Reference in a new issue