We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Not all arrow tips are accessible
## Description of bug / unexpected behavior
<!-- Add a clear and concise description of the problem you encountered. -->
The [manim.mobject.geometry.tips](https://docs.manim.community/en/stable/_modules/manim/mobject/geometry/tips.html#ArrowTriangleFilledTip) file has presents of some arrow tips to use. The list `__all__` contains:
```py
__all__ = [
    "ArrowTip",
    "ArrowCircleFilledTip",
    "ArrowCircleTip",
    "ArrowSquareTip",
    "ArrowSquareFilledTip",
]
```

## Expected behavior
<!-- Add a clear and concise description of what you expected to happen. -->
Instead, it should have:

```py
__all__ = [
    "ArrowTip",
    "ArrowCircleFilledTip",
    "ArrowCircleTip",
    "ArrowSquareTip",
    "ArrowSquareFilledTip"
    "ArrowTriangleTip",       # added
    "ArrowTriangleFilledTip", # added
]
```

## How to reproduce the issue
<!-- Provide a piece of code illustrating the undesired behavior. -->

<details><summary>Code for reproducing the problem</summary>

```py
class Test(Scene):
    def construct(self):
      my_line = Line()
      my_line.add_tip(ArrowTriangleFilledTip(fill_color=WHITE))
      self.add(my_line)
```

</details>


## Additional media files
<!-- Paste in the files manim produced on rendering the code above. -->
None



<!-- Insert screenshots here (only when absolutely necessary, we prefer copy/pasted output!) -->

</details>


## System specifications

<details><summary>System Details</summary>

- OS: macOS 13.0.1 (Ventura)
- RAM: 8GB
- Python version: Python 3.10.9
- Installed modules: manim 0.17.2



--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `manim/mobject/geometry/tips.py`
Content:
```
1 r"""A collection of tip mobjects for use with :class:`~.TipableVMobject`."""
2 
3 from __future__ import annotations
4 
5 __all__ = [
6     "ArrowTip",
7     "ArrowCircleFilledTip",
8     "ArrowCircleTip",
9     "ArrowSquareTip",
10     "ArrowSquareFilledTip",
11 ]
12 
13 import numpy as np
14 
15 from manim.constants import *
16 from manim.mobject.geometry.arc import Circle
17 from manim.mobject.geometry.polygram import Square, Triangle
18 from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL
19 from manim.mobject.types.vectorized_mobject import VMobject
20 from manim.utils.space_ops import angle_of_vector
21 
22 
23 class ArrowTip(VMobject, metaclass=ConvertToOpenGL):
24     r"""Base class for arrow tips.
25 
26     .. seealso::
27         :class:`ArrowTriangleTip`
28         :class:`ArrowTriangleFilledTip`
29         :class:`ArrowCircleTip`
30         :class:`ArrowCircleFilledTip`
31         :class:`ArrowSquareTip`
32         :class:`ArrowSquareFilledTip`
33 
34     Examples
35     --------
36     Cannot be used directly, only intended for inheritance::
37 
38         >>> tip = ArrowTip()
39         Traceback (most recent call last):
40         ...
41         NotImplementedError: Has to be implemented in inheriting subclasses.
42 
43     Instead, use one of the pre-defined ones, or make
44     a custom one like this:
45 
46     .. manim:: CustomTipExample
47 
48         >>> from manim import RegularPolygon, Arrow
49         >>> class MyCustomArrowTip(ArrowTip, RegularPolygon):
50         ...     def __init__(self, length=0.35, **kwargs):
51         ...         RegularPolygon.__init__(self, n=5, **kwargs)
52         ...         self.width = length
53         ...         self.stretch_to_fit_height(length)
54         >>> arr = Arrow(np.array([-2, -2, 0]), np.array([2, 2, 0]),
55         ...             tip_shape=MyCustomArrowTip)
56         >>> isinstance(arr.tip, RegularPolygon)
57         True
58         >>> from manim import Scene, Create
59         >>> class CustomTipExample(Scene):
60         ...     def construct(self):
61         ...         self.play(Create(arr))
62 
63     Using a class inherited from :class:`ArrowTip` to get a non-filled
64     tip is a shorthand to manually specifying the arrow tip style as follows::
65 
66         >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 1, 0]),
67         ...               tip_style={'fill_opacity': 0, 'stroke_width': 3})
68 
69     The following example illustrates the usage of all of the predefined
70     arrow tips.
71 
72     .. manim:: ArrowTipsShowcase
73         :save_last_frame:
74 
75         from manim.mobject.geometry.tips import ArrowTriangleTip,\
76                                                 ArrowSquareTip, ArrowSquareFilledTip,\
77                                                 ArrowCircleTip, ArrowCircleFilledTip
78         class ArrowTipsShowcase(Scene):
79             def construct(self):
80                 a00 = Arrow(start=[-2, 3, 0], end=[2, 3, 0], color=YELLOW)
81                 a11 = Arrow(start=[-2, 2, 0], end=[2, 2, 0], tip_shape=ArrowTriangleTip)
82                 a12 = Arrow(start=[-2, 1, 0], end=[2, 1, 0])
83                 a21 = Arrow(start=[-2, 0, 0], end=[2, 0, 0], tip_shape=ArrowSquareTip)
84                 a22 = Arrow([-2, -1, 0], [2, -1, 0], tip_shape=ArrowSquareFilledTip)
85                 a31 = Arrow([-2, -2, 0], [2, -2, 0], tip_shape=ArrowCircleTip)
86                 a32 = Arrow([-2, -3, 0], [2, -3, 0], tip_shape=ArrowCircleFilledTip)
87                 b11 = a11.copy().scale(0.5, scale_tips=True).next_to(a11, RIGHT)
88                 b12 = a12.copy().scale(0.5, scale_tips=True).next_to(a12, RIGHT)
89                 b21 = a21.copy().scale(0.5, scale_tips=True).next_to(a21, RIGHT)
90                 self.add(a00, a11, a12, a21, a22, a31, a32, b11, b12, b21)
91 
92     """
93 
94     def __init__(self, *args, **kwargs):
95         raise NotImplementedError("Has to be implemented in inheriting subclasses.")
96 
97     @property
98     def base(self):
99         r"""The base point of the arrow tip.
100 
101         This is the point connecting to the arrow line.
102 
103         Examples
104         --------
105         ::
106 
107             >>> from manim import Arrow
108             >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 0, 0]), buff=0)
109             >>> arrow.tip.base.round(2) + 0.  # add 0. to avoid negative 0 in output
110             array([1.65, 0.  , 0.  ])
111 
112         """
113         return self.point_from_proportion(0.5)
114 
115     @property
116     def tip_point(self):
117         r"""The tip point of the arrow tip.
118 
119         Examples
120         --------
121         ::
122 
123             >>> from manim import Arrow
124             >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 0, 0]), buff=0)
125             >>> arrow.tip.tip_point.round(2) + 0.
126             array([2., 0., 0.])
127 
128         """
129         return self.points[0]
130 
131     @property
132     def vector(self):
133         r"""The vector pointing from the base point to the tip point.
134 
135         Examples
136         --------
137         ::
138 
139             >>> from manim import Arrow
140             >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 2, 0]), buff=0)
141             >>> arrow.tip.vector.round(2) + 0.
142             array([0.25, 0.25, 0.  ])
143 
144         """
145         return self.tip_point - self.base
146 
147     @property
148     def tip_angle(self):
149         r"""The angle of the arrow tip.
150 
151         Examples
152         --------
153         ::
154 
155             >>> from manim import Arrow
156             >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 1, 0]), buff=0)
157             >>> round(arrow.tip.tip_angle, 5) == round(PI/4, 5)
158             True
159 
160         """
161         return angle_of_vector(self.vector)
162 
163     @property
164     def length(self):
165         r"""The length of the arrow tip.
166 
167         Examples
168         --------
169         ::
170 
171             >>> from manim import Arrow
172             >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 2, 0]))
173             >>> round(arrow.tip.length, 3)
174             0.35
175 
176         """
177         return np.linalg.norm(self.vector)
178 
179 
180 class ArrowTriangleTip(ArrowTip, Triangle):
181     r"""Triangular arrow tip."""
182 
183     def __init__(
184         self,
185         fill_opacity=0,
186         stroke_width=3,
187         length=DEFAULT_ARROW_TIP_LENGTH,
188         width=DEFAULT_ARROW_TIP_LENGTH,
189         start_angle=PI,
190         **kwargs,
191     ):
192         Triangle.__init__(
193             self,
194             fill_opacity=fill_opacity,
195             stroke_width=stroke_width,
196             start_angle=start_angle,
197             **kwargs,
198         )
199         self.width = width
200 
201         self.stretch_to_fit_width(length)
202         self.stretch_to_fit_height(width)
203 
204 
205 class ArrowTriangleFilledTip(ArrowTriangleTip):
206     r"""Triangular arrow tip with filled tip.
207 
208     This is the default arrow tip shape.
209     """
210 
211     def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):
212         super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)
213 
214 
215 class ArrowCircleTip(ArrowTip, Circle):
216     r"""Circular arrow tip."""
217 
218     def __init__(
219         self,
220         fill_opacity=0,
221         stroke_width=3,
222         length=DEFAULT_ARROW_TIP_LENGTH,
223         start_angle=PI,
224         **kwargs,
225     ):
226         self.start_angle = start_angle
227         Circle.__init__(
228             self, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs
229         )
230         self.width = length
231         self.stretch_to_fit_height(length)
232 
233 
234 class ArrowCircleFilledTip(ArrowCircleTip):
235     r"""Circular arrow tip with filled tip."""
236 
237     def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):
238         super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)
239 
240 
241 class ArrowSquareTip(ArrowTip, Square):
242     r"""Square arrow tip."""
243 
244     def __init__(
245         self,
246         fill_opacity=0,
247         stroke_width=3,
248         length=DEFAULT_ARROW_TIP_LENGTH,
249         start_angle=PI,
250         **kwargs,
251     ):
252         self.start_angle = start_angle
253         Square.__init__(
254             self,
255             fill_opacity=fill_opacity,
256             stroke_width=stroke_width,
257             side_length=length,
258             **kwargs,
259         )
260         self.width = length
261         self.stretch_to_fit_height(length)
262 
263 
264 class ArrowSquareFilledTip(ArrowSquareTip):
265     r"""Square arrow tip with filled tip."""
266 
267     def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):
268         super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)
269
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/manim/mobject/geometry/tips.py b/manim/mobject/geometry/tips.py
--- a/manim/mobject/geometry/tips.py
+++ b/manim/mobject/geometry/tips.py
@@ -8,6 +8,8 @@
     "ArrowCircleTip",
     "ArrowSquareTip",
     "ArrowSquareFilledTip",
+    "ArrowTriangleTip",
+    "ArrowTriangleFilledTip",
 ]
 
 import numpy as np

{"golden_diff": "diff --git a/manim/mobject/geometry/tips.py b/manim/mobject/geometry/tips.py\n--- a/manim/mobject/geometry/tips.py\n+++ b/manim/mobject/geometry/tips.py\n@@ -8,6 +8,8 @@\n     \"ArrowCircleTip\",\n     \"ArrowSquareTip\",\n     \"ArrowSquareFilledTip\",\n+    \"ArrowTriangleTip\",\n+    \"ArrowTriangleFilledTip\",\n ]\n \n import numpy as np\n", "issue": "Not all arrow tips are accessible\n## Description of bug / unexpected behavior\r\n<!-- Add a clear and concise description of the problem you encountered. -->\r\nThe [manim.mobject.geometry.tips](https://docs.manim.community/en/stable/_modules/manim/mobject/geometry/tips.html#ArrowTriangleFilledTip) file has presents of some arrow tips to use. The list `__all__` contains:\r\n```py\r\n__all__ = [\r\n    \"ArrowTip\",\r\n    \"ArrowCircleFilledTip\",\r\n    \"ArrowCircleTip\",\r\n    \"ArrowSquareTip\",\r\n    \"ArrowSquareFilledTip\",\r\n]\r\n```\r\n\r\n## Expected behavior\r\n<!-- Add a clear and concise description of what you expected to happen. -->\r\nInstead, it should have:\r\n\r\n```py\r\n__all__ = [\r\n    \"ArrowTip\",\r\n    \"ArrowCircleFilledTip\",\r\n    \"ArrowCircleTip\",\r\n    \"ArrowSquareTip\",\r\n    \"ArrowSquareFilledTip\"\r\n    \"ArrowTriangleTip\",       # added\r\n    \"ArrowTriangleFilledTip\", # added\r\n]\r\n```\r\n\r\n## How to reproduce the issue\r\n<!-- Provide a piece of code illustrating the undesired behavior. -->\r\n\r\n<details><summary>Code for reproducing the problem</summary>\r\n\r\n```py\r\nclass Test(Scene):\r\n    def construct(self):\r\n      my_line = Line()\r\n      my_line.add_tip(ArrowTriangleFilledTip(fill_color=WHITE))\r\n      self.add(my_line)\r\n```\r\n\r\n</details>\r\n\r\n\r\n## Additional media files\r\n<!-- Paste in the files manim produced on rendering the code above. -->\r\nNone\r\n\r\n\r\n\r\n<!-- Insert screenshots here (only when absolutely necessary, we prefer copy/pasted output!) -->\r\n\r\n</details>\r\n\r\n\r\n## System specifications\r\n\r\n<details><summary>System Details</summary>\r\n\r\n- OS: macOS 13.0.1 (Ventura)\r\n- RAM: 8GB\r\n- Python version: Python 3.10.9\r\n- Installed modules: manim 0.17.2\r\n\r\n\n", "before_files": [{"content": "r\"\"\"A collection of tip mobjects for use with :class:`~.TipableVMobject`.\"\"\"\n\nfrom __future__ import annotations\n\n__all__ = [\n    \"ArrowTip\",\n    \"ArrowCircleFilledTip\",\n    \"ArrowCircleTip\",\n    \"ArrowSquareTip\",\n    \"ArrowSquareFilledTip\",\n]\n\nimport numpy as np\n\nfrom manim.constants import *\nfrom manim.mobject.geometry.arc import Circle\nfrom manim.mobject.geometry.polygram import Square, Triangle\nfrom manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL\nfrom manim.mobject.types.vectorized_mobject import VMobject\nfrom manim.utils.space_ops import angle_of_vector\n\n\nclass ArrowTip(VMobject, metaclass=ConvertToOpenGL):\n    r\"\"\"Base class for arrow tips.\n\n    .. seealso::\n        :class:`ArrowTriangleTip`\n        :class:`ArrowTriangleFilledTip`\n        :class:`ArrowCircleTip`\n        :class:`ArrowCircleFilledTip`\n        :class:`ArrowSquareTip`\n        :class:`ArrowSquareFilledTip`\n\n    Examples\n    --------\n    Cannot be used directly, only intended for inheritance::\n\n        >>> tip = ArrowTip()\n        Traceback (most recent call last):\n        ...\n        NotImplementedError: Has to be implemented in inheriting subclasses.\n\n    Instead, use one of the pre-defined ones, or make\n    a custom one like this:\n\n    .. manim:: CustomTipExample\n\n        >>> from manim import RegularPolygon, Arrow\n        >>> class MyCustomArrowTip(ArrowTip, RegularPolygon):\n        ...     def __init__(self, length=0.35, **kwargs):\n        ...         RegularPolygon.__init__(self, n=5, **kwargs)\n        ...         self.width = length\n        ...         self.stretch_to_fit_height(length)\n        >>> arr = Arrow(np.array([-2, -2, 0]), np.array([2, 2, 0]),\n        ...             tip_shape=MyCustomArrowTip)\n        >>> isinstance(arr.tip, RegularPolygon)\n        True\n        >>> from manim import Scene, Create\n        >>> class CustomTipExample(Scene):\n        ...     def construct(self):\n        ...         self.play(Create(arr))\n\n    Using a class inherited from :class:`ArrowTip` to get a non-filled\n    tip is a shorthand to manually specifying the arrow tip style as follows::\n\n        >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 1, 0]),\n        ...               tip_style={'fill_opacity': 0, 'stroke_width': 3})\n\n    The following example illustrates the usage of all of the predefined\n    arrow tips.\n\n    .. manim:: ArrowTipsShowcase\n        :save_last_frame:\n\n        from manim.mobject.geometry.tips import ArrowTriangleTip,\\\n                                                ArrowSquareTip, ArrowSquareFilledTip,\\\n                                                ArrowCircleTip, ArrowCircleFilledTip\n        class ArrowTipsShowcase(Scene):\n            def construct(self):\n                a00 = Arrow(start=[-2, 3, 0], end=[2, 3, 0], color=YELLOW)\n                a11 = Arrow(start=[-2, 2, 0], end=[2, 2, 0], tip_shape=ArrowTriangleTip)\n                a12 = Arrow(start=[-2, 1, 0], end=[2, 1, 0])\n                a21 = Arrow(start=[-2, 0, 0], end=[2, 0, 0], tip_shape=ArrowSquareTip)\n                a22 = Arrow([-2, -1, 0], [2, -1, 0], tip_shape=ArrowSquareFilledTip)\n                a31 = Arrow([-2, -2, 0], [2, -2, 0], tip_shape=ArrowCircleTip)\n                a32 = Arrow([-2, -3, 0], [2, -3, 0], tip_shape=ArrowCircleFilledTip)\n                b11 = a11.copy().scale(0.5, scale_tips=True).next_to(a11, RIGHT)\n                b12 = a12.copy().scale(0.5, scale_tips=True).next_to(a12, RIGHT)\n                b21 = a21.copy().scale(0.5, scale_tips=True).next_to(a21, RIGHT)\n                self.add(a00, a11, a12, a21, a22, a31, a32, b11, b12, b21)\n\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        raise NotImplementedError(\"Has to be implemented in inheriting subclasses.\")\n\n    @property\n    def base(self):\n        r\"\"\"The base point of the arrow tip.\n\n        This is the point connecting to the arrow line.\n\n        Examples\n        --------\n        ::\n\n            >>> from manim import Arrow\n            >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 0, 0]), buff=0)\n            >>> arrow.tip.base.round(2) + 0.  # add 0. to avoid negative 0 in output\n            array([1.65, 0.  , 0.  ])\n\n        \"\"\"\n        return self.point_from_proportion(0.5)\n\n    @property\n    def tip_point(self):\n        r\"\"\"The tip point of the arrow tip.\n\n        Examples\n        --------\n        ::\n\n            >>> from manim import Arrow\n            >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 0, 0]), buff=0)\n            >>> arrow.tip.tip_point.round(2) + 0.\n            array([2., 0., 0.])\n\n        \"\"\"\n        return self.points[0]\n\n    @property\n    def vector(self):\n        r\"\"\"The vector pointing from the base point to the tip point.\n\n        Examples\n        --------\n        ::\n\n            >>> from manim import Arrow\n            >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 2, 0]), buff=0)\n            >>> arrow.tip.vector.round(2) + 0.\n            array([0.25, 0.25, 0.  ])\n\n        \"\"\"\n        return self.tip_point - self.base\n\n    @property\n    def tip_angle(self):\n        r\"\"\"The angle of the arrow tip.\n\n        Examples\n        --------\n        ::\n\n            >>> from manim import Arrow\n            >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 1, 0]), buff=0)\n            >>> round(arrow.tip.tip_angle, 5) == round(PI/4, 5)\n            True\n\n        \"\"\"\n        return angle_of_vector(self.vector)\n\n    @property\n    def length(self):\n        r\"\"\"The length of the arrow tip.\n\n        Examples\n        --------\n        ::\n\n            >>> from manim import Arrow\n            >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 2, 0]))\n            >>> round(arrow.tip.length, 3)\n            0.35\n\n        \"\"\"\n        return np.linalg.norm(self.vector)\n\n\nclass ArrowTriangleTip(ArrowTip, Triangle):\n    r\"\"\"Triangular arrow tip.\"\"\"\n\n    def __init__(\n        self,\n        fill_opacity=0,\n        stroke_width=3,\n        length=DEFAULT_ARROW_TIP_LENGTH,\n        width=DEFAULT_ARROW_TIP_LENGTH,\n        start_angle=PI,\n        **kwargs,\n    ):\n        Triangle.__init__(\n            self,\n            fill_opacity=fill_opacity,\n            stroke_width=stroke_width,\n            start_angle=start_angle,\n            **kwargs,\n        )\n        self.width = width\n\n        self.stretch_to_fit_width(length)\n        self.stretch_to_fit_height(width)\n\n\nclass ArrowTriangleFilledTip(ArrowTriangleTip):\n    r\"\"\"Triangular arrow tip with filled tip.\n\n    This is the default arrow tip shape.\n    \"\"\"\n\n    def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):\n        super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)\n\n\nclass ArrowCircleTip(ArrowTip, Circle):\n    r\"\"\"Circular arrow tip.\"\"\"\n\n    def __init__(\n        self,\n        fill_opacity=0,\n        stroke_width=3,\n        length=DEFAULT_ARROW_TIP_LENGTH,\n        start_angle=PI,\n        **kwargs,\n    ):\n        self.start_angle = start_angle\n        Circle.__init__(\n            self, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs\n        )\n        self.width = length\n        self.stretch_to_fit_height(length)\n\n\nclass ArrowCircleFilledTip(ArrowCircleTip):\n    r\"\"\"Circular arrow tip with filled tip.\"\"\"\n\n    def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):\n        super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)\n\n\nclass ArrowSquareTip(ArrowTip, Square):\n    r\"\"\"Square arrow tip.\"\"\"\n\n    def __init__(\n        self,\n        fill_opacity=0,\n        stroke_width=3,\n        length=DEFAULT_ARROW_TIP_LENGTH,\n        start_angle=PI,\n        **kwargs,\n    ):\n        self.start_angle = start_angle\n        Square.__init__(\n            self,\n            fill_opacity=fill_opacity,\n            stroke_width=stroke_width,\n            side_length=length,\n            **kwargs,\n        )\n        self.width = length\n        self.stretch_to_fit_height(length)\n\n\nclass ArrowSquareFilledTip(ArrowSquareTip):\n    r\"\"\"Square arrow tip with filled tip.\"\"\"\n\n    def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):\n        super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)\n", "path": "manim/mobject/geometry/tips.py"}], "after_files": [{"content": "r\"\"\"A collection of tip mobjects for use with :class:`~.TipableVMobject`.\"\"\"\n\nfrom __future__ import annotations\n\n__all__ = [\n    \"ArrowTip\",\n    \"ArrowCircleFilledTip\",\n    \"ArrowCircleTip\",\n    \"ArrowSquareTip\",\n    \"ArrowSquareFilledTip\",\n    \"ArrowTriangleTip\",\n    \"ArrowTriangleFilledTip\",\n]\n\nimport numpy as np\n\nfrom manim.constants import *\nfrom manim.mobject.geometry.arc import Circle\nfrom manim.mobject.geometry.polygram import Square, Triangle\nfrom manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL\nfrom manim.mobject.types.vectorized_mobject import VMobject\nfrom manim.utils.space_ops import angle_of_vector\n\n\nclass ArrowTip(VMobject, metaclass=ConvertToOpenGL):\n    r\"\"\"Base class for arrow tips.\n\n    .. seealso::\n        :class:`ArrowTriangleTip`\n        :class:`ArrowTriangleFilledTip`\n        :class:`ArrowCircleTip`\n        :class:`ArrowCircleFilledTip`\n        :class:`ArrowSquareTip`\n        :class:`ArrowSquareFilledTip`\n\n    Examples\n    --------\n    Cannot be used directly, only intended for inheritance::\n\n        >>> tip = ArrowTip()\n        Traceback (most recent call last):\n        ...\n        NotImplementedError: Has to be implemented in inheriting subclasses.\n\n    Instead, use one of the pre-defined ones, or make\n    a custom one like this:\n\n    .. manim:: CustomTipExample\n\n        >>> from manim import RegularPolygon, Arrow\n        >>> class MyCustomArrowTip(ArrowTip, RegularPolygon):\n        ...     def __init__(self, length=0.35, **kwargs):\n        ...         RegularPolygon.__init__(self, n=5, **kwargs)\n        ...         self.width = length\n        ...         self.stretch_to_fit_height(length)\n        >>> arr = Arrow(np.array([-2, -2, 0]), np.array([2, 2, 0]),\n        ...             tip_shape=MyCustomArrowTip)\n        >>> isinstance(arr.tip, RegularPolygon)\n        True\n        >>> from manim import Scene, Create\n        >>> class CustomTipExample(Scene):\n        ...     def construct(self):\n        ...         self.play(Create(arr))\n\n    Using a class inherited from :class:`ArrowTip` to get a non-filled\n    tip is a shorthand to manually specifying the arrow tip style as follows::\n\n        >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 1, 0]),\n        ...               tip_style={'fill_opacity': 0, 'stroke_width': 3})\n\n    The following example illustrates the usage of all of the predefined\n    arrow tips.\n\n    .. manim:: ArrowTipsShowcase\n        :save_last_frame:\n\n        from manim.mobject.geometry.tips import ArrowTriangleTip,\\\n                                                ArrowSquareTip, ArrowSquareFilledTip,\\\n                                                ArrowCircleTip, ArrowCircleFilledTip\n        class ArrowTipsShowcase(Scene):\n            def construct(self):\n                a00 = Arrow(start=[-2, 3, 0], end=[2, 3, 0], color=YELLOW)\n                a11 = Arrow(start=[-2, 2, 0], end=[2, 2, 0], tip_shape=ArrowTriangleTip)\n                a12 = Arrow(start=[-2, 1, 0], end=[2, 1, 0])\n                a21 = Arrow(start=[-2, 0, 0], end=[2, 0, 0], tip_shape=ArrowSquareTip)\n                a22 = Arrow([-2, -1, 0], [2, -1, 0], tip_shape=ArrowSquareFilledTip)\n                a31 = Arrow([-2, -2, 0], [2, -2, 0], tip_shape=ArrowCircleTip)\n                a32 = Arrow([-2, -3, 0], [2, -3, 0], tip_shape=ArrowCircleFilledTip)\n                b11 = a11.copy().scale(0.5, scale_tips=True).next_to(a11, RIGHT)\n                b12 = a12.copy().scale(0.5, scale_tips=True).next_to(a12, RIGHT)\n                b21 = a21.copy().scale(0.5, scale_tips=True).next_to(a21, RIGHT)\n                self.add(a00, a11, a12, a21, a22, a31, a32, b11, b12, b21)\n\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        raise NotImplementedError(\"Has to be implemented in inheriting subclasses.\")\n\n    @property\n    def base(self):\n        r\"\"\"The base point of the arrow tip.\n\n        This is the point connecting to the arrow line.\n\n        Examples\n        --------\n        ::\n\n            >>> from manim import Arrow\n            >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 0, 0]), buff=0)\n            >>> arrow.tip.base.round(2) + 0.  # add 0. to avoid negative 0 in output\n            array([1.65, 0.  , 0.  ])\n\n        \"\"\"\n        return self.point_from_proportion(0.5)\n\n    @property\n    def tip_point(self):\n        r\"\"\"The tip point of the arrow tip.\n\n        Examples\n        --------\n        ::\n\n            >>> from manim import Arrow\n            >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 0, 0]), buff=0)\n            >>> arrow.tip.tip_point.round(2) + 0.\n            array([2., 0., 0.])\n\n        \"\"\"\n        return self.points[0]\n\n    @property\n    def vector(self):\n        r\"\"\"The vector pointing from the base point to the tip point.\n\n        Examples\n        --------\n        ::\n\n            >>> from manim import Arrow\n            >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 2, 0]), buff=0)\n            >>> arrow.tip.vector.round(2) + 0.\n            array([0.25, 0.25, 0.  ])\n\n        \"\"\"\n        return self.tip_point - self.base\n\n    @property\n    def tip_angle(self):\n        r\"\"\"The angle of the arrow tip.\n\n        Examples\n        --------\n        ::\n\n            >>> from manim import Arrow\n            >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 1, 0]), buff=0)\n            >>> round(arrow.tip.tip_angle, 5) == round(PI/4, 5)\n            True\n\n        \"\"\"\n        return angle_of_vector(self.vector)\n\n    @property\n    def length(self):\n        r\"\"\"The length of the arrow tip.\n\n        Examples\n        --------\n        ::\n\n            >>> from manim import Arrow\n            >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 2, 0]))\n            >>> round(arrow.tip.length, 3)\n            0.35\n\n        \"\"\"\n        return np.linalg.norm(self.vector)\n\n\nclass ArrowTriangleTip(ArrowTip, Triangle):\n    r\"\"\"Triangular arrow tip.\"\"\"\n\n    def __init__(\n        self,\n        fill_opacity=0,\n        stroke_width=3,\n        length=DEFAULT_ARROW_TIP_LENGTH,\n        width=DEFAULT_ARROW_TIP_LENGTH,\n        start_angle=PI,\n        **kwargs,\n    ):\n        Triangle.__init__(\n            self,\n            fill_opacity=fill_opacity,\n            stroke_width=stroke_width,\n            start_angle=start_angle,\n            **kwargs,\n        )\n        self.width = width\n\n        self.stretch_to_fit_width(length)\n        self.stretch_to_fit_height(width)\n\n\nclass ArrowTriangleFilledTip(ArrowTriangleTip):\n    r\"\"\"Triangular arrow tip with filled tip.\n\n    This is the default arrow tip shape.\n    \"\"\"\n\n    def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):\n        super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)\n\n\nclass ArrowCircleTip(ArrowTip, Circle):\n    r\"\"\"Circular arrow tip.\"\"\"\n\n    def __init__(\n        self,\n        fill_opacity=0,\n        stroke_width=3,\n        length=DEFAULT_ARROW_TIP_LENGTH,\n        start_angle=PI,\n        **kwargs,\n    ):\n        self.start_angle = start_angle\n        Circle.__init__(\n            self, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs\n        )\n        self.width = length\n        self.stretch_to_fit_height(length)\n\n\nclass ArrowCircleFilledTip(ArrowCircleTip):\n    r\"\"\"Circular arrow tip with filled tip.\"\"\"\n\n    def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):\n        super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)\n\n\nclass ArrowSquareTip(ArrowTip, Square):\n    r\"\"\"Square arrow tip.\"\"\"\n\n    def __init__(\n        self,\n        fill_opacity=0,\n        stroke_width=3,\n        length=DEFAULT_ARROW_TIP_LENGTH,\n        start_angle=PI,\n        **kwargs,\n    ):\n        self.start_angle = start_angle\n        Square.__init__(\n            self,\n            fill_opacity=fill_opacity,\n            stroke_width=stroke_width,\n            side_length=length,\n            **kwargs,\n        )\n        self.width = length\n        self.stretch_to_fit_height(length)\n\n\nclass ArrowSquareFilledTip(ArrowSquareTip):\n    r\"\"\"Square arrow tip with filled tip.\"\"\"\n\n    def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):\n        super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)\n", "path": "manim/mobject/geometry/tips.py"}]}