mirror of
https://github.com/3b1b/manim.git
synced 2025-08-05 16:49:03 +00:00
commit
cec7872f48
5 changed files with 140 additions and 15 deletions
40
active_projects/ode/name_animations.py
Normal file
40
active_projects/ode/name_animations.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
from manimlib.imports import *
|
||||||
|
from active_projects.ode.part2.fourier_series import FourierOfName
|
||||||
|
|
||||||
|
name_color_pairs = [
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
circle_counts = [
|
||||||
|
# 10,
|
||||||
|
# 25,
|
||||||
|
100,
|
||||||
|
]
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
for name, color in name_color_pairs:
|
||||||
|
for n_circles in circle_counts:
|
||||||
|
try:
|
||||||
|
first_name = name.split(" ")[0]
|
||||||
|
scene = FourierOfName(
|
||||||
|
name_text=name,
|
||||||
|
name_color=color,
|
||||||
|
n_circles=n_circles,
|
||||||
|
file_writer_config={
|
||||||
|
"write_to_movie": True,
|
||||||
|
"output_directory": os.path.join(
|
||||||
|
"patron_fourier_names",
|
||||||
|
first_name,
|
||||||
|
),
|
||||||
|
"file_name": "{}_Fouierified_{}_Separate_paths".format(
|
||||||
|
first_name,
|
||||||
|
n_circles
|
||||||
|
),
|
||||||
|
},
|
||||||
|
camera_config={
|
||||||
|
"frame_rate": 24,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
except:
|
||||||
|
pass
|
|
@ -313,12 +313,7 @@ class FourierOfPiSymbol(FourierCirclesScene):
|
||||||
coefs = self.get_coefficients_of_path(path)
|
coefs = self.get_coefficients_of_path(path)
|
||||||
|
|
||||||
circles = self.get_circles(coefficients=coefs)
|
circles = self.get_circles(coefficients=coefs)
|
||||||
for k, circle in zip(it.count(1), circles):
|
self.set_decreasing_stroke_widths(circles)
|
||||||
circle.set_stroke(width=max(
|
|
||||||
1 / np.sqrt(k),
|
|
||||||
1,
|
|
||||||
))
|
|
||||||
|
|
||||||
# approx_path = self.get_circle_end_path(circles)
|
# approx_path = self.get_circle_end_path(circles)
|
||||||
drawn_path = self.get_drawn_path(circles)
|
drawn_path = self.get_drawn_path(circles)
|
||||||
if self.start_drawn:
|
if self.start_drawn:
|
||||||
|
@ -329,6 +324,14 @@ class FourierOfPiSymbol(FourierCirclesScene):
|
||||||
self.add(drawn_path)
|
self.add(drawn_path)
|
||||||
self.wait(self.run_time)
|
self.wait(self.run_time)
|
||||||
|
|
||||||
|
def set_decreasing_stroke_widths(self, circles):
|
||||||
|
for k, circle in zip(it.count(1), circles):
|
||||||
|
circle.set_stroke(width=max(
|
||||||
|
1 / np.sqrt(k),
|
||||||
|
1,
|
||||||
|
))
|
||||||
|
return circles
|
||||||
|
|
||||||
def get_path(self):
|
def get_path(self):
|
||||||
tex_mob = TexMobject(self.tex)
|
tex_mob = TexMobject(self.tex)
|
||||||
tex_mob.set_height(6)
|
tex_mob.set_height(6)
|
||||||
|
@ -338,6 +341,51 @@ class FourierOfPiSymbol(FourierCirclesScene):
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
class FourierOfName(FourierOfPiSymbol):
|
||||||
|
CONFIG = {
|
||||||
|
"n_circles": 100,
|
||||||
|
"name_color": WHITE,
|
||||||
|
"name_text": "Abc",
|
||||||
|
"time_per_symbol": 5,
|
||||||
|
"slow_factor": 1 / 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
def construct(self):
|
||||||
|
name = TextMobject(self.name_text)
|
||||||
|
max_width = FRAME_WIDTH - 2
|
||||||
|
max_height = FRAME_HEIGHT - 2
|
||||||
|
name.set_width(max_width)
|
||||||
|
if name.get_height() > max_height:
|
||||||
|
name.set_height(max_height)
|
||||||
|
|
||||||
|
circles = VGroup(VectorizedPoint())
|
||||||
|
for path in name.family_members_with_points():
|
||||||
|
for subpath in path.get_subpaths():
|
||||||
|
sp_mob = VMobject()
|
||||||
|
sp_mob.set_points(subpath)
|
||||||
|
coefs = self.get_coefficients_of_path(sp_mob)
|
||||||
|
new_circles = self.get_circles(
|
||||||
|
coefficients=coefs
|
||||||
|
)
|
||||||
|
self.set_decreasing_stroke_widths(new_circles)
|
||||||
|
drawn_path = self.get_drawn_path(new_circles)
|
||||||
|
drawn_path.clear_updaters()
|
||||||
|
drawn_path.set_stroke(self.name_color, 3)
|
||||||
|
|
||||||
|
new_circles.suspend_updating()
|
||||||
|
self.play(ReplacementTransform(circles, new_circles))
|
||||||
|
new_circles.resume_updating()
|
||||||
|
circles = new_circles
|
||||||
|
self.play(
|
||||||
|
ShowCreation(drawn_path),
|
||||||
|
rate_func=linear,
|
||||||
|
run_time=self.time_per_symbol
|
||||||
|
)
|
||||||
|
circles.suspend_updating()
|
||||||
|
self.play(FadeOut(circles))
|
||||||
|
self.wait(3)
|
||||||
|
|
||||||
|
|
||||||
class FourierOfPiSymbol5(FourierOfPiSymbol):
|
class FourierOfPiSymbol5(FourierOfPiSymbol):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"n_circles": 5,
|
"n_circles": 5,
|
||||||
|
|
|
@ -34,6 +34,7 @@ class SceneFileWriter(object):
|
||||||
# TODO, address this in extract_scene et. al.
|
# TODO, address this in extract_scene et. al.
|
||||||
"file_name": None,
|
"file_name": None,
|
||||||
"output_directory": None,
|
"output_directory": None,
|
||||||
|
"file_name": None,
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, scene, **kwargs):
|
def __init__(self, scene, **kwargs):
|
||||||
|
@ -81,7 +82,10 @@ class SceneFileWriter(object):
|
||||||
return root if root else ext[1:]
|
return root if root else ext[1:]
|
||||||
|
|
||||||
def get_default_file_name(self):
|
def get_default_file_name(self):
|
||||||
return self.scene.__class__.__name__
|
if self.file_name is None:
|
||||||
|
return self.scene.__class__.__name__
|
||||||
|
else:
|
||||||
|
return self.file_name
|
||||||
|
|
||||||
def get_movie_directory(self):
|
def get_movie_directory(self):
|
||||||
pixel_height = self.scene.camera.pixel_height
|
pixel_height = self.scene.camera.pixel_height
|
||||||
|
|
|
@ -20,7 +20,7 @@ import random
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from nn.mnist_loader import load_data_wrapper
|
from nn.mnist_loader import load_data_wrapper
|
||||||
from utils.space_ops import get_norm
|
# from utils.space_ops import get_norm
|
||||||
|
|
||||||
NN_DIRECTORY = os.path.dirname(os.path.realpath(__file__))
|
NN_DIRECTORY = os.path.dirname(os.path.realpath(__file__))
|
||||||
# PRETRAINED_DATA_FILE = os.path.join(NN_DIRECTORY, "pretrained_weights_and_biases_80")
|
# PRETRAINED_DATA_FILE = os.path.join(NN_DIRECTORY, "pretrained_weights_and_biases_80")
|
||||||
|
|
|
@ -2964,7 +2964,7 @@ class BiasForInactiviyWords(Scene):
|
||||||
self.play(Write(words))
|
self.play(Write(words))
|
||||||
self.wait(3)
|
self.wait(3)
|
||||||
|
|
||||||
class ContinualEdgeUpdate(ContinualAnimation):
|
class ContinualEdgeUpdate(VGroup):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"max_stroke_width" : 3,
|
"max_stroke_width" : 3,
|
||||||
"stroke_width_exp" : 7,
|
"stroke_width_exp" : 7,
|
||||||
|
@ -2972,7 +2972,8 @@ class ContinualEdgeUpdate(ContinualAnimation):
|
||||||
"colors" : [GREEN, GREEN, GREEN, RED],
|
"colors" : [GREEN, GREEN, GREEN, RED],
|
||||||
}
|
}
|
||||||
def __init__(self, network_mob, **kwargs):
|
def __init__(self, network_mob, **kwargs):
|
||||||
digest_config(self, kwargs)
|
VGroup.__init__(self, **kwargs)
|
||||||
|
self.internal_time = 0
|
||||||
n_cycles = self.n_cycles
|
n_cycles = self.n_cycles
|
||||||
edges = VGroup(*it.chain(*network_mob.edge_groups))
|
edges = VGroup(*it.chain(*network_mob.edge_groups))
|
||||||
self.move_to_targets = []
|
self.move_to_targets = []
|
||||||
|
@ -2990,11 +2991,14 @@ class ContinualEdgeUpdate(ContinualAnimation):
|
||||||
|
|
||||||
edge.generate_target()
|
edge.generate_target()
|
||||||
edge.target.set_stroke(edge.colors[0], edge.widths[0])
|
edge.target.set_stroke(edge.colors[0], edge.widths[0])
|
||||||
self.move_to_targets.append(MoveToTarget(edge))
|
edge.become(edge.target)
|
||||||
|
self.move_to_targets.append(edge)
|
||||||
self.edges = edges
|
self.edges = edges
|
||||||
ContinualAnimation.__init__(self, edges, **kwargs)
|
self.add(edges)
|
||||||
|
self.add_updater(lambda m, dt: self.update_edges(dt))
|
||||||
|
|
||||||
def update_mobject(self, dt):
|
def update_edges(self, dt):
|
||||||
|
self.internal_time += dt
|
||||||
if self.internal_time < 1:
|
if self.internal_time < 1:
|
||||||
alpha = smooth(self.internal_time)
|
alpha = smooth(self.internal_time)
|
||||||
for move_to_target in self.move_to_targets:
|
for move_to_target in self.move_to_targets:
|
||||||
|
@ -4559,8 +4563,9 @@ class ShowAmplify(PiCreatureScene):
|
||||||
class Thumbnail(NetworkScene):
|
class Thumbnail(NetworkScene):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"network_mob_config" : {
|
"network_mob_config" : {
|
||||||
'neuron_stroke_color' : WHITE
|
'neuron_stroke_color' : WHITE,
|
||||||
}
|
'layer_to_layer_buff': 1.25,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
def construct(self):
|
def construct(self):
|
||||||
network_mob = self.network_mob
|
network_mob = self.network_mob
|
||||||
|
@ -4568,6 +4573,23 @@ class Thumbnail(NetworkScene):
|
||||||
for layer in network_mob.layers:
|
for layer in network_mob.layers:
|
||||||
layer.neurons.set_stroke(width = 5)
|
layer.neurons.set_stroke(width = 5)
|
||||||
|
|
||||||
|
network_mob.set_height(5)
|
||||||
|
network_mob.to_edge(DOWN)
|
||||||
|
network_mob.to_edge(LEFT, buff=1)
|
||||||
|
|
||||||
|
subtitle = TextMobject(
|
||||||
|
"From the\\\\",
|
||||||
|
"ground up\\\\",
|
||||||
|
)
|
||||||
|
# subtitle.arrange(
|
||||||
|
# DOWN,
|
||||||
|
# buff=0.25,
|
||||||
|
# aligned_edge=LEFT,
|
||||||
|
# )
|
||||||
|
subtitle.set_color(YELLOW)
|
||||||
|
subtitle.set_height(2.75)
|
||||||
|
subtitle.next_to(network_mob, RIGHT, buff=MED_LARGE_BUFF)
|
||||||
|
|
||||||
edge_update = ContinualEdgeUpdate(
|
edge_update = ContinualEdgeUpdate(
|
||||||
network_mob,
|
network_mob,
|
||||||
max_stroke_width = 10,
|
max_stroke_width = 10,
|
||||||
|
@ -4576,7 +4598,18 @@ class Thumbnail(NetworkScene):
|
||||||
edge_update.internal_time = 3
|
edge_update.internal_time = 3
|
||||||
edge_update.update(0)
|
edge_update.update(0)
|
||||||
|
|
||||||
|
for mob in network_mob.family_members_with_points():
|
||||||
|
if mob.get_stroke_width() < 2:
|
||||||
|
mob.set_stroke(width=2)
|
||||||
|
|
||||||
|
|
||||||
|
title = TextMobject("Neural Networks")
|
||||||
|
title.scale(3)
|
||||||
|
title.to_edge(UP)
|
||||||
|
|
||||||
self.add(network_mob)
|
self.add(network_mob)
|
||||||
|
self.add(subtitle)
|
||||||
|
self.add(title)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue