mirror of
https://github.com/3b1b/manim.git
synced 2025-07-31 22:13:30 +08:00
Incremental progress on animations for Winding Number video
This commit is contained in:
@ -29,6 +29,62 @@ from mobject.svg_mobject import *
|
|||||||
from mobject.tex_mobject import *
|
from mobject.tex_mobject import *
|
||||||
from topics.graph_scene import *
|
from topics.graph_scene import *
|
||||||
|
|
||||||
|
class DualScene(Scene):
|
||||||
|
CONFIG = {
|
||||||
|
"num_needed_anchor_points" : 10
|
||||||
|
}
|
||||||
|
|
||||||
|
def setup(self):
|
||||||
|
split_line = DashedLine(SPACE_HEIGHT * UP, SPACE_HEIGHT * DOWN)
|
||||||
|
self.num_plane = NumberPlane(x_radius = SPACE_WIDTH/2)
|
||||||
|
self.num_plane.to_edge(LEFT, buff = 0)
|
||||||
|
self.num_plane.prepare_for_nonlinear_transform()
|
||||||
|
self.add(self.num_plane, split_line)
|
||||||
|
|
||||||
|
def apply_function(self, func, run_time = 3):
|
||||||
|
self.func = func
|
||||||
|
right_plane = self.num_plane.copy()
|
||||||
|
right_plane.center()
|
||||||
|
right_plane.prepare_for_nonlinear_transform()
|
||||||
|
right_plane.apply_function(func)
|
||||||
|
right_plane.shift(SPACE_WIDTH/2 * RIGHT)
|
||||||
|
self.right_plane = right_plane
|
||||||
|
crappy_cropper = FullScreenFadeRectangle(fill_opacity = 1)
|
||||||
|
crappy_cropper.stretch_to_fit_width(SPACE_WIDTH)
|
||||||
|
crappy_cropper.to_edge(LEFT, buff = 0)
|
||||||
|
self.play(
|
||||||
|
ReplacementTransform(self.num_plane.copy(), right_plane),
|
||||||
|
FadeIn(crappy_cropper),
|
||||||
|
Animation(self.num_plane),
|
||||||
|
run_time = run_time
|
||||||
|
)
|
||||||
|
|
||||||
|
def squash_onto_left(self, object):
|
||||||
|
object.shift(SPACE_WIDTH/2 * LEFT)
|
||||||
|
|
||||||
|
def squash_onto_right(self, object):
|
||||||
|
object.shift(SPACE_WIDTH/2 * RIGHT)
|
||||||
|
|
||||||
|
def path_draw(self, input_object, run_time = 3):
|
||||||
|
output_object = input_object.copy()
|
||||||
|
if input_object.get_num_anchor_points() < self.num_needed_anchor_points:
|
||||||
|
input_object.insert_n_anchor_points(self.num_needed_anchor_points)
|
||||||
|
output_object.apply_function(self.func)
|
||||||
|
self.squash_onto_left(input_object)
|
||||||
|
self.squash_onto_right(output_object)
|
||||||
|
self.play(
|
||||||
|
ShowCreation(input_object),
|
||||||
|
ShowCreation(output_object),
|
||||||
|
run_time = run_time
|
||||||
|
)
|
||||||
|
|
||||||
|
class TestDual(DualScene):
|
||||||
|
def construct(self):
|
||||||
|
self.force_skipping()
|
||||||
|
self.apply_function(lambda (x, y, z) : complex_to_R3(complex(x,y)**2))
|
||||||
|
self.revert_to_original_skipping_status()
|
||||||
|
self.path_draw(Line(LEFT + DOWN, RIGHT + DOWN))
|
||||||
|
|
||||||
class EquationSolver1d(GraphScene, ZoomedScene, ReconfigurableScene):
|
class EquationSolver1d(GraphScene, ZoomedScene, ReconfigurableScene):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"graph_func" : lambda x : x,
|
"graph_func" : lambda x : x,
|
||||||
@ -284,7 +340,8 @@ class LoopSplitScene(Scene):
|
|||||||
|
|
||||||
loop_color = BLUE
|
loop_color = BLUE
|
||||||
|
|
||||||
default_bullet = TexMobject("*", stroke_color = RED, stroke_width = 1)
|
default_bullet = PiCreature(color = RED)
|
||||||
|
default_bullet.scale(0.15)
|
||||||
|
|
||||||
def SGroup(*args):
|
def SGroup(*args):
|
||||||
return VGroup(*[arg[0] for arg in args])
|
return VGroup(*[arg[0] for arg in args])
|
||||||
@ -315,7 +372,6 @@ class LoopSplitScene(Scene):
|
|||||||
# Splits in middle
|
# Splits in middle
|
||||||
split_line = DashedLine(interpolate(tl, tr, 0.5), interpolate(bl, br, 0.5))
|
split_line = DashedLine(interpolate(tl, tr, 0.5), interpolate(bl, br, 0.5))
|
||||||
self.play(ShowCreation(split_line))
|
self.play(ShowCreation(split_line))
|
||||||
self.dither()
|
|
||||||
|
|
||||||
self.remove(*split_line)
|
self.remove(*split_line)
|
||||||
mid_line_left = self.PulsedLine(tm, bm, default_bullet, color = loop_color)
|
mid_line_left = self.PulsedLine(tm, bm, default_bullet, color = loop_color)
|
||||||
@ -341,8 +397,6 @@ class LoopSplitScene(Scene):
|
|||||||
right_open_loop = SGroup(top_line_right_half, right_line, bottom_line_right_half)
|
right_open_loop = SGroup(top_line_right_half, right_line, bottom_line_right_half)
|
||||||
right_closed_loop = VGroup(right_open_loop, mid_line_right[0])
|
right_closed_loop = VGroup(right_open_loop, mid_line_right[0])
|
||||||
|
|
||||||
self.dither()
|
|
||||||
|
|
||||||
self.play(
|
self.play(
|
||||||
ApplyMethod(left_closed_loop.shift, LEFT),
|
ApplyMethod(left_closed_loop.shift, LEFT),
|
||||||
ApplyMethod(right_closed_loop.shift, RIGHT)
|
ApplyMethod(right_closed_loop.shift, RIGHT)
|
||||||
@ -359,7 +413,7 @@ class LoopSplitScene(Scene):
|
|||||||
|
|
||||||
mid_lines = SGroup(mid_line_left, mid_line_right)
|
mid_lines = SGroup(mid_line_left, mid_line_right)
|
||||||
|
|
||||||
highlight_circle = Circle(color = YELLOW_A) # Perhaps make this a dashed circle?
|
highlight_circle = Circle(color = YELLOW_E) # Perhaps make this a dashed circle?
|
||||||
highlight_circle.surround(mid_lines)
|
highlight_circle.surround(mid_lines)
|
||||||
self.play(Indicate(mid_lines), ShowCreation(highlight_circle, run_time = 0.5))
|
self.play(Indicate(mid_lines), ShowCreation(highlight_circle, run_time = 0.5))
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user