<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_paths(self, x1, y1, x2, y2, panel_params, coord, ax):
 """ Compute paths that create the arrow heads Parameters x1, y1, x2, y2 : array_like List of points that define the tails of the arrows. The arrow heads will be at x1, y1. If you need them at x2, y2 reverse the input. Returns ------- out : list of Path Paths that create arrow heads """

        Path = mpath.Path

        # Create reusable lists of vertices and codes
        # arrowhead path has 3 vertices (Nones),
        # plus dummy vertex for the STOP code
        verts = [None, None, None,
                 (0, 0)]

        # codes list remains the same after initialization
        codes = [Path.MOVETO, Path.LINETO, Path.LINETO,
                 Path.STOP]

        # Slices into the vertices list
        slc = slice(0, 3)

        # We need the plot dimensions so that we can
        # compute scaling factors
        fig = ax.get_figure()
        width, height = fig.get_size_inches()
        ranges = coord.range(panel_params)
        width_ = np.ptp(ranges.x)
        height_ = np.ptp(ranges.y)

        # scaling factors to prevent skewed arrowheads
        lx = self.length * width_/width
        ly = self.length * height_/height

        # angle in radians
        a = self.angle * np.pi / 180

        # direction of arrow head
        xdiff, ydiff = x2 - x1, y2 - y1
        rotations = np.arctan2(ydiff/ly, xdiff/lx)

        # Arrow head vertices
        v1x = x1 + lx * np.cos(rotations + a)
        v1y = y1 + ly * np.sin(rotations + a)
        v2x = x1 + lx * np.cos(rotations - a)
        v2y = y1 + ly * np.sin(rotations - a)

        # create a path for each arrow head
        paths = []
        for t in zip(v1x, v1y, x1, y1, v2x, v2y):
            verts[slc] = [t[:2], t[2:4], t[4:]]
            paths.append(Path(verts, codes))

        return paths