Repository: ManimCommunity/manim
File: manim/mobject/svg/brace.py (Python)

Code before:
                    self.play(Create(NumberPlane()))
                    self.play(Create(brace))
                    self.wait(2)
    """

    def __init__(
        self,
        point_1: Optional[Sequence[float]],
        point_2: Optional[Sequence[float]],
        direction: Optional[Sequence[float]] = ORIGIN,
        **kwargs
    ):
        if all(direction == ORIGIN):
            line_vector = np.array(point_2) - np.array(point_1)
            direction = np.array([line_vector[1], -line_vector[0], 0])
        Brace.__init__(self, Line(point_1, point_2), direction=direction, **kwargs)


class ArcBrace(Brace):
    """Creates a Brace that wraps around an Arc.

    The direction parameter allows the brace to be applied
    from outside or inside the Arc.

    .. warning::
        The ArcBraces are smaller for Arcs with smaller radii.

    .. note::
        The ArcBrace is initially a vertical Brace that takes the dimensions of a line
        with the length of the Arc but scaled down to match the start and end angles,
        then it is applied an exponential function after it is shifted
        according to the radii of the arc.
        The scale is not applied for arcs with radii smaller than 1 as it will
        experience overscaling which is unideal.

    Parameters
    ----------
    arc :
        The Arc to which the Brace wraps around.
    direction :
        The direction from which the brace faces the Arc.
        LEFT for inside the Arc, and RIGHT for the outside.

    Example
    -------
        .. manim:: ArcBraceExample
            :save_last_frame:
            :ref_classes: Arc

            class ArcBraceExample(Scene):
                def construct(self):

Review comment (suggestion):
```suggestion
        The :class:`ArcBrace` is smaller for Arcs with smaller radii.
```

Code after:
                    self.play(Create(NumberPlane()))
                    self.play(Create(brace))
                    self.wait(2)
    """

    def __init__(
        self,
        point_1: Optional[Sequence[float]],
        point_2: Optional[Sequence[float]],
        direction: Optional[Sequence[float]] = ORIGIN,
        **kwargs
    ):
        if all(direction == ORIGIN):
            line_vector = np.array(point_2) - np.array(point_1)
            direction = np.array([line_vector[1], -line_vector[0], 0])
        Brace.__init__(self, Line(point_1, point_2), direction=direction, **kwargs)


class ArcBrace(Brace):
    """Creates a :class:`~Brace` that wraps around an :class:`~.Arc`.

    The direction parameter allows the brace to be applied
    from outside or inside the arc.

    .. warning::
        The :class:`ArcBrace` is smaller for arcs with smaller radii.

    .. note::
        The :class:`ArcBrace` is initially a vertical :class:`Brace` defined by the length of the :class:`~.Arc`, but is scaled down to match the start and end angles. An exponential function is then applied after it is shifted based on the radius of the arc.

        The scaling effect is not applied for arcs with radii smaller than 1 to prevent over-scaling.

    Parameters
    ----------
    arc
        The :class:`~.Arc` that wraps around the :class:`Brace` mobject.
    direction
        The direction from which the brace faces the arc.
        ``LEFT`` for inside the arc, and ``RIGHT`` for the outside.

    Example
    -------
        .. manim:: ArcBraceExample
            :save_last_frame:
            :ref_classes: Arc

            class ArcBraceExample(Scene):
                def construct(self):
                    arc_1 = Arc(radius=1.5,start_angle=0,angle=2*PI/3).set_color(RED)
                    brace_1 = ArcBrace(arc_1,LEFT)
                    group_1 = VGroup(arc_1,brace_1)