mirror of
https://github.com/3b1b/manim.git
synced 2025-08-05 16:49:03 +00:00
More clacks animations
This commit is contained in:
parent
c4a0e65089
commit
5f86fd811f
1 changed files with 247 additions and 0 deletions
|
@ -2279,3 +2279,250 @@ class AnalyzeCircleGeometry1e2(AnalyzeCircleGeometry):
|
|||
|
||||
class CentralQuestionFor1e3(CentralQuestionFor1e2):
|
||||
CONFIG = {"exp": 3}
|
||||
|
||||
|
||||
class AskAboutArctanOfSmallValues(TeacherStudentsScene):
|
||||
def construct(self):
|
||||
self.add_title()
|
||||
|
||||
equation1 = TexMobject(
|
||||
"\\arctan", "(", "x", ")", "\\approx", "x"
|
||||
)
|
||||
equation1.set_color_by_tex("arctan", YELLOW)
|
||||
equation2 = TexMobject(
|
||||
"x", "\\approx", "\\tan", "(", "x", ")",
|
||||
)
|
||||
equation2.set_color_by_tex("tan", BLUE)
|
||||
for mob in equation1, equation2:
|
||||
mob.move_to(self.hold_up_spot, DOWN)
|
||||
|
||||
self.play(
|
||||
FadeInFromDown(equation1),
|
||||
self.teacher.change, "raise_right_hand",
|
||||
self.get_student_changes(
|
||||
"erm", "sassy", "confused"
|
||||
)
|
||||
)
|
||||
self.wait()
|
||||
self.play(equation1.shift, UP)
|
||||
self.play(
|
||||
TransformFromCopy(
|
||||
VGroup(*[equation1[i] for i in (2, 4, 5)]),
|
||||
VGroup(*[equation2[i] for i in (0, 1, 4)]),
|
||||
)
|
||||
)
|
||||
self.play(
|
||||
TransformFromCopy(
|
||||
VGroup(*[equation1[i] for i in (0, 1, 3)]),
|
||||
VGroup(*[equation2[i] for i in (2, 3, 5)]),
|
||||
),
|
||||
self.get_student_changes(
|
||||
"confused", "erm", "sassy"
|
||||
),
|
||||
)
|
||||
self.wait()
|
||||
self.student_says("Why?", target_mode="maybe")
|
||||
self.wait(3)
|
||||
|
||||
def add_title(self):
|
||||
title = TextMobject("For small $x$")
|
||||
subtitle = TextMobject("(e.g. $x = 0.001$)")
|
||||
title.scale(1.5)
|
||||
title.to_edge(UP, buff=MED_SMALL_BUFF)
|
||||
subtitle.next_to(title, DOWN)
|
||||
self.add(title, subtitle)
|
||||
|
||||
|
||||
class UnitCircleIntuition(Scene):
|
||||
def construct(self):
|
||||
self.draw_unit_circle()
|
||||
self.show_angle()
|
||||
self.show_fraction()
|
||||
self.show_fraction_approximation()
|
||||
|
||||
def draw_unit_circle(self):
|
||||
unit_size = 2.5
|
||||
axes = Axes(
|
||||
number_line_config={"unit_size": unit_size},
|
||||
x_min=-2.5, x_max=2.5,
|
||||
y_min=-1.5, y_max=1.5,
|
||||
)
|
||||
axes.set_stroke(width=1)
|
||||
self.add(axes)
|
||||
|
||||
radius_line = Line(ORIGIN, axes.coords_to_point(1, 0))
|
||||
radius_line.set_color(BLUE)
|
||||
r_label = TexMobject("1")
|
||||
r_label.add_updater(
|
||||
lambda m: m.next_to(radius_line.get_center(), DOWN, SMALL_BUFF)
|
||||
)
|
||||
circle = Circle(radius=unit_size, color=WHITE)
|
||||
|
||||
self.add(radius_line, r_label)
|
||||
self.play(
|
||||
Rotating(radius_line, about_point=ORIGIN),
|
||||
ShowCreation(circle),
|
||||
run_time=2,
|
||||
rate_func=smooth,
|
||||
)
|
||||
|
||||
self.radius_line = radius_line
|
||||
self.r_label = r_label
|
||||
self.circle = circle
|
||||
self.axes = axes
|
||||
|
||||
def show_angle(self):
|
||||
circle = self.circle
|
||||
|
||||
tan_eq = TexMobject(
|
||||
"\\tan", "(", "\\theta", ")", "=",
|
||||
tex_to_color_map={"\\theta": RED},
|
||||
)
|
||||
tan_eq.next_to(ORIGIN, RIGHT, LARGE_BUFF)
|
||||
tan_eq.to_edge(UP, buff=LARGE_BUFF)
|
||||
|
||||
theta_tracker = ValueTracker(0)
|
||||
get_theta = theta_tracker.get_value
|
||||
|
||||
def get_r_line():
|
||||
return Line(
|
||||
circle.get_center(),
|
||||
circle.get_point_from_angle(get_theta())
|
||||
)
|
||||
r_line = updating_mobject_from_func(get_r_line)
|
||||
|
||||
def get_arc(radius=None, **kwargs):
|
||||
if radius is None:
|
||||
alpha = inverse_interpolate(0, 20 * DEGREES, get_theta())
|
||||
radius = interpolate(2, 1, alpha)
|
||||
return Arc(
|
||||
radius=radius,
|
||||
start_angle=0,
|
||||
angle=get_theta(),
|
||||
arc_center=circle.get_center(),
|
||||
**kwargs
|
||||
)
|
||||
arc = updating_mobject_from_func(get_arc)
|
||||
self.circle_arc = updating_mobject_from_func(
|
||||
lambda: get_arc(radius=circle.radius, color=RED)
|
||||
)
|
||||
|
||||
def get_theta_label():
|
||||
label = TexMobject("\\theta")
|
||||
label.set_height(min(arc.get_height(), 0.3))
|
||||
label.set_color(RED)
|
||||
center = circle.get_center()
|
||||
vect = arc.point_from_proportion(0.5) - center
|
||||
vect = (get_norm(vect) + 2 * SMALL_BUFF) * normalize(vect)
|
||||
label.move_to(center + vect)
|
||||
return label
|
||||
theta_label = updating_mobject_from_func(get_theta_label)
|
||||
|
||||
def get_height_line():
|
||||
p2 = circle.get_point_from_angle(get_theta())
|
||||
p1 = np.array(p2)
|
||||
p1[1] = circle.get_center()[1]
|
||||
return Line(
|
||||
p1, p2,
|
||||
stroke_color=YELLOW,
|
||||
stroke_width=3,
|
||||
)
|
||||
self.height_line = updating_mobject_from_func(get_height_line)
|
||||
|
||||
def get_width_line():
|
||||
p2 = circle.get_center()
|
||||
p1 = circle.get_point_from_angle(get_theta())
|
||||
p1[1] = p2[1]
|
||||
return Line(
|
||||
p1, p2,
|
||||
stroke_color=PINK,
|
||||
stroke_width=3,
|
||||
)
|
||||
self.width_line = updating_mobject_from_func(get_width_line)
|
||||
|
||||
def get_h_label():
|
||||
label = TexMobject("h")
|
||||
height_line = self.height_line
|
||||
label.match_color(height_line)
|
||||
label.set_height(min(height_line.get_height(), 0.3))
|
||||
label.set_stroke(BLACK, 3, background=True)
|
||||
label.next_to(height_line, RIGHT, SMALL_BUFF)
|
||||
return label
|
||||
self.h_label = updating_mobject_from_func(get_h_label)
|
||||
|
||||
def get_w_label():
|
||||
label = TexMobject("w")
|
||||
width_line = self.width_line
|
||||
label.match_color(width_line)
|
||||
label.next_to(width_line, DOWN, SMALL_BUFF)
|
||||
return label
|
||||
self.w_label = updating_mobject_from_func(get_w_label)
|
||||
|
||||
self.add(r_line, theta_label, arc, self.radius_line)
|
||||
self.play(
|
||||
FadeInFromDown(tan_eq),
|
||||
theta_tracker.set_value, 20 * DEGREES,
|
||||
)
|
||||
self.wait()
|
||||
|
||||
self.tan_eq = tan_eq
|
||||
self.theta_tracker = theta_tracker
|
||||
|
||||
def show_fraction(self):
|
||||
height_line = self.height_line
|
||||
width_line = self.width_line
|
||||
h_label = self.h_label
|
||||
w_label = self.w_label
|
||||
tan_eq = self.tan_eq
|
||||
|
||||
rhs = TexMobject(
|
||||
"{\\text{height}", "\\over", "\\text{width}}"
|
||||
)
|
||||
rhs.next_to(tan_eq, RIGHT)
|
||||
rhs.get_part_by_tex("height").match_color(height_line)
|
||||
rhs.get_part_by_tex("width").match_color(width_line)
|
||||
|
||||
for mob in [height_line, width_line, h_label, w_label]:
|
||||
mob.update()
|
||||
|
||||
self.play(
|
||||
ShowCreation(height_line.copy().clear_updaters(), remover=True),
|
||||
FadeInFrom(h_label.copy().clear_updaters(), RIGHT, remover=True),
|
||||
Write(rhs[:2])
|
||||
)
|
||||
self.add(height_line, h_label)
|
||||
self.play(
|
||||
ShowCreation(width_line.copy().clear_updaters(), remover=True),
|
||||
FadeInFrom(w_label.copy().clear_updaters(), UP, remover=True),
|
||||
self.r_label.fade, 1,
|
||||
Write(rhs[2])
|
||||
)
|
||||
self.add(width_line, w_label)
|
||||
self.wait()
|
||||
|
||||
self.rhs = rhs
|
||||
|
||||
def show_fraction_approximation(self):
|
||||
theta_tracker = self.theta_tracker
|
||||
approx_rhs = TexMobject(
|
||||
"\\approx", "{\\theta", "\\over", "1}",
|
||||
)
|
||||
height, over1, width = self.rhs
|
||||
approx, theta, over2, one = approx_rhs
|
||||
approx_rhs.set_color_by_tex("\\theta", RED)
|
||||
approx_rhs.next_to(self.rhs, RIGHT, MED_SMALL_BUFF)
|
||||
|
||||
self.play(theta_tracker.set_value, 5 * DEGREES)
|
||||
self.play(Write(VGroup(approx, over2)))
|
||||
self.wait()
|
||||
self.play(Indicate(width))
|
||||
self.play(TransformFromCopy(width, one))
|
||||
self.wait()
|
||||
self.play(Indicate(height))
|
||||
self.play(TransformFromCopy(height, theta))
|
||||
self.wait()
|
||||
|
||||
|
||||
class TangentTaylorSeries(Scene):
|
||||
def construct(self):
|
||||
pass
|
||||
|
|
Loading…
Add table
Reference in a new issue