Advertisement
NikaGreg

Untitled

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