(points:Sequence[Point23], width:float=1, closed:bool=False)
return p_a + p_b
Return a set of points describing a path of width `width` around `points`,
    suitable for use as a polygon().  

    Note that if `closed` is True, the polygon will have a hole in it, meaning
    that `polygon()` would need to specify its `paths` argument. Assuming 3 elements
    in the original `points` list, we'd have to call:
    path_points = path_2d(points, closed=True)
    poly = polygon(path_points, paths=[[0,1,2],[3,4,5]])

    Or, you know, just call `path_2d_polygon()` and let it do that for you
Return a set of points describing a path of width `width` around `points`,
    suitable for use as a polygon().
Return a set of points describing a path of width width around points suitable for use as a polygon () .
def path_2d(points:Sequence[Point23], width:float=1, closed:bool=False) -> List[Point2]:
    '''
    Return a set of points describing a path of width `width` around `points`,
    suitable for use as a polygon().  

    Note that if `closed` is True, the polygon will have a hole in it, meaning
    that `polygon()` would need to specify its `paths` argument. Assuming 3 elements
    in the original `points` list, we'd have to call:
    path_points = path_2d(points, closed=True)
    poly = polygon(path_points, paths=[[0,1,2],[3,4,5]])

    Or, you know, just call `path_2d_polygon()` and let it do that for you
    '''
    p_a = offset_points(points, offset=width/2, internal=True, closed=closed)
    p_b = list(reversed(offset_points(points, offset=width/2, internal=False, closed=closed)))
    return p_a + p_b
def path_2d ( points : Sequence [ Point23 ] , width : float = 1 , closed : bool = False ) -> List [ Point2 ] : p_a = offset_points ( points , offset = width / 2 , internal = True , closed = closed ) p_b = list ( reversed ( offset_points ( points , offset = width / 2 , internal = False , closed = closed ) ) ) return p_a + p_b