logo.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. from manimlib.imports import *
  2. NEW_BLUE = "#68a8e1"
  3. class Thumbnail(GraphScene):
  4. CONFIG = {
  5. "y_max": 8,
  6. "y_axis_height": 5,
  7. }
  8. def construct(self):
  9. self.show_function_graph()
  10. def show_function_graph(self):
  11. self.setup_axes(animate=False)
  12. def func(x):
  13. return 0.1 * (x + 3-5) * (x - 3-5) * (x-5) + 5
  14. def rect(x):
  15. return 2.775*(x-1.5)+3.862
  16. recta = self.get_graph(rect,x_min=-1,x_max=5)
  17. graph = self.get_graph(func,x_min=0.2,x_max=9)
  18. graph.set_color(NEW_BLUE)
  19. input_tracker_p1 = ValueTracker(1.5)
  20. input_tracker_p2 = ValueTracker(3.5)
  21. def get_x_value(input_tracker):
  22. return input_tracker.get_value()
  23. def get_y_value(input_tracker):
  24. return graph.underlying_function(get_x_value(input_tracker))
  25. def get_x_point(input_tracker):
  26. return self.coords_to_point(get_x_value(input_tracker), 0)
  27. def get_y_point(input_tracker):
  28. return self.coords_to_point(0, get_y_value(input_tracker))
  29. def get_graph_point(input_tracker):
  30. return self.coords_to_point(get_x_value(input_tracker), get_y_value(input_tracker))
  31. def get_v_line(input_tracker):
  32. return DashedLine(get_x_point(input_tracker), get_graph_point(input_tracker), stroke_width=2)
  33. def get_h_line(input_tracker):
  34. return DashedLine(get_graph_point(input_tracker), get_y_point(input_tracker), stroke_width=2)
  35. #
  36. input_triangle_p1 = RegularPolygon(n=3, start_angle=TAU / 4)
  37. output_triangle_p1 = RegularPolygon(n=3, start_angle=0)
  38. for triangle in input_triangle_p1, output_triangle_p1:
  39. triangle.set_fill(WHITE, 1)
  40. triangle.set_stroke(width=0)
  41. triangle.scale(0.1)
  42. #
  43. input_triangle_p2 = RegularPolygon(n=3, start_angle=TAU / 4)
  44. output_triangle_p2 = RegularPolygon(n=3, start_angle=0)
  45. for triangle in input_triangle_p2, output_triangle_p2:
  46. triangle.set_fill(WHITE, 1)
  47. triangle.set_stroke(width=0)
  48. triangle.scale(0.1)
  49. #
  50. x_label_p1 = Tex("a")
  51. output_label_p1 = Tex("f(a)")
  52. x_label_p2 = Tex("b")
  53. output_label_p2 = Tex("f(b)")
  54. v_line_p1 = get_v_line(input_tracker_p1)
  55. v_line_p2 = get_v_line(input_tracker_p2)
  56. h_line_p1 = get_h_line(input_tracker_p1)
  57. h_line_p2 = get_h_line(input_tracker_p2)
  58. graph_dot_p1 = Dot(color=WHITE)
  59. graph_dot_p2 = Dot(color=WHITE)
  60. # reposition mobjects
  61. x_label_p1.next_to(v_line_p1, DOWN)
  62. x_label_p2.next_to(v_line_p2, DOWN)
  63. output_label_p1.next_to(h_line_p1, LEFT)
  64. output_label_p2.next_to(h_line_p2, LEFT)
  65. input_triangle_p1.next_to(v_line_p1, DOWN, buff=0)
  66. input_triangle_p2.next_to(v_line_p2, DOWN, buff=0)
  67. output_triangle_p1.next_to(h_line_p1, LEFT, buff=0)
  68. output_triangle_p2.next_to(h_line_p2, LEFT, buff=0)
  69. graph_dot_p1.move_to(get_graph_point(input_tracker_p1))
  70. graph_dot_p2.move_to(get_graph_point(input_tracker_p2))
  71. #
  72. self.play(
  73. ShowCreation(graph),
  74. )
  75. # Animacion del punto a
  76. self.add_foreground_mobject(graph_dot_p1)
  77. self.add_foreground_mobject(graph_dot_p2)
  78. self.play(
  79. DrawBorderThenFill(input_triangle_p1),
  80. Write(x_label_p1),
  81. ShowCreation(v_line_p1),
  82. GrowFromCenter(graph_dot_p1),
  83. ShowCreation(h_line_p1),
  84. Write(output_label_p1),
  85. DrawBorderThenFill(output_triangle_p1),
  86. DrawBorderThenFill(input_triangle_p2),
  87. Write(x_label_p2),
  88. ShowCreation(v_line_p2),
  89. GrowFromCenter(graph_dot_p2),
  90. ShowCreation(h_line_p2),
  91. Write(output_label_p2),
  92. DrawBorderThenFill(output_triangle_p2),
  93. run_time=0.5
  94. )
  95. self.add(
  96. input_triangle_p2,
  97. x_label_p2,
  98. graph_dot_p2,
  99. v_line_p2,
  100. h_line_p2,
  101. output_triangle_p2,
  102. output_label_p2,
  103. )
  104. ###################
  105. pendiente_recta = self.get_secant_slope_group(
  106. 1.9, recta, dx = 1.4,
  107. df_label = None,
  108. dx_label = None,
  109. dx_line_color = PURPLE,
  110. df_line_color= ORANGE,
  111. )
  112. grupo_secante = self.get_secant_slope_group(
  113. 1.5, graph, dx = 2,
  114. df_label = None,
  115. dx_label = None,
  116. dx_line_color = "#942357",
  117. df_line_color= "#3f7d5c",
  118. secant_line_color = RED,
  119. )
  120. self.add(
  121. input_triangle_p2,
  122. graph_dot_p2,
  123. v_line_p2,
  124. h_line_p2,
  125. output_triangle_p2,
  126. )
  127. self.play(FadeIn(grupo_secante))
  128. kwargs = {
  129. "x_min" : 4,
  130. "x_max" : 9,
  131. "fill_opacity" : 0.75,
  132. "stroke_width" : 0.25,
  133. }
  134. self.graph=graph
  135. iteraciones=6
  136. self.rect_list = self.get_riemann_rectangles_list(
  137. graph, iteraciones,start_color=PURPLE,end_color=ORANGE, **kwargs
  138. )
  139. flat_rects = self.get_riemann_rectangles(
  140. self.get_graph(lambda x : 0), dx = 0.5,start_color=invert_color(PURPLE),end_color=invert_color(ORANGE),**kwargs
  141. )
  142. rects = self.rect_list[0]
  143. self.transform_between_riemann_rects(
  144. flat_rects, rects,
  145. replace_mobject_with_target_in_scene = True,
  146. run_time=0.9
  147. )
  148. # adding manim
  149. picture = Group(*self.mobjects)
  150. picture.scale(0.6).to_edge(LEFT, buff=SMALL_BUFF)
  151. manim = TexText("Manim").set_height(1.5) \
  152. .next_to(picture, RIGHT) \
  153. .shift(DOWN * 0.7)
  154. self.add(manim)