mirror of
https://github.com/3b1b/manim.git
synced 2025-07-30 21:44:19 +08:00
206 lines
6.5 KiB
Python
206 lines
6.5 KiB
Python
from mobject.tex_mobject import TexMobject
|
|
from mobject import Mobject
|
|
from mobject.image_mobject import ImageMobject
|
|
from mobject.vectorized_mobject import VMobject
|
|
|
|
from animation.animation import Animation
|
|
from animation.transform import *
|
|
from animation.simple_animations import *
|
|
from topics.geometry import *
|
|
from topics.characters import *
|
|
from topics.functions import *
|
|
from topics.number_line import *
|
|
from topics.numerals import *
|
|
from scene import Scene
|
|
from camera import Camera
|
|
from mobject.svg_mobject import *
|
|
from mobject.tex_mobject import *
|
|
from mobject.vectorized_mobject import *
|
|
|
|
from eola.matrix import *
|
|
from eola.two_d_space import *
|
|
|
|
V_COLOR = YELLOW
|
|
|
|
|
|
class OpeningQuote(Scene):
|
|
def construct(self):
|
|
words = TextMobject(
|
|
"\\centering ``Mathematics is the art of giving the \\\\",
|
|
"same name ",
|
|
"to ",
|
|
"different things",
|
|
".''",
|
|
arg_separator = " "
|
|
)
|
|
words.highlight_by_tex("same name ", BLUE)
|
|
words.highlight_by_tex("different things", MAROON_B)
|
|
# words.scale_to_fit_width(2*SPACE_WIDTH - 2)
|
|
words.to_edge(UP)
|
|
author = TextMobject("-Henri Poincar\\'e.")
|
|
author.highlight(YELLOW)
|
|
author.next_to(words, DOWN, buff = 0.5)
|
|
|
|
self.play(FadeIn(words))
|
|
self.dither(2)
|
|
self.play(Write(author, run_time = 3))
|
|
self.dither(2)
|
|
|
|
class LinearCombinationScene(LinearTransformationScene):
|
|
CONFIG = {
|
|
"include_background_plane" : False,
|
|
"foreground_plane_kwargs" : {
|
|
"x_radius" : SPACE_WIDTH,
|
|
"y_radius" : SPACE_HEIGHT,
|
|
"secondary_line_ratio" : 1
|
|
},
|
|
}
|
|
def show_linear_combination(self, numerical_coords,
|
|
basis_vectors,
|
|
coord_mobs = None,
|
|
show_sum_vect = False,
|
|
sum_vect_color = V_COLOR,
|
|
):
|
|
for basis, scalar in zip(basis_vectors, numerical_coords):
|
|
if not hasattr(basis, "label"):
|
|
basis.label = VectorizedPoint()
|
|
direction = np.round(basis.get_end().rotate(np.pi/2))
|
|
basis.label.next_to(basis.get_center(), direction)
|
|
basis.save_state()
|
|
basis.label.save_state()
|
|
basis.target = basis.copy().scale(scalar)
|
|
basis.label.target = basis.label.copy()
|
|
basis.label.target.shift(
|
|
basis.target.get_center() - basis.get_center()
|
|
)
|
|
if coord_mobs is None:
|
|
coord_mobs = map(TexMobject, map(str, numerical_coords))
|
|
VGroup(*coord_mobs).set_fill(opacity = 0)
|
|
for coord, basis in zip(coord_mobs, basis_vectors):
|
|
coord.next_to(basis.label, LEFT)
|
|
for coord, basis in zip(coord_mobs, basis_vectors):
|
|
coord.target = coord.copy()
|
|
coord.target.next_to(basis.label.target, LEFT)
|
|
coord.target.set_fill(basis.get_color(), opacity = 1)
|
|
self.play(*map(MoveToTarget, [
|
|
coord, basis, basis.label
|
|
]))
|
|
self.dither()
|
|
self.play(*[
|
|
ApplyMethod(m.shift, basis_vectors[0].get_end())
|
|
for m in self.get_mobjects_from_last_animation()
|
|
])
|
|
if show_sum_vect:
|
|
sum_vect = Vector(
|
|
basis_vectors[1].get_end(),
|
|
color = sum_vect_color
|
|
)
|
|
self.play(ShowCreation(sum_vect))
|
|
self.dither(2)
|
|
self.play(*it.chain(
|
|
[basis.restore for basis in basis_vectors],
|
|
[basis.label.restore for basis in basis_vectors],
|
|
[FadeOut(coord) for coord in coord_mobs],
|
|
[FadeOut(sum_vect) for x in [1] if show_sum_vect],
|
|
))
|
|
|
|
|
|
|
|
class RemindOfCoordinates(LinearCombinationScene):
|
|
CONFIG = {
|
|
"vector_coords" : [3, 2]
|
|
}
|
|
def construct(self):
|
|
self.remove(self.i_hat, self.j_hat)
|
|
|
|
v = self.add_vector(self.vector_coords, color = V_COLOR)
|
|
coords = self.write_vector_coordinates(v)
|
|
self.show_standard_coord_meaning(*coords.get_entries().copy())
|
|
self.show_abstract_scalar_idea(*coords.get_entries().copy())
|
|
self.scale_basis_vectors(*coords.get_entries().copy())
|
|
|
|
|
|
|
|
def show_standard_coord_meaning(self, x_coord, y_coord):
|
|
x, y = self.vector_coords
|
|
x_line = Line(ORIGIN, x*RIGHT, color = GREEN)
|
|
y_line = Line(ORIGIN, y*UP, color = RED)
|
|
y_line.shift(x_line.get_end())
|
|
for line, coord, direction in (x_line, x_coord, DOWN), (y_line, y_coord, LEFT):
|
|
self.play(
|
|
coord.highlight, line.get_color(),
|
|
coord.next_to, line.get_center(), direction,
|
|
ShowCreation(line),
|
|
)
|
|
self.dither()
|
|
self.dither()
|
|
self.play(*map(FadeOut, [x_coord, y_coord, x_line, y_line]))
|
|
|
|
|
|
def show_abstract_scalar_idea(self, x_coord, y_coord):
|
|
x_shift, y_shift = 4*LEFT, 4*RIGHT
|
|
to_save = x_coord, y_coord, self.i_hat, self.j_hat
|
|
for mob in to_save:
|
|
mob.save_state()
|
|
everything = VGroup(*self.get_mobjects())
|
|
|
|
x, y = self.vector_coords
|
|
scaled_i = self.i_hat.copy().scale(x)
|
|
scaled_j = self.j_hat.copy().scale(y)
|
|
VGroup(self.i_hat, scaled_i).shift(x_shift)
|
|
VGroup(self.j_hat, scaled_j).shift(y_shift)
|
|
|
|
self.play(
|
|
FadeOut(everything),
|
|
x_coord.scale_in_place, 1.5,
|
|
x_coord.move_to, x_shift + 3*UP,
|
|
y_coord.scale_in_place, 1.5,
|
|
y_coord.move_to, y_shift + 3*UP,
|
|
)
|
|
self.play(*map(FadeIn, [self.i_hat, self.j_hat]))
|
|
self.dither()
|
|
self.play(Transform(self.i_hat, scaled_i))
|
|
self.play(Transform(self.j_hat, scaled_j))
|
|
self.dither()
|
|
self.play(
|
|
FadeIn(everything),
|
|
*[mob.restore for mob in to_save]
|
|
)
|
|
self.dither()
|
|
|
|
def scale_basis_vectors(self, x_coord, y_coord):
|
|
self.i_hat.label = self.get_vector_label(
|
|
self.i_hat, "\\hat{\\imath}", "right"
|
|
)
|
|
self.j_hat.label = self.get_vector_label(
|
|
self.j_hat, "\\hat{\\jmath}", "left"
|
|
)
|
|
self.play(*map(Write, [self.i_hat.label, self.j_hat.label]))
|
|
self.show_linear_combination(
|
|
self.vector_coords,
|
|
basis_vectors = [self.i_hat, self.j_hat],
|
|
coord_mobs = [x_coord, y_coord]
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|