mirror of
https://github.com/3b1b/manim.git
synced 2025-09-01 00:48:45 +00:00
A few curl animations
This commit is contained in:
parent
d5b4639659
commit
3346ea4815
1 changed files with 90 additions and 37 deletions
127
fluid_flow.py
127
fluid_flow.py
|
@ -5,7 +5,8 @@ from region import region_from_polygon_vertices
|
||||||
from topics.geometry import Arrow, Dot, Circle
|
from topics.geometry import Arrow, Dot, Circle
|
||||||
from topics.number_line import NumberPlane
|
from topics.number_line import NumberPlane
|
||||||
from scene import Scene
|
from scene import Scene
|
||||||
from animation.simple_animations import ShowCreation, Rotating
|
from animation.simple_animations import \
|
||||||
|
ShowCreation, Rotating, PhaseFlow, ApplyToCenters
|
||||||
from animation.transform import Transform, ApplyMethod, FadeOut
|
from animation.transform import Transform, ApplyMethod, FadeOut
|
||||||
|
|
||||||
from helpers import *
|
from helpers import *
|
||||||
|
@ -82,19 +83,18 @@ class FluidFlow(Scene):
|
||||||
self.play(ShowCreation(self.arrows))
|
self.play(ShowCreation(self.arrows))
|
||||||
self.dither()
|
self.dither()
|
||||||
|
|
||||||
|
def add_paddle(self):
|
||||||
|
pass
|
||||||
|
|
||||||
def flow(self, **kwargs):
|
def flow(self, **kwargs):
|
||||||
if not hasattr(self, "function"):
|
if not hasattr(self, "function"):
|
||||||
raise Exception("Must run use_function first")
|
raise Exception("Must run use_function first")
|
||||||
|
self.play(ApplyToCenters(
|
||||||
self.play(*[
|
PhaseFlow,
|
||||||
ApplyMethod(
|
self.dots.split(),
|
||||||
dot.shift,
|
function = self.function,
|
||||||
self.function(dot.get_center()),
|
**kwargs
|
||||||
**kwargs
|
))
|
||||||
)
|
|
||||||
for dot in self.dots.split()
|
|
||||||
])
|
|
||||||
|
|
||||||
def label(self, text, time = 5):
|
def label(self, text, time = 5):
|
||||||
mob = TextMobject(text)
|
mob = TextMobject(text)
|
||||||
|
@ -183,7 +183,7 @@ class OutwardFlow(FluidFlow):
|
||||||
""")
|
""")
|
||||||
self.dither(3)
|
self.dither(3)
|
||||||
|
|
||||||
class ArticleExample(FluidFlow):
|
class DivergenceArticleExample(FluidFlow):
|
||||||
def construct(self):
|
def construct(self):
|
||||||
def raw_function((x, y, z)):
|
def raw_function((x, y, z)):
|
||||||
return (2*x-y, y*y, 0)
|
return (2*x-y, y*y, 0)
|
||||||
|
@ -202,48 +202,42 @@ class ArticleExample(FluidFlow):
|
||||||
|
|
||||||
|
|
||||||
class IncompressibleFluid(FluidFlow):
|
class IncompressibleFluid(FluidFlow):
|
||||||
|
DEFAULT_CONFIG = {
|
||||||
|
"points_width" : 2*SPACE_WIDTH,
|
||||||
|
"points_height" : 1.4*SPACE_HEIGHT
|
||||||
|
}
|
||||||
def construct(self):
|
def construct(self):
|
||||||
self.use_function(
|
self.use_function(
|
||||||
lambda (x, y, z) : (1, np.sin(x), 0)
|
lambda (x, y, z) : RIGHT+np.sin(x)*UP
|
||||||
)
|
)
|
||||||
self.add_plane()
|
self.add_plane()
|
||||||
self.add_arrows()
|
self.add_arrows()
|
||||||
self.add_dots()
|
self.add_dots()
|
||||||
self.flow()
|
for x in range(8):
|
||||||
self.remove(self.arrows)
|
self.flow(
|
||||||
self.dither(3)
|
run_time = 1,
|
||||||
|
rate_func = None,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ConstantInwardFlow(FluidFlow):
|
class ConstantInwardFlow(FluidFlow):
|
||||||
|
DEFAULT_CONFIG = {
|
||||||
|
"points_height" : 3*SPACE_HEIGHT,
|
||||||
|
"points_width" : 3*SPACE_WIDTH,
|
||||||
|
}
|
||||||
def construct(self):
|
def construct(self):
|
||||||
self.use_function(
|
self.use_function(
|
||||||
lambda p : -p/(2*np.linalg.norm(0.5*p)**0.5+0.01)
|
lambda p : -3*p/(np.linalg.norm(p)+0.1)
|
||||||
)
|
)
|
||||||
self.add_plane()
|
self.add_plane()
|
||||||
self.add_arrows()
|
self.add_arrows()
|
||||||
self.add_dots()
|
self.add_dots()
|
||||||
for x in range(4):
|
for x in range(4):
|
||||||
dots = self.dots.split()
|
self.flow(
|
||||||
dot = dots[0].copy().center()
|
run_time = 5,
|
||||||
for x in np.arange(7.5, 9.5, 0.5):
|
rate_func = None,
|
||||||
for y in np.arange(-4, 4.5, 0.5):
|
)
|
||||||
dots.append(dot.copy().shift(
|
|
||||||
x*RIGHT + y*UP
|
|
||||||
))
|
|
||||||
dots.append(dot.copy().shift(
|
|
||||||
x*LEFT + y*UP
|
|
||||||
))
|
|
||||||
for x in np.arange(-9.5, 10, 0.5):
|
|
||||||
for y in np.arange(4.5, 6.5, 0.5):
|
|
||||||
dots.append(dot.copy().shift(
|
|
||||||
x*RIGHT + y*UP
|
|
||||||
))
|
|
||||||
dots.append(dot.copy().shift(
|
|
||||||
x*RIGHT + y*DOWN
|
|
||||||
))
|
|
||||||
self.dots = Mobject(*dots)
|
|
||||||
self.flow(rate_func = None)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -271,6 +265,9 @@ class ConstantOutwardFlow(FluidFlow):
|
||||||
|
|
||||||
|
|
||||||
class ConstantPositiveCurl(FluidFlow):
|
class ConstantPositiveCurl(FluidFlow):
|
||||||
|
DEFAULT_CONFIG = {
|
||||||
|
"points_height" : SPACE_WIDTH,
|
||||||
|
}
|
||||||
def construct(self):
|
def construct(self):
|
||||||
self.use_function(
|
self.use_function(
|
||||||
lambda p : 0.5*(-p[1]*RIGHT+p[0]*UP)
|
lambda p : 0.5*(-p[1]*RIGHT+p[0]*UP)
|
||||||
|
@ -278,7 +275,63 @@ class ConstantPositiveCurl(FluidFlow):
|
||||||
self.add_plane()
|
self.add_plane()
|
||||||
self.add_arrows(true_length = True)
|
self.add_arrows(true_length = True)
|
||||||
self.add_dots()
|
self.add_dots()
|
||||||
self.play(Rotating(self.dots, run_time = 10))
|
for x in range(10):
|
||||||
|
self.flow(
|
||||||
|
rate_func = None
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ComplexCurlExample(FluidFlow):
|
||||||
|
def construct(self):
|
||||||
|
self.use_function(
|
||||||
|
lambda (x, y, z) : np.cos(x+y)*RIGHT+np.sin(x*y)*UP
|
||||||
|
)
|
||||||
|
self.add_plane()
|
||||||
|
self.add_arrows(true_length = True)
|
||||||
|
self.add_dots()
|
||||||
|
for x in range(4):
|
||||||
|
self.flow(
|
||||||
|
run_time = 5,
|
||||||
|
rate_func = None,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class FourSwirls(FluidFlow):
|
||||||
|
DEFAULT_CONFIG = {
|
||||||
|
"points_height" :SPACE_WIDTH,
|
||||||
|
"points_width" : SPACE_WIDTH,
|
||||||
|
}
|
||||||
|
def construct(self):
|
||||||
|
circles = [
|
||||||
|
Circle().shift(3*vect)
|
||||||
|
for vect in compass_directions()
|
||||||
|
]
|
||||||
|
self.use_function(
|
||||||
|
lambda (x, y, z) : 0.5*(y**3-9*y)*RIGHT+(x**3-9*x)*UP
|
||||||
|
)
|
||||||
|
self.add_plane()
|
||||||
|
self.add_arrows()
|
||||||
|
|
||||||
|
Mobject(*circles).show()
|
||||||
|
|
||||||
|
for circle in circles:
|
||||||
|
self.play(ShowCreation(circle))
|
||||||
|
self.add_dots()
|
||||||
|
for x in range(4):
|
||||||
|
self.flow(
|
||||||
|
run_time = 5,
|
||||||
|
rate_func = None,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue