epicycloids

Animate Clock Incomplete Circle

May 27th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. from manimlib.imports import *
  2.  
  3. class ClockOrganization(VGroup):
  4.   CONFIG = {
  5.     "numbers" : 4,
  6.     "radius" : 3.1,
  7.     "color" : WHITE
  8.   }
  9.  
  10.   def __init__(self, **kwargs):
  11.     digest_config(self, kwargs, locals())
  12.     self.generate_nodes()
  13.     VGroup.__init__(self, *self.node_list,**kwargs)
  14.    
  15.   def generate_nodes(self):
  16.     self.node_list = []
  17.     for i in range(self.numbers):
  18.       mobject = VMobject()
  19.       number = TexMobject(str(i+1))
  20.       circle = Circle(radius=0.4,color=self.color)
  21.       mobject.add(number)
  22.       mobject.add(circle)
  23.       mobject.move_to(
  24.         self.radius * np.cos((-TAU / self.numbers) * i + 17*TAU / 84) * RIGHT
  25.         + self.radius * np.sin((-TAU / self.numbers) * i + 17*TAU / 84) * UP
  26.       )
  27.       self.node_list.append(mobject)
  28.  
  29.   def select_node(self, node):
  30.     selected_node = self.node_list[node]
  31.     selected_node.scale(1.2)
  32.     selected_node.set_color(RED)
  33.    
  34.   def deselect_node(self, selected_node):
  35.     node = self.node_list[selected_node]
  36.     node.scale(0.8)
  37.     node.set_color(self.color)
  38.  
  39. class Testing4(Scene):
  40.   def construct(self):
  41.     test = ClockOrganization(numbers=21)
  42.     self.play(Write(test), run_time=1.5)
  43.     animation_steps=[]
  44.     #animation_steps.append(test)
  45.     num_circ=15
  46.     for i in range(num_circ):
  47.       thing = test.deepcopy()
  48.       thing.select_node((1+i)%test.numbers-1)
  49.       animation_steps.append(thing)
  50.     test_normal=test.copy()
  51.     test.save_state()
  52.     self.play(Transform(test, animation_steps[0]))
  53.     self.wait(2)
  54.     anims=[Restore(test)]
  55.     theta=180*DEGREES/num_circ
  56.     lag_constant=1.25
  57.     for i in range(1,num_circ+1):
  58.         test.node_list[(1+i)%test.numbers-1].generate_target()
  59.         test.node_list[(1+i)%test.numbers-1].target.scale(1.2)
  60.         test.node_list[(1+i)%test.numbers-1].target.set_color(RED)
  61.         if i in range(1,8):
  62.           stop_smooth=(lag_constant*sigmoid(-10/7.5*(i-3.46))-sigmoid(-5))/(1-2*sigmoid(-5))
  63.         else:
  64.           stop_smooth=(lag_constant*sigmoid(10/7.5*(i-7.5-0.812-3.46))-sigmoid(-5))/(1-2*sigmoid(-5))
  65.         if i in range(1,num_circ):
  66.           anims.append(MoveToTarget(test.node_list[(1+i)%test.numbers-1],rate_func=there_and_back))
  67.         else:
  68.           anims.append(MoveToTarget(test.node_list[(1+i)%test.numbers-1]))
  69.         anims.append(Animation(Mobject(),run_time=stop_smooth))
  70.     self.play(
  71.         AnimationGroup(*anims,lag_ratio=0.05)
  72.         )
  73.     self.wait()
Advertisement
Add Comment
Please, Sign In to add comment