prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Remove references to t_min and t_max in ParametricFunction
  ## Description of bug / unexpected behavior
  
  With PR #1161 the old way of setting the parameter's range (e.g. by setting `t_min` and `t_max`) was replaced by a single parameter `t_range`. However, the docs still show usage of `t_min` and `t_max`.
  
  
  
  
  </issue>
  <code>
  [start of manim/mobject/functions.py]
  1 """Mobjects representing function graphs."""
  2 
  3 __all__ = ["ParametricFunction", "FunctionGraph"]
  4 
  5 
  6 import numpy as np
  7 
  8 from .. import config
  9 from ..constants import *
  10 from ..mobject.types.vectorized_mobject import VMobject
  11 from ..utils.color import YELLOW
  12 
  13 
  14 class ParametricFunction(VMobject):
  15     """A parametric curve.
  16 
  17     Examples
  18     --------
  19 
  20     .. manim:: PlotParametricFunction
  21         :save_last_frame:
  22 
  23         class PlotParametricFunction(Scene):
  24             def func(self, t):
  25                 return np.array((np.sin(2 * t), np.sin(3 * t), 0))
  26 
  27             def construct(self):
  28                 func = ParametricFunction(self.func, t_max = TAU, fill_opacity=0).set_color(RED)
  29                 self.add(func.scale(3))
  30 
  31     .. manim:: ThreeDParametricSpring
  32         :save_last_frame:
  33 
  34         class ThreeDParametricSpring(ThreeDScene):
  35             def construct(self):
  36                 curve1 = ParametricFunction(
  37                     lambda u: np.array([
  38                         1.2 * np.cos(u),
  39                         1.2 * np.sin(u),
  40                         u * 0.05
  41                     ]), color=RED, t_min=-3 * TAU, t_max=5 * TAU,
  42                 ).set_shade_in_3d(True)
  43                 axes = ThreeDAxes()
  44                 self.add(axes, curve1)
  45                 self.set_camera_orientation(phi=80 * DEGREES, theta=-60 * DEGREES)
  46                 self.wait()
  47     """
  48 
  49     def __init__(
  50         self,
  51         function=None,
  52         t_range=None,
  53         dt=1e-8,
  54         discontinuities=None,
  55         use_smoothing=True,
  56         **kwargs
  57     ):
  58         self.function = function
  59         t_range = np.array([0, 1, 0.01]) if t_range is None else t_range
  60         if len(t_range) == 2:
  61             t_range = [*t_range, 0.01]
  62 
  63         self.dt = dt
  64         self.discontinuities = [] if discontinuities is None else discontinuities
  65         self.use_smoothing = use_smoothing
  66         self.t_min, self.t_max, self.t_step = t_range
  67 
  68         VMobject.__init__(self, **kwargs)
  69 
  70     def get_function(self):
  71         return self.function
  72 
  73     def get_point_from_function(self, t):
  74         return self.function(t)
  75 
  76     def generate_points(self):
  77 
  78         discontinuities = filter(
  79             lambda t: self.t_min <= t <= self.t_max, self.discontinuities
  80         )
  81         discontinuities = np.array(list(discontinuities))
  82         boundary_times = [
  83             self.t_min,
  84             self.t_max,
  85             *(discontinuities - self.dt),
  86             *(discontinuities + self.dt),
  87         ]
  88         boundary_times.sort()
  89         for t1, t2 in zip(boundary_times[0::2], boundary_times[1::2]):
  90             t_range = [*np.arange(t1, t2, self.t_step), t2]
  91             points = np.array([self.function(t) for t in t_range])
  92             self.start_new_path(points[0])
  93             self.add_points_as_corners(points[1:])
  94         if self.use_smoothing:
  95             # TODO: not in line with upstream, approx_smooth does not exist
  96             self.make_smooth()
  97         return self
  98 
  99 
  100 class FunctionGraph(ParametricFunction):
  101     def __init__(self, function, x_range=None, color=YELLOW, **kwargs):
  102 
  103         if x_range is None:
  104             x_range = np.array([-config["frame_x_radius"], config["frame_x_radius"]])
  105 
  106         self.x_range = x_range
  107         self.parametric_function = lambda t: np.array([t, function(t), 0])
  108         self.function = function
  109         super().__init__(self.parametric_function, self.x_range, color=color, **kwargs)
  110 
  111     def get_function(self):
  112         return self.function
  113 
  114     def get_point_from_function(self, x):
  115         return self.parametric_function(x)
  116
  [end of manim/mobject/functions.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/manim/mobject/functions.py b/manim/mobject/functions.py
  --- a/manim/mobject/functions.py
  +++ b/manim/mobject/functions.py
  @@ -25,7 +25,7 @@
                   return np.array((np.sin(2 * t), np.sin(3 * t), 0))
   
               def construct(self):
  -                func = ParametricFunction(self.func, t_max = TAU, fill_opacity=0).set_color(RED)
  +                func = ParametricFunction(self.func, t_range = np.array([0, TAU]), fill_opacity=0).set_color(RED)
                   self.add(func.scale(3))
   
       .. manim:: ThreeDParametricSpring
  @@ -38,7 +38,7 @@
                           1.2 * np.cos(u),
                           1.2 * np.sin(u),
                           u * 0.05
  -                    ]), color=RED, t_min=-3 * TAU, t_max=5 * TAU,
  +                    ]), color=RED, t_range = np.array([-3*TAU, 5*TAU, 0.01])
                   ).set_shade_in_3d(True)
                   axes = ThreeDAxes()
                   self.add(axes, curve1)
  
verification_info: {"golden_diff": "diff --git a/manim/mobject/functions.py b/manim/mobject/functions.py\n--- a/manim/mobject/functions.py\n+++ b/manim/mobject/functions.py\n@@ -25,7 +25,7 @@\n                 return np.array((np.sin(2 * t), np.sin(3 * t), 0))\n \n             def construct(self):\n-                func = ParametricFunction(self.func, t_max = TAU, fill_opacity=0).set_color(RED)\n+                func = ParametricFunction(self.func, t_range = np.array([0, TAU]), fill_opacity=0).set_color(RED)\n                 self.add(func.scale(3))\n \n     .. manim:: ThreeDParametricSpring\n@@ -38,7 +38,7 @@\n                         1.2 * np.cos(u),\n                         1.2 * np.sin(u),\n                         u * 0.05\n-                    ]), color=RED, t_min=-3 * TAU, t_max=5 * TAU,\n+                    ]), color=RED, t_range = np.array([-3*TAU, 5*TAU, 0.01])\n                 ).set_shade_in_3d(True)\n                 axes = ThreeDAxes()\n                 self.add(axes, curve1)\n", "issue": "Remove references to t_min and t_max in ParametricFunction\n## Description of bug / unexpected behavior\r\n\r\nWith PR #1161 the old way of setting the parameter's range (e.g. by setting `t_min` and `t_max`) was replaced by a single parameter `t_range`. However, the docs still show usage of `t_min` and `t_max`.\r\n\r\n\r\n\n", "before_files": [{"content": "\"\"\"Mobjects representing function graphs.\"\"\"\n\n__all__ = [\"ParametricFunction\", \"FunctionGraph\"]\n\n\nimport numpy as np\n\nfrom .. import config\nfrom ..constants import *\nfrom ..mobject.types.vectorized_mobject import VMobject\nfrom ..utils.color import YELLOW\n\n\nclass ParametricFunction(VMobject):\n    \"\"\"A parametric curve.\n\n    Examples\n    --------\n\n    .. manim:: PlotParametricFunction\n        :save_last_frame:\n\n        class PlotParametricFunction(Scene):\n            def func(self, t):\n                return np.array((np.sin(2 * t), np.sin(3 * t), 0))\n\n            def construct(self):\n                func = ParametricFunction(self.func, t_max = TAU, fill_opacity=0).set_color(RED)\n                self.add(func.scale(3))\n\n    .. manim:: ThreeDParametricSpring\n        :save_last_frame:\n\n        class ThreeDParametricSpring(ThreeDScene):\n            def construct(self):\n                curve1 = ParametricFunction(\n                    lambda u: np.array([\n                        1.2 * np.cos(u),\n                        1.2 * np.sin(u),\n                        u * 0.05\n                    ]), color=RED, t_min=-3 * TAU, t_max=5 * TAU,\n                ).set_shade_in_3d(True)\n                axes = ThreeDAxes()\n                self.add(axes, curve1)\n                self.set_camera_orientation(phi=80 * DEGREES, theta=-60 * DEGREES)\n                self.wait()\n    \"\"\"\n\n    def __init__(\n        self,\n        function=None,\n        t_range=None,\n        dt=1e-8,\n        discontinuities=None,\n        use_smoothing=True,\n        **kwargs\n    ):\n        self.function = function\n        t_range = np.array([0, 1, 0.01]) if t_range is None else t_range\n        if len(t_range) == 2:\n            t_range = [*t_range, 0.01]\n\n        self.dt = dt\n        self.discontinuities = [] if discontinuities is None else discontinuities\n        self.use_smoothing = use_smoothing\n        self.t_min, self.t_max, self.t_step = t_range\n\n        VMobject.__init__(self, **kwargs)\n\n    def get_function(self):\n        return self.function\n\n    def get_point_from_function(self, t):\n        return self.function(t)\n\n    def generate_points(self):\n\n        discontinuities = filter(\n            lambda t: self.t_min <= t <= self.t_max, self.discontinuities\n        )\n        discontinuities = np.array(list(discontinuities))\n        boundary_times = [\n            self.t_min,\n            self.t_max,\n            *(discontinuities - self.dt),\n            *(discontinuities + self.dt),\n        ]\n        boundary_times.sort()\n        for t1, t2 in zip(boundary_times[0::2], boundary_times[1::2]):\n            t_range = [*np.arange(t1, t2, self.t_step), t2]\n            points = np.array([self.function(t) for t in t_range])\n            self.start_new_path(points[0])\n            self.add_points_as_corners(points[1:])\n        if self.use_smoothing:\n            # TODO: not in line with upstream, approx_smooth does not exist\n            self.make_smooth()\n        return self\n\n\nclass FunctionGraph(ParametricFunction):\n    def __init__(self, function, x_range=None, color=YELLOW, **kwargs):\n\n        if x_range is None:\n            x_range = np.array([-config[\"frame_x_radius\"], config[\"frame_x_radius\"]])\n\n        self.x_range = x_range\n        self.parametric_function = lambda t: np.array([t, function(t), 0])\n        self.function = function\n        super().__init__(self.parametric_function, self.x_range, color=color, **kwargs)\n\n    def get_function(self):\n        return self.function\n\n    def get_point_from_function(self, x):\n        return self.parametric_function(x)\n", "path": "manim/mobject/functions.py"}]}