manim 0.17.0__py3-none-any.whl → 0.19.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. manim/__init__.py +11 -6
  2. manim/__main__.py +62 -19
  3. manim/_config/__init__.py +10 -9
  4. manim/_config/cli_colors.py +26 -9
  5. manim/_config/default.cfg +1 -3
  6. manim/_config/logger_utils.py +23 -13
  7. manim/_config/utils.py +662 -468
  8. manim/animation/animation.py +164 -18
  9. manim/animation/changing.py +34 -23
  10. manim/animation/composition.py +265 -67
  11. manim/animation/creation.py +208 -26
  12. manim/animation/fading.py +16 -18
  13. manim/animation/growing.py +35 -15
  14. manim/animation/indication.py +150 -76
  15. manim/animation/movement.py +56 -22
  16. manim/animation/numbers.py +64 -6
  17. manim/animation/rotation.py +78 -7
  18. manim/animation/specialized.py +6 -7
  19. manim/animation/speedmodifier.py +13 -10
  20. manim/animation/transform.py +14 -11
  21. manim/animation/transform_matching_parts.py +3 -4
  22. manim/animation/updaters/mobject_update_utils.py +152 -30
  23. manim/animation/updaters/update.py +10 -7
  24. manim/camera/camera.py +182 -118
  25. manim/camera/mapping_camera.py +34 -3
  26. manim/camera/moving_camera.py +95 -74
  27. manim/camera/multi_camera.py +23 -15
  28. manim/camera/three_d_camera.py +70 -52
  29. manim/cli/__init__.py +17 -0
  30. manim/cli/cfg/group.py +76 -44
  31. manim/cli/checkhealth/checks.py +192 -0
  32. manim/cli/checkhealth/commands.py +90 -0
  33. manim/cli/default_group.py +158 -25
  34. manim/cli/init/commands.py +33 -25
  35. manim/cli/plugins/commands.py +16 -3
  36. manim/cli/render/commands.py +72 -60
  37. manim/cli/render/ease_of_access_options.py +4 -3
  38. manim/cli/render/global_options.py +59 -17
  39. manim/cli/render/output_options.py +6 -5
  40. manim/cli/render/render_options.py +98 -33
  41. manim/constants.py +109 -59
  42. manim/data_structures.py +31 -0
  43. manim/mobject/frame.py +8 -5
  44. manim/mobject/geometry/__init__.py +1 -0
  45. manim/mobject/geometry/arc.py +277 -135
  46. manim/mobject/geometry/boolean_ops.py +32 -31
  47. manim/mobject/geometry/labeled.py +376 -0
  48. manim/mobject/geometry/line.py +192 -87
  49. manim/mobject/geometry/polygram.py +224 -58
  50. manim/mobject/geometry/shape_matchers.py +61 -25
  51. manim/mobject/geometry/tips.py +122 -48
  52. manim/mobject/graph.py +1027 -419
  53. manim/mobject/graphing/coordinate_systems.py +533 -278
  54. manim/mobject/graphing/functions.py +53 -32
  55. manim/mobject/graphing/number_line.py +123 -65
  56. manim/mobject/graphing/probability.py +88 -62
  57. manim/mobject/graphing/scale.py +33 -19
  58. manim/mobject/logo.py +118 -28
  59. manim/mobject/matrix.py +87 -83
  60. manim/mobject/mobject.py +912 -442
  61. manim/mobject/opengl/dot_cloud.py +16 -5
  62. manim/mobject/opengl/opengl_compatibility.py +4 -2
  63. manim/mobject/opengl/opengl_geometry.py +254 -153
  64. manim/mobject/opengl/opengl_image_mobject.py +3 -1
  65. manim/mobject/opengl/opengl_mobject.py +779 -482
  66. manim/mobject/opengl/opengl_point_cloud_mobject.py +41 -14
  67. manim/mobject/opengl/opengl_surface.py +14 -92
  68. manim/mobject/opengl/opengl_three_dimensions.py +12 -8
  69. manim/mobject/opengl/opengl_vectorized_mobject.py +98 -100
  70. manim/mobject/svg/brace.py +173 -41
  71. manim/mobject/svg/svg_mobject.py +139 -53
  72. manim/mobject/table.py +61 -68
  73. manim/mobject/text/code_mobject.py +193 -539
  74. manim/mobject/text/numbers.py +81 -34
  75. manim/mobject/text/tex_mobject.py +130 -78
  76. manim/mobject/text/text_mobject.py +288 -164
  77. manim/mobject/three_d/polyhedra.py +111 -13
  78. manim/mobject/three_d/three_d_utils.py +17 -8
  79. manim/mobject/three_d/three_dimensions.py +239 -106
  80. manim/mobject/types/image_mobject.py +50 -30
  81. manim/mobject/types/point_cloud_mobject.py +120 -75
  82. manim/mobject/types/vectorized_mobject.py +841 -408
  83. manim/mobject/value_tracker.py +105 -38
  84. manim/mobject/vector_field.py +50 -31
  85. manim/opengl/__init__.py +3 -3
  86. manim/plugins/__init__.py +14 -1
  87. manim/plugins/plugins_flags.py +10 -14
  88. manim/renderer/cairo_renderer.py +65 -50
  89. manim/renderer/opengl_renderer.py +89 -69
  90. manim/renderer/opengl_renderer_window.py +39 -18
  91. manim/renderer/shader.py +123 -87
  92. manim/renderer/shader_wrapper.py +44 -28
  93. manim/renderer/vectorized_mobject_rendering.py +38 -10
  94. manim/scene/moving_camera_scene.py +32 -3
  95. manim/scene/scene.py +507 -242
  96. manim/scene/scene_file_writer.py +371 -220
  97. manim/scene/section.py +20 -16
  98. manim/scene/three_d_scene.py +14 -22
  99. manim/scene/vector_space_scene.py +223 -129
  100. manim/scene/zoomed_scene.py +46 -41
  101. manim/typing.py +990 -0
  102. manim/utils/bezier.py +1823 -371
  103. manim/utils/caching.py +12 -5
  104. manim/utils/color/AS2700.py +236 -0
  105. manim/utils/color/BS381.py +318 -0
  106. manim/utils/color/DVIPSNAMES.py +96 -0
  107. manim/utils/color/SVGNAMES.py +179 -0
  108. manim/utils/color/X11.py +533 -0
  109. manim/utils/color/XKCD.py +952 -0
  110. manim/utils/color/__init__.py +61 -0
  111. manim/utils/color/core.py +1667 -0
  112. manim/utils/color/manim_colors.py +218 -0
  113. manim/utils/commands.py +48 -20
  114. manim/utils/config_ops.py +39 -19
  115. manim/utils/debug.py +8 -7
  116. manim/utils/deprecation.py +86 -39
  117. manim/utils/docbuild/__init__.py +17 -0
  118. manim/utils/docbuild/autoaliasattr_directive.py +236 -0
  119. manim/utils/docbuild/autocolor_directive.py +99 -0
  120. manim/utils/docbuild/manim_directive.py +94 -41
  121. manim/utils/docbuild/module_parsing.py +245 -0
  122. manim/utils/exceptions.py +6 -0
  123. manim/utils/family.py +5 -3
  124. manim/utils/family_ops.py +17 -4
  125. manim/utils/file_ops.py +27 -17
  126. manim/utils/hashing.py +55 -45
  127. manim/utils/images.py +13 -7
  128. manim/utils/ipython_magic.py +13 -7
  129. manim/utils/iterables.py +163 -120
  130. manim/utils/module_ops.py +66 -24
  131. manim/utils/opengl.py +77 -24
  132. manim/utils/parameter_parsing.py +32 -0
  133. manim/utils/paths.py +30 -33
  134. manim/utils/polylabel.py +235 -0
  135. manim/utils/qhull.py +218 -0
  136. manim/utils/rate_functions.py +98 -32
  137. manim/utils/simple_functions.py +25 -33
  138. manim/utils/sounds.py +7 -1
  139. manim/utils/space_ops.py +188 -115
  140. manim/utils/testing/__init__.py +17 -0
  141. manim/utils/testing/_frames_testers.py +13 -8
  142. manim/utils/testing/_show_diff.py +5 -3
  143. manim/utils/testing/_test_class_makers.py +34 -18
  144. manim/utils/testing/frames_comparison.py +37 -19
  145. manim/utils/tex.py +130 -198
  146. manim/utils/tex_file_writing.py +77 -47
  147. manim/utils/tex_templates.py +2 -1
  148. manim/utils/unit.py +6 -5
  149. {manim-0.17.0.dist-info → manim-0.19.1.dist-info}/METADATA +64 -65
  150. manim-0.19.1.dist-info/RECORD +220 -0
  151. {manim-0.17.0.dist-info → manim-0.19.1.dist-info}/WHEEL +1 -1
  152. manim-0.19.1.dist-info/entry_points.txt +3 -0
  153. {manim-0.17.0.dist-info → manim-0.19.1.dist-info/licenses}/LICENSE.community +1 -1
  154. manim/cli/new/group.py +0 -189
  155. manim/communitycolors.py +0 -9
  156. manim/gui/__init__.py +0 -0
  157. manim/gui/gui.py +0 -82
  158. manim/plugins/import_plugins.py +0 -43
  159. manim/utils/color.py +0 -552
  160. manim-0.17.0.dist-info/RECORD +0 -206
  161. manim-0.17.0.dist-info/entry_points.txt +0 -4
  162. /manim/cli/{new → checkhealth}/__init__.py +0 -0
  163. {manim-0.17.0.dist-info → manim-0.19.1.dist-info/licenses}/LICENSE +0 -0
@@ -8,8 +8,13 @@ __all__ = [
8
8
  "ArrowCircleTip",
9
9
  "ArrowSquareTip",
10
10
  "ArrowSquareFilledTip",
11
+ "ArrowTriangleTip",
12
+ "ArrowTriangleFilledTip",
13
+ "StealthTip",
11
14
  ]
12
15
 
16
+ from typing import TYPE_CHECKING, Any
17
+
13
18
  import numpy as np
14
19
 
15
20
  from manim.constants import *
@@ -19,6 +24,9 @@ from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL
19
24
  from manim.mobject.types.vectorized_mobject import VMobject
20
25
  from manim.utils.space_ops import angle_of_vector
21
26
 
27
+ if TYPE_CHECKING:
28
+ from manim.typing import Point3D, Vector3D
29
+
22
30
 
23
31
  class ArrowTip(VMobject, metaclass=ConvertToOpenGL):
24
32
  r"""Base class for arrow tips.
@@ -30,6 +38,7 @@ class ArrowTip(VMobject, metaclass=ConvertToOpenGL):
30
38
  :class:`ArrowCircleFilledTip`
31
39
  :class:`ArrowSquareTip`
32
40
  :class:`ArrowSquareFilledTip`
41
+ :class:`StealthTip`
33
42
 
34
43
  Examples
35
44
  --------
@@ -51,8 +60,9 @@ class ArrowTip(VMobject, metaclass=ConvertToOpenGL):
51
60
  ... RegularPolygon.__init__(self, n=5, **kwargs)
52
61
  ... self.width = length
53
62
  ... self.stretch_to_fit_height(length)
54
- >>> arr = Arrow(np.array([-2, -2, 0]), np.array([2, 2, 0]),
55
- ... tip_shape=MyCustomArrowTip)
63
+ >>> arr = Arrow(
64
+ ... np.array([-2, -2, 0]), np.array([2, 2, 0]), tip_shape=MyCustomArrowTip
65
+ ... )
56
66
  >>> isinstance(arr.tip, RegularPolygon)
57
67
  True
58
68
  >>> from manim import Scene, Create
@@ -72,30 +82,41 @@ class ArrowTip(VMobject, metaclass=ConvertToOpenGL):
72
82
  .. manim:: ArrowTipsShowcase
73
83
  :save_last_frame:
74
84
 
75
- from manim.mobject.geometry.tips import ArrowTriangleTip,\
76
- ArrowSquareTip, ArrowSquareFilledTip,\
77
- ArrowCircleTip, ArrowCircleFilledTip
78
85
  class ArrowTipsShowcase(Scene):
79
86
  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
-
87
+ tip_names = [
88
+ 'Default (YELLOW)', 'ArrowTriangleTip', 'Default', 'ArrowSquareTip',
89
+ 'ArrowSquareFilledTip', 'ArrowCircleTip', 'ArrowCircleFilledTip', 'StealthTip'
90
+ ]
91
+
92
+ big_arrows = [
93
+ Arrow(start=[-4, 3.5, 0], end=[2, 3.5, 0], color=YELLOW),
94
+ Arrow(start=[-4, 2.5, 0], end=[2, 2.5, 0], tip_shape=ArrowTriangleTip),
95
+ Arrow(start=[-4, 1.5, 0], end=[2, 1.5, 0]),
96
+ Arrow(start=[-4, 0.5, 0], end=[2, 0.5, 0], tip_shape=ArrowSquareTip),
97
+
98
+ Arrow([-4, -0.5, 0], [2, -0.5, 0], tip_shape=ArrowSquareFilledTip),
99
+ Arrow([-4, -1.5, 0], [2, -1.5, 0], tip_shape=ArrowCircleTip),
100
+ Arrow([-4, -2.5, 0], [2, -2.5, 0], tip_shape=ArrowCircleFilledTip),
101
+ Arrow([-4, -3.5, 0], [2, -3.5, 0], tip_shape=StealthTip)
102
+ ]
103
+
104
+ small_arrows = (
105
+ arrow.copy().scale(0.5, scale_tips=True).next_to(arrow, RIGHT) for arrow in big_arrows
106
+ )
107
+
108
+ labels = (
109
+ Text(tip_names[i], font='monospace', font_size=20, color=BLUE).next_to(big_arrows[i], LEFT) for i in range(len(big_arrows))
110
+ )
111
+
112
+ self.add(*big_arrows, *small_arrows, *labels)
92
113
  """
93
114
 
94
- def __init__(self, *args, **kwargs):
115
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
95
116
  raise NotImplementedError("Has to be implemented in inheriting subclasses.")
96
117
 
97
118
  @property
98
- def base(self):
119
+ def base(self) -> Point3D:
99
120
  r"""The base point of the arrow tip.
100
121
 
101
122
  This is the point connecting to the arrow line.
@@ -113,7 +134,7 @@ class ArrowTip(VMobject, metaclass=ConvertToOpenGL):
113
134
  return self.point_from_proportion(0.5)
114
135
 
115
136
  @property
116
- def tip_point(self):
137
+ def tip_point(self) -> Point3D:
117
138
  r"""The tip point of the arrow tip.
118
139
 
119
140
  Examples
@@ -126,10 +147,14 @@ class ArrowTip(VMobject, metaclass=ConvertToOpenGL):
126
147
  array([2., 0., 0.])
127
148
 
128
149
  """
129
- return self.points[0]
150
+ # Type inference of extracting an element from a list, is not
151
+ # supported by numpy, see this numpy issue
152
+ # https://github.com/numpy/numpy/issues/16544
153
+ tip_point: Point3D = self.points[0]
154
+ return tip_point
130
155
 
131
156
  @property
132
- def vector(self):
157
+ def vector(self) -> Vector3D:
133
158
  r"""The vector pointing from the base point to the tip point.
134
159
 
135
160
  Examples
@@ -145,7 +170,7 @@ class ArrowTip(VMobject, metaclass=ConvertToOpenGL):
145
170
  return self.tip_point - self.base
146
171
 
147
172
  @property
148
- def tip_angle(self):
173
+ def tip_angle(self) -> float:
149
174
  r"""The angle of the arrow tip.
150
175
 
151
176
  Examples
@@ -154,14 +179,14 @@ class ArrowTip(VMobject, metaclass=ConvertToOpenGL):
154
179
 
155
180
  >>> from manim import Arrow
156
181
  >>> 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)
182
+ >>> bool(round(arrow.tip.tip_angle, 5) == round(PI/4, 5))
158
183
  True
159
184
 
160
185
  """
161
186
  return angle_of_vector(self.vector)
162
187
 
163
188
  @property
164
- def length(self):
189
+ def length(self) -> float:
165
190
  r"""The length of the arrow tip.
166
191
 
167
192
  Examples
@@ -174,7 +199,50 @@ class ArrowTip(VMobject, metaclass=ConvertToOpenGL):
174
199
  0.35
175
200
 
176
201
  """
177
- return np.linalg.norm(self.vector)
202
+ return float(np.linalg.norm(self.vector))
203
+
204
+
205
+ class StealthTip(ArrowTip):
206
+ r"""'Stealth' fighter / kite arrow shape.
207
+
208
+ Naming is inspired by the corresponding
209
+ `TikZ arrow shape <https://tikz.dev/tikz-arrows#sec-16.3>`__.
210
+ """
211
+
212
+ def __init__(
213
+ self,
214
+ fill_opacity: float = 1,
215
+ stroke_width: float = 3,
216
+ length: float = DEFAULT_ARROW_TIP_LENGTH / 2,
217
+ start_angle: float = PI,
218
+ **kwargs: Any,
219
+ ):
220
+ self.start_angle = start_angle
221
+ VMobject.__init__(
222
+ self, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs
223
+ )
224
+ self.set_points_as_corners(
225
+ np.array(
226
+ [
227
+ [2, 0, 0], # tip
228
+ [-1.2, 1.6, 0],
229
+ [0, 0, 0], # base
230
+ [-1.2, -1.6, 0],
231
+ [2, 0, 0], # close path, back to tip
232
+ ]
233
+ )
234
+ )
235
+ self.scale(length / self.length)
236
+
237
+ @property
238
+ def length(self) -> float:
239
+ """The length of the arrow tip.
240
+
241
+ In this case, the length is computed as the height of
242
+ the triangle encompassing the stealth tip (otherwise,
243
+ the tip is scaled too large).
244
+ """
245
+ return float(np.linalg.norm(self.vector) * 1.6)
178
246
 
179
247
 
180
248
  class ArrowTriangleTip(ArrowTip, Triangle):
@@ -182,13 +250,13 @@ class ArrowTriangleTip(ArrowTip, Triangle):
182
250
 
183
251
  def __init__(
184
252
  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
- ):
253
+ fill_opacity: float = 0,
254
+ stroke_width: float = 3,
255
+ length: float = DEFAULT_ARROW_TIP_LENGTH,
256
+ width: float = DEFAULT_ARROW_TIP_LENGTH,
257
+ start_angle: float = PI,
258
+ **kwargs: Any,
259
+ ) -> None:
192
260
  Triangle.__init__(
193
261
  self,
194
262
  fill_opacity=fill_opacity,
@@ -208,7 +276,9 @@ class ArrowTriangleFilledTip(ArrowTriangleTip):
208
276
  This is the default arrow tip shape.
209
277
  """
210
278
 
211
- def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):
279
+ def __init__(
280
+ self, fill_opacity: float = 1, stroke_width: float = 0, **kwargs: Any
281
+ ) -> None:
212
282
  super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)
213
283
 
214
284
 
@@ -217,12 +287,12 @@ class ArrowCircleTip(ArrowTip, Circle):
217
287
 
218
288
  def __init__(
219
289
  self,
220
- fill_opacity=0,
221
- stroke_width=3,
222
- length=DEFAULT_ARROW_TIP_LENGTH,
223
- start_angle=PI,
224
- **kwargs,
225
- ):
290
+ fill_opacity: float = 0,
291
+ stroke_width: float = 3,
292
+ length: float = DEFAULT_ARROW_TIP_LENGTH,
293
+ start_angle: float = PI,
294
+ **kwargs: Any,
295
+ ) -> None:
226
296
  self.start_angle = start_angle
227
297
  Circle.__init__(
228
298
  self, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs
@@ -234,7 +304,9 @@ class ArrowCircleTip(ArrowTip, Circle):
234
304
  class ArrowCircleFilledTip(ArrowCircleTip):
235
305
  r"""Circular arrow tip with filled tip."""
236
306
 
237
- def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):
307
+ def __init__(
308
+ self, fill_opacity: float = 1, stroke_width: float = 0, **kwargs: Any
309
+ ) -> None:
238
310
  super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)
239
311
 
240
312
 
@@ -243,12 +315,12 @@ class ArrowSquareTip(ArrowTip, Square):
243
315
 
244
316
  def __init__(
245
317
  self,
246
- fill_opacity=0,
247
- stroke_width=3,
248
- length=DEFAULT_ARROW_TIP_LENGTH,
249
- start_angle=PI,
250
- **kwargs,
251
- ):
318
+ fill_opacity: float = 0,
319
+ stroke_width: float = 3,
320
+ length: float = DEFAULT_ARROW_TIP_LENGTH,
321
+ start_angle: float = PI,
322
+ **kwargs: Any,
323
+ ) -> None:
252
324
  self.start_angle = start_angle
253
325
  Square.__init__(
254
326
  self,
@@ -264,5 +336,7 @@ class ArrowSquareTip(ArrowTip, Square):
264
336
  class ArrowSquareFilledTip(ArrowSquareTip):
265
337
  r"""Square arrow tip with filled tip."""
266
338
 
267
- def __init__(self, fill_opacity=1, stroke_width=0, **kwargs):
339
+ def __init__(
340
+ self, fill_opacity: float = 1, stroke_width: float = 0, **kwargs: Any
341
+ ) -> None:
268
342
  super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs)