From Random guy , 2 Weeks ago, written in Python.
Embed
  1. # -*- coding: utf-8 -*-
  2. # https://www.reddit.com/r/Python/comments/anqkfy/this_can_be_made_with_python/
  3.  
  4. import numpy as np
  5. import pylab as plt
  6. from matplotlib import animation, lines
  7.  
  8. class AxAnimation() :
  9.  
  10.     def __init__(self, idx, ax, spx, spy) :
  11.         self.idx = idx
  12.         self.ax = ax
  13.        
  14.         self.speed_x = spx
  15.         self.speed_y = spy
  16.         self.xvalues, self.yvalues = self.positions()
  17.  
  18.         self.circle = plt.Circle((5, -5), 0.5, fc='red', axes=self.ax)
  19.         self.line, = ax.plot(self.xvalues, self.yvalues, color="black")
  20.  
  21.     @staticmethod
  22.     def init_ax(ax) :
  23.         ax.set_xticks([])
  24.         ax.set_yticks([])
  25.         ax.set_xlim(0, 10)
  26.         ax.set_ylim(0, 10)
  27.  
  28.     def init_animate(self) :
  29.         self.circle.center = (5, 5)
  30.         self.ax.add_patch(self.circle)
  31.         return self.line, self.circle
  32.  
  33.     def positions(self) :
  34.         values = np.arange(0, 360)
  35.         xvalues = 5 + 3 * np.sin(np.radians(values * self.speed_x))
  36.         yvalues = 5 + 3 * np.cos(np.radians(values * self.speed_y))
  37.         return xvalues, yvalues
  38.  
  39.     def animate(self, i) :
  40.         self.circle.center = (self.xvalues[i], self.yvalues[i])
  41.         self.line.set_data(self.xvalues[:i], self.yvalues[:i])
  42.         return self.line, self.circle
  43.  
  44. def run() :
  45.    
  46.     n = 7
  47.  
  48.     fig, axes = plt.subplots(n, n, figsize=(6,6))
  49.     animations = []
  50.  
  51.     for ridx, row in enumerate(axes, start=1) :
  52.         for cidx, ax in enumerate(row, start=1) :
  53.             AxAnimation.init_ax(ax)
  54.             if ridx == cidx == 1 : continue
  55.  
  56.             if ridx == 1 or cidx == 1 :
  57.                 sridx = scidx = max((ridx, cidx))
  58.  
  59.             else :
  60.                 sridx, scidx = ridx, cidx
  61.  
  62.             aa = AxAnimation((ridx, cidx), ax, scidx, sridx)
  63.             animations.append(aa)
  64.  
  65.     init_fun = lambda : [patch for aa in animations for patch in aa.init_animate()]
  66.     anim_fun = lambda i : [patch for aa in animations for patch in aa.animate(i)]
  67.  
  68.     anim = animation.FuncAnimation(fig,
  69.                                func      = anim_fun,
  70.                                init_func = init_fun,
  71.                                frames    = 360,
  72.                                interval  = 30,
  73.                                blit      = True)
  74.  
  75.     plt.show()
  76.  
  77. if __name__ == "__main__" :
  78.     run()