code: def on_timer(self, event):
      polygon, ellipse, rect, rpolygon = self.visuals
      r = ellipse.radius
      ellipse.radius = r[0], r[1] + np.sin(event.elapsed * 10)
      ellipse.span_angle = (ellipse.span_angle + 100.0 * event.dt) % 360
  
      c = (
          0.3 * (0.5 + np.sin(event.elapsed * 2 + 0)),
          0.3 * (0.5 + np.sin(event.elapsed * 2 + np.pi * 2.0 / 3.0)),
          0.3 * (0.5 + np.sin(event.elapsed * 2 + np.pi * 4.0 / 3.0)),
      )
      polygon.color = c
      polygon.border_color = (
          0.8,
          0.8,
          0.8,
          0.5 + (0.5 * np.sin(event.elapsed * 10)),
      )
  
      rpolygon.radius = 100 + 10 * np.sin(event.elapsed * 3.1)
      rpolygon.sides = int(20 + 17 * np.sin(event.elapsed))
  
      self.update()
  
file_path: vispy/examples/basics/visuals/dynamic_polygon.py
imports: import sys
  import numpy
  from vispy import app, visuals
  from vispy.visuals import transforms
label_desc: Use image node_id 4 for calling the Canvas obj's underlying member method code with example usage: obj.on_timer(event) without return types