summaryrefslogtreecommitdiff
path: root/FSF-2020/calculus-of-several-variables/div-curl-grad-and-all-that/Greens Theorem/GreensTheorem_file2_line-int.py
diff options
context:
space:
mode:
Diffstat (limited to 'FSF-2020/calculus-of-several-variables/div-curl-grad-and-all-that/Greens Theorem/GreensTheorem_file2_line-int.py')
-rw-r--r--FSF-2020/calculus-of-several-variables/div-curl-grad-and-all-that/Greens Theorem/GreensTheorem_file2_line-int.py132
1 files changed, 132 insertions, 0 deletions
diff --git a/FSF-2020/calculus-of-several-variables/div-curl-grad-and-all-that/Greens Theorem/GreensTheorem_file2_line-int.py b/FSF-2020/calculus-of-several-variables/div-curl-grad-and-all-that/Greens Theorem/GreensTheorem_file2_line-int.py
new file mode 100644
index 0000000..704acf7
--- /dev/null
+++ b/FSF-2020/calculus-of-several-variables/div-curl-grad-and-all-that/Greens Theorem/GreensTheorem_file2_line-int.py
@@ -0,0 +1,132 @@
+from manimlib.imports import *
+
+def field_func(coordinate):
+ x,y = coordinate[:2]
+ return np.array([
+ -x,
+ -y,
+ 0
+ ])
+
+
+class LineIntegral(MovingCameraScene, Scene):
+ def setup(self):
+ MovingCameraScene.setup(self)
+ Scene.setup(self)
+
+ def get_pending(self,path,proportion,dx=0.01):
+ if proportion < 1:
+ coord_i = path.point_from_proportion(proportion)
+ coord_f = path.point_from_proportion(proportion+dx)
+ else:
+ coord_i = path.point_from_proportion(proportion-dx)
+ coord_f = path.point_from_proportion(proportion)
+ line = Line(coord_i,coord_f)
+ angle = line.get_angle()
+ return angle
+
+ def construct(self):
+
+
+ # all the text
+ vec_f = TexMobject(r"\vec F",r" \textit{ is a vector field defined on the plane}").set_color("#EDF2EF")
+ c = TexMobject(r"C",r" \textit{ is a curve on the plane, oriented counter-clockwise.}").set_color("#EDF2EF")
+ dr = TexMobject(r"\vec dr", r"\textit{ gives the direction as we move along C}").set_color("#EDF2EF")
+
+ intg = TexMobject(r"\oint \vec F \cdot \vec dr", r"\textit{ gives the rotation along the curve}").shift(2.5*DOWN).scale(0.7).set_color("#EDF2EF")
+ text = VGroup(vec_f, c, dr).scale(0.6).set_stroke(width = 1.5)
+ text.arrange(DOWN, buff = 0.2)
+ text.shift(3.2*DOWN)
+
+ vec_f[0].set_color("#D1D646")
+ dr[0].set_color("#D1D646")
+ intg[0].set_color("#D1D646")
+
+
+
+
+ self.camera_frame.save_state()
+ vec_f_sym = TexMobject(r"\vec F")
+ c_sym = TexMobject(r"C").move_to(4.8*RIGHT+1.3*UP)
+ dr_sym = TexMobject(r"\vec dr").next_to(vec_f_sym, DOWN, buff = SMALL_BUFF)
+ dp_sym = TexMobject(r"\vec F \cdot \vec dr")
+ intg_sym = TexMobject(r"\oint \vec F \cdot \vec dr")
+
+ symbols = VGroup(vec_f_sym, dr_sym, dp_sym, intg_sym).shift(3*UP).set_color("#D1D646")
+
+
+
+
+ vector_field = VectorField(field_func, x_min = -15, x_max = 15, y_min = -15, y_max = 15).fade(0.5)
+ boundary = Ellipse(width = 9, height = 3).set_color("#32908F")
+ b2 = Ellipse(width = 9, height = 3).set_color(WHITE)
+
+ start_angle = self.get_pending(boundary, 0)
+
+ pointer = Triangle(fill_opacity = 1).set_height(0.25).set_color(WHITE)
+ pointer.set_fill(WHITE)
+ pointer.move_to(boundary.get_start())
+ pointer.rotate(- PI / 2)
+ pointer.save_state()
+ pointer.rotate(start_angle, about_point=pointer.get_center())
+ dp_sym_1 = TexMobject(r"\vec F \cdot \vec dr").next_to(pointer, RIGHT, buff = SMALL_BUFF).scale(0.5).set_color("#D1D646").add_background_rectangle()
+ intg_sym_1 = TexMobject(r"\oint \vec F \cdot \vec dr").next_to(pointer, RIGHT, buff = SMALL_BUFF).scale(0.5).set_color("#75485E").add_background_rectangle()
+ dp = TexMobject(r"\vec F \cdot \vec dr \textit{ measures whether } \vec F \textit{ and } \vec dr", r" \textit{ are oriented the same way }").next_to(dp_sym_1, DOWN, buff = SMALL_BUFF).scale(0.3).set_color("#EDF2EF")
+ dp[1].next_to(dp[0], DOWN, buff = SMALL_BUFF)
+
+
+ # groups according to animation
+ #one = VGroup( vec_f, vec_f_sym)
+ #two = VGroup(boundary, c_sym)
+ #three = VGroup(dr_sym, pointer)
+ #four = VGroup(dp, dp_sym) #this is when to zoom in
+ #five = VGroup(intg, intg_sym)
+
+ delete = VGroup(vec_f, vec_f_sym, c, dr, dr_sym)
+
+
+ self.play(ShowCreation(vec_f), ShowCreation(vec_f_sym))
+ self.wait()
+ self.play(ShowCreation(vector_field), Indicate(vec_f_sym))
+ self.wait(2)
+ self.play(ShowCreation(c))
+ self.wait()
+ self.play(ShowCreation(boundary), ShowCreation(c_sym), Indicate(c))
+ self.wait(2)
+ self.play(ShowCreation(dr))
+ self.wait(2)
+ self.play(ShowCreation(dr_sym), Indicate(dr), ShowCreation(pointer))
+
+ self.play(FadeOut(delete))
+ self.play(
+ self.camera_frame.scale,.25,
+ self.camera_frame.move_to,pointer
+ )
+ self.play(ShowCreation(dp_sym_1), ShowCreation(dp[0]), ShowCreation(dp[1]))
+ self.add(dp_sym)
+ self.wait(3)
+ self.play(Restore(self.camera_frame))
+ self.remove(dp[0], dp[1], dp_sym_1)
+ self.wait()
+ self.add(boundary, pointer, self.camera_frame)
+ def update_rotate_move(mob,alpha):
+ pointer.restore()
+
+ angle = self.get_pending(boundary,alpha)
+
+ pointer.move_to(boundary.point_from_proportion(alpha))
+ pointer.rotate(angle, about_point=pointer.get_center())
+
+
+
+ self.play(
+ #self.camera_frame.scale,.25,
+ UpdateFromAlphaFunc(pointer,update_rotate_move),
+ run_time=3,
+ )
+ self.play(Write(b2))
+ self.play(ReplacementTransform(dp_sym, intg_sym), ShowCreation(intg))
+ self.play(ReplacementTransform(b2, intg_sym))
+ self.play(Indicate(intg_sym))
+ self.wait(2)
+