Advertisement
NikaGreg

Untitled

Apr 5th, 2023
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.94 KB | None | 0 0
  1. from manim import *
  2. from manim import GrowFromCenter as Grow
  3. from geom_func import *
  4.  
  5. def split_segment(A, B, k):
  6.     """ Координаты точки, которая делит отрезок AB в отношении k:1, считая от A """
  7.     N = np.array(
  8.         [
  9.             (A[0] + B[0] * k) / (1 + k),
  10.             (A[1] + B[1] * k) / (1 + k),
  11.             0
  12.         ]
  13.     )
  14.     return N
  15.  
  16.  
  17. def extend_segment(A, B, k):
  18.     """ Координаты точки, лежащей на продолжении отрезка AB за точку B через k единиц """
  19.     dAB = distance(A, B)
  20.     vAB = direction_vector(A, B) / dAB
  21.     C = B + vAB * k
  22.     return C
  23.  
  24. config.background_color = WHITE
  25.  
  26. LINE_BLUE = '#006699'
  27. LINE_ORANGE = '#ff6600'
  28. DOT_BLUE = '#0099ff'
  29.  
  30.  
  31. class Cheva_s_Theorem(Scene):
  32.     def construct(self):
  33.         DashedLine.set_default(dash_length = DEFAULT_DASH_LENGTH*2, dashed_ratio=0.6)
  34.         MathTex.set_default(color=BLACK)
  35.         # Треугольник
  36.         A = 6 * LEFT + 2 * DOWN
  37.         B = 4 * LEFT + 3 * UP
  38.         C = 0.5 * LEFT + 2 * DOWN
  39.         kwargs = {
  40.             "radius": 0.045,
  41.             "stroke_width": 0.75,
  42.             "stroke_color": '#000',
  43.             "z_index": 1,
  44.             "stroke_opacity": 1,
  45.             "fill_color": DOT_BLUE,
  46.         }
  47.         pA, pB, pC = [Dot(p, **kwargs) for p in [A, B, C]]  
  48.         ABC = always_redraw(lambda:
  49.             Polygon(
  50.                 pA.get_center(),
  51.                 pB.get_center(),
  52.                 pC.get_center(),
  53.                 stroke_width=2.5,
  54.                 stroke_color=LINE_BLUE,
  55.             )
  56.         )
  57.         # отметки на сторонах
  58.         c1, a1 = (ValueTracker(i) for i in [0.5, 0.7])
  59.         dots = VGroup()
  60.         for i in [(pA, pB, c1), (pB, pC, a1)]:
  61.             dot = always_redraw(lambda i=i: Dot(
  62.                 split_segment(i[0].get_center(), i[1].get_center(), i[2].get_value()),
  63.                 **kwargs
  64.                 )
  65.             )
  66.             dots.add(dot)
  67.         C1, A1 = dots
  68.  
  69.         pK = always_redraw(lambda:
  70.             Dot(
  71.                 line_intersection(
  72.                     [pA.get_center(), A1.get_center()],
  73.                     [pC.get_center(), C1.get_center()]),
  74.                     **kwargs
  75.             )
  76.         )
  77.         B1 = always_redraw(lambda:
  78.             Dot(
  79.                 line_intersection(
  80.                     [pA.get_center(), pC.get_center()],
  81.                     [pB.get_center(), extend_segment(pB.get_center(), pK.get_center(), 5)]),
  82.                     **kwargs
  83.             )
  84.         )
  85.         dots.add(B1)
  86.         # чевианы
  87.         lines = VGroup()
  88.         for d in [(pA, A1), (pB, B1), (pC, C1)]:
  89.             line = always_redraw(lambda d=d:
  90.                 Line(d[0].get_center(), d[1].get_center()).set_stroke(LINE_ORANGE, 2.5)
  91.             )
  92.             lines.add(line)
  93.        
  94.         # лейблы
  95.         # labels = VGroup()
  96.         # num = ["A", "B", "C", "A_1", "B_1", "C_1"]
  97.         # for i, s in enumerate([pA, pB, pC, A1, B1, C1]):
  98.         #     vec = normalize(s.get_center() - pK.get_center())
  99.         #     label = always_redraw(lambda i=i:
  100.         #         MathTex(f"{num[i]}").scale(0.6).next_to(s, vec, buff = 0.1)
  101.         #     )
  102.         #     labels.add(label)
  103.  
  104.         labels = MathTex('A', 'B', 'C', 'A_1', 'B_1', 'C_1').scale(0.6).set_color(BLACK).set_z_index(3)
  105.         for i, s in enumerate([pA, pB, pC, A1, B1, C1]):
  106.             vec = normalize(s.get_center() - pK.get_center())
  107.             labels[i].add_updater(lambda i: i.next_to(s, vec, buff = 0.1))
  108.  
  109.         # анимации
  110.         self.add(pA, pB, pC, ABC, dots, lines, pK, labels)
  111.         pairs = [(a1, 2.5), (c1, 1.5)]
  112.         anims = [v.animate.set_value(t) for v, t in pairs]
  113.         anims_kwargs = {"run_time": 8, "rate_func": there_and_back}
  114.         self.play(*anims, **anims_kwargs)
  115.         self.wait()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement