mirror of
https://github.com/3b1b/manim.git
synced 2025-11-15 00:27:45 +00:00
Added VShowPassingFlash
This commit is contained in:
parent
d1fc6c8ed7
commit
e35f8466be
1 changed files with 51 additions and 0 deletions
|
|
@ -1,4 +1,5 @@
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
import math
|
||||||
|
|
||||||
from manimlib.constants import *
|
from manimlib.constants import *
|
||||||
from manimlib.animation.animation import Animation
|
from manimlib.animation.animation import Animation
|
||||||
|
|
@ -152,6 +153,56 @@ class ShowPassingFlash(ShowPartial):
|
||||||
submob.pointwise_become_partial(start, 0, 1)
|
submob.pointwise_become_partial(start, 0, 1)
|
||||||
|
|
||||||
|
|
||||||
|
class VShowPassingFlash(Animation):
|
||||||
|
CONFIG = {
|
||||||
|
"time_width": 0.3,
|
||||||
|
"taper_width": 0.1,
|
||||||
|
"remover": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
def begin(self):
|
||||||
|
self.mobject.align_stroke_width_data_to_points()
|
||||||
|
super().begin()
|
||||||
|
|
||||||
|
def interpolate_submobject(self, submobject, starting_sumobject, alpha):
|
||||||
|
original_widths = starting_sumobject.get_stroke_widths()
|
||||||
|
# anchor_widths = np.array([*original_widths[0::3, 0], original_widths[-1, 0]])
|
||||||
|
anchor_widths = np.array([0, *original_widths[3::3, 0], 0])
|
||||||
|
n_anchors = len(anchor_widths)
|
||||||
|
time_width = self.time_width
|
||||||
|
# taper_width = self.taper_width
|
||||||
|
# Create a gaussian such that 3 sigmas out on either side
|
||||||
|
# will equals time_width * (number of points)
|
||||||
|
sigma = time_width / 6
|
||||||
|
mu = interpolate(-time_width / 2, 1 + time_width / 2, alpha)
|
||||||
|
offset = math.exp(-4.5) # 3 sigmas out
|
||||||
|
|
||||||
|
def kernel_func(x):
|
||||||
|
result = math.exp(-0.5 * ((x - mu) / sigma)**2) - offset
|
||||||
|
result = max(result, 0)
|
||||||
|
# if x < taper_width:
|
||||||
|
# result *= x / taper_width
|
||||||
|
# elif x > 1 - taper_width:
|
||||||
|
# result *= (1 - x) / taper_width
|
||||||
|
return result
|
||||||
|
|
||||||
|
kernel_array = np.array([
|
||||||
|
kernel_func(n / (n_anchors - 1))
|
||||||
|
for n in range(n_anchors)
|
||||||
|
])
|
||||||
|
scaled_widths = anchor_widths * kernel_array
|
||||||
|
new_widths = np.zeros(submobject.get_num_points())
|
||||||
|
new_widths[0::3] = scaled_widths[:-1]
|
||||||
|
new_widths[1::3] = (scaled_widths[:-1] + scaled_widths[1:]) / 2
|
||||||
|
new_widths[2::3] = scaled_widths[1:]
|
||||||
|
submobject.set_stroke(width=new_widths)
|
||||||
|
|
||||||
|
def finish(self):
|
||||||
|
super().finish()
|
||||||
|
for submob, start in self.get_all_families_zipped():
|
||||||
|
submob.match_style(start)
|
||||||
|
|
||||||
|
|
||||||
class ShowCreationThenDestruction(ShowPassingFlash):
|
class ShowCreationThenDestruction(ShowPassingFlash):
|
||||||
CONFIG = {
|
CONFIG = {
|
||||||
"time_width": 2.0,
|
"time_width": 2.0,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue