code: def ellipse(self, x, y, width, height, edges = None):
          
          # the automatic edge case is somewhat arbitrary
          steps = edges or max((32, width, height)) / 2
  
          angle = 0
          step = math.pi * 2 / steps
          points = []
          while angle < math.pi * 2:
              points.append((width / 2.0 * math.cos(angle),
                             height / 2.0 * math.sin(angle)))
              angle += step
  
          min_x = min((point[0] for point in points))
          min_y = min((point[1] for point in points))
  
          self.move_to(points[0][0] - min_x + x, points[0][1] - min_y + y)
          for p_x, p_y in points:
              self.line_to(p_x - min_x + x, p_y - min_y + y)
          self.line_to(points[0][0] - min_x + x, points[0][1] - min_y + y)
docs: draw 'perfect' ellipse, opposed to squashed circle. works also for
             equilateral polygons