manim 0.17.3__py3-none-any.whl → 0.18.0.post0__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.

Potentially problematic release.


This version of manim might be problematic. Click here for more details.

Files changed (84) hide show
  1. manim/__init__.py +1 -0
  2. manim/__main__.py +2 -0
  3. manim/_config/__init__.py +0 -1
  4. manim/_config/logger_utils.py +1 -0
  5. manim/_config/utils.py +14 -5
  6. manim/animation/changing.py +9 -5
  7. manim/animation/creation.py +8 -3
  8. manim/animation/indication.py +4 -4
  9. manim/animation/speedmodifier.py +2 -4
  10. manim/animation/updaters/mobject_update_utils.py +134 -16
  11. manim/camera/camera.py +31 -17
  12. manim/cli/checkhealth/__init__.py +0 -0
  13. manim/cli/checkhealth/checks.py +173 -0
  14. manim/cli/checkhealth/commands.py +81 -0
  15. manim/cli/render/global_options.py +6 -0
  16. manim/constants.py +58 -54
  17. manim/mobject/geometry/__init__.py +1 -0
  18. manim/mobject/geometry/arc.py +126 -91
  19. manim/mobject/geometry/boolean_ops.py +6 -10
  20. manim/mobject/geometry/labeled.py +155 -0
  21. manim/mobject/geometry/line.py +66 -50
  22. manim/mobject/geometry/polygram.py +23 -15
  23. manim/mobject/geometry/shape_matchers.py +24 -15
  24. manim/mobject/geometry/tips.py +62 -40
  25. manim/mobject/graph.py +3 -4
  26. manim/mobject/graphing/coordinate_systems.py +190 -139
  27. manim/mobject/graphing/number_line.py +5 -2
  28. manim/mobject/graphing/probability.py +4 -3
  29. manim/mobject/graphing/scale.py +7 -7
  30. manim/mobject/logo.py +108 -22
  31. manim/mobject/matrix.py +33 -37
  32. manim/mobject/mobject.py +327 -260
  33. manim/mobject/opengl/opengl_image_mobject.py +1 -1
  34. manim/mobject/opengl/opengl_mobject.py +18 -12
  35. manim/mobject/opengl/opengl_point_cloud_mobject.py +1 -1
  36. manim/mobject/opengl/opengl_surface.py +1 -1
  37. manim/mobject/opengl/opengl_vectorized_mobject.py +21 -17
  38. manim/mobject/svg/brace.py +3 -1
  39. manim/mobject/svg/svg_mobject.py +9 -11
  40. manim/mobject/table.py +50 -54
  41. manim/mobject/text/numbers.py +48 -6
  42. manim/mobject/text/tex_mobject.py +8 -12
  43. manim/mobject/text/text_mobject.py +32 -24
  44. manim/mobject/three_d/three_d_utils.py +13 -8
  45. manim/mobject/three_d/three_dimensions.py +61 -43
  46. manim/mobject/types/image_mobject.py +5 -4
  47. manim/mobject/types/point_cloud_mobject.py +8 -6
  48. manim/mobject/types/vectorized_mobject.py +385 -258
  49. manim/mobject/vector_field.py +19 -11
  50. manim/plugins/import_plugins.py +1 -1
  51. manim/plugins/plugins_flags.py +1 -6
  52. manim/renderer/shader.py +2 -2
  53. manim/scene/scene.py +15 -7
  54. manim/scene/scene_file_writer.py +1 -2
  55. manim/scene/three_d_scene.py +1 -1
  56. manim/scene/vector_space_scene.py +17 -7
  57. manim/typing.py +133 -0
  58. manim/utils/bezier.py +267 -83
  59. manim/utils/color/AS2700.py +234 -0
  60. manim/utils/color/BS381.py +315 -0
  61. manim/utils/color/X11.py +530 -0
  62. manim/utils/color/XKCD.py +949 -0
  63. manim/utils/color/__init__.py +58 -0
  64. manim/utils/color/core.py +1036 -0
  65. manim/utils/color/manim_colors.py +220 -0
  66. manim/utils/docbuild/autocolor_directive.py +92 -0
  67. manim/utils/docbuild/manim_directive.py +40 -6
  68. manim/utils/file_ops.py +1 -1
  69. manim/utils/hashing.py +1 -1
  70. manim/utils/iterables.py +1 -1
  71. manim/utils/rate_functions.py +33 -0
  72. manim/utils/simple_functions.py +0 -18
  73. manim/utils/space_ops.py +55 -42
  74. manim/utils/testing/frames_comparison.py +9 -0
  75. manim/utils/tex.py +2 -0
  76. manim/utils/tex_file_writing.py +29 -2
  77. {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/METADATA +14 -14
  78. {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/RECORD +82 -71
  79. {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/WHEEL +1 -1
  80. manim/communitycolors.py +0 -9
  81. manim/utils/color.py +0 -552
  82. {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/LICENSE +0 -0
  83. {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/LICENSE.community +0 -0
  84. {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,173 @@
1
+ """Auxiliary module for the checkhealth subcommand, contains
2
+ the actual check implementations."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import os
7
+ import shutil
8
+ import subprocess
9
+ from typing import Callable
10
+
11
+ from ..._config import config
12
+
13
+ HEALTH_CHECKS = []
14
+
15
+
16
+ def healthcheck(
17
+ description: str,
18
+ recommendation: str,
19
+ skip_on_failed: list[Callable | str] | None = None,
20
+ post_fail_fix_hook: Callable | None = None,
21
+ ):
22
+ """Decorator used for declaring health checks.
23
+
24
+ This decorator attaches some data to a function,
25
+ which is then added to a list containing all checks.
26
+
27
+ Parameters
28
+ ----------
29
+ description
30
+ A brief description of this check, displayed when
31
+ the checkhealth subcommand is run.
32
+ recommendation
33
+ Help text which is displayed in case the check fails.
34
+ skip_on_failed
35
+ A list of check functions which, if they fail, cause
36
+ the current check to be skipped.
37
+ post_fail_fix_hook
38
+ A function that is supposed to (interactively) help
39
+ to fix the detected problem, if possible. This is
40
+ only called upon explicit confirmation of the user.
41
+
42
+ Returns
43
+ -------
44
+ A check function, as required by the checkhealth subcommand.
45
+ """
46
+ if skip_on_failed is None:
47
+ skip_on_failed = []
48
+ skip_on_failed = [
49
+ skip.__name__ if callable(skip) else skip for skip in skip_on_failed
50
+ ]
51
+
52
+ def decorator(func):
53
+ func.description = description
54
+ func.recommendation = recommendation
55
+ func.skip_on_failed = skip_on_failed
56
+ func.post_fail_fix_hook = post_fail_fix_hook
57
+ HEALTH_CHECKS.append(func)
58
+ return func
59
+
60
+ return decorator
61
+
62
+
63
+ @healthcheck(
64
+ description="Checking whether manim is on your PATH",
65
+ recommendation=(
66
+ "The command <manim> is currently not on your system's PATH.\n\n"
67
+ "You can work around this by calling the manim module directly "
68
+ "via <python -m manim> instead of just <manim>.\n\n"
69
+ "To fix the PATH issue properly: "
70
+ "Usually, the Python package installer pip issues a warning "
71
+ "during the installation which contains more information. "
72
+ "Consider reinstalling manim via <pip uninstall manim> "
73
+ "followed by <pip install manim> to see the warning again, "
74
+ "then consult the internet on how to modify your system's "
75
+ "PATH variable."
76
+ ),
77
+ )
78
+ def is_manim_on_path():
79
+ path_to_manim = shutil.which("manim")
80
+ return path_to_manim is not None
81
+
82
+
83
+ @healthcheck(
84
+ description="Checking whether the executable belongs to manim",
85
+ recommendation=(
86
+ "The command <manim> does not belong to your installed version "
87
+ "of this library, it likely belongs to manimgl / manimlib.\n\n"
88
+ "Run manim via <python -m manim> or via <manimce>, or uninstall "
89
+ "and reinstall manim via <pip install --upgrade "
90
+ "--force-reinstall manim> to fix this."
91
+ ),
92
+ skip_on_failed=[is_manim_on_path],
93
+ )
94
+ def is_manim_executable_associated_to_this_library():
95
+ path_to_manim = shutil.which("manim")
96
+ with open(path_to_manim, "rb") as f:
97
+ manim_exec = f.read()
98
+
99
+ # first condition below corresponds to the executable being
100
+ # some sort of python script. second condition happens when
101
+ # the executable is actually a Windows batch file.
102
+ return b"manim.__main__" in manim_exec or b'"%~dp0\\manim"' in manim_exec
103
+
104
+
105
+ @healthcheck(
106
+ description="Checking whether ffmpeg is available",
107
+ recommendation=(
108
+ "Manim does not work without ffmpeg. Please follow our "
109
+ "installation instructions "
110
+ "at https://docs.manim.community/en/stable/installation.html "
111
+ "to download ffmpeg. Then, either ...\n\n"
112
+ "(a) ... make the ffmpeg executable available to your system's PATH,\n"
113
+ "(b) or, alternatively, use <manim cfg write --open> to create a "
114
+ "custom configuration and set the ffmpeg_executable variable to the "
115
+ "full absolute path to the ffmpeg executable."
116
+ ),
117
+ )
118
+ def is_ffmpeg_available():
119
+ path_to_ffmpeg = shutil.which(config.ffmpeg_executable)
120
+ return path_to_ffmpeg is not None and os.access(path_to_ffmpeg, os.X_OK)
121
+
122
+
123
+ @healthcheck(
124
+ description="Checking whether ffmpeg is working",
125
+ recommendation=(
126
+ "Your installed version of ffmpeg does not support x264 encoding, "
127
+ "which manim requires. Please follow our installation instructions "
128
+ "at https://docs.manim.community/en/stable/installation.html "
129
+ "to download and install a newer version of ffmpeg."
130
+ ),
131
+ skip_on_failed=[is_ffmpeg_available],
132
+ )
133
+ def is_ffmpeg_working():
134
+ ffmpeg_version = subprocess.run(
135
+ [config.ffmpeg_executable, "-version"],
136
+ stdout=subprocess.PIPE,
137
+ ).stdout.decode()
138
+ return (
139
+ ffmpeg_version.startswith("ffmpeg version")
140
+ and "--enable-libx264" in ffmpeg_version
141
+ )
142
+
143
+
144
+ @healthcheck(
145
+ description="Checking whether latex is available",
146
+ recommendation=(
147
+ "Manim cannot find <latex> on your system's PATH. "
148
+ "You will not be able to use Tex and MathTex mobjects "
149
+ "in your scenes.\n\n"
150
+ "Consult our installation instructions "
151
+ "at https://docs.manim.community/en/stable/installation.html "
152
+ "or search the web for instructions on how to install a "
153
+ "LaTeX distribution on your operating system."
154
+ ),
155
+ )
156
+ def is_latex_available():
157
+ path_to_latex = shutil.which("latex")
158
+ return path_to_latex is not None and os.access(path_to_latex, os.X_OK)
159
+
160
+
161
+ @healthcheck(
162
+ description="Checking whether dvisvgm is available",
163
+ recommendation=(
164
+ "Manim could find <latex>, but not <dvisvgm> on your system's "
165
+ "PATH. Make sure your installed LaTeX distribution comes with "
166
+ "dvisvgm and consider installing a larger distribution if it "
167
+ "does not."
168
+ ),
169
+ skip_on_failed=[is_latex_available],
170
+ )
171
+ def is_dvisvgm_available():
172
+ path_to_dvisvgm = shutil.which("dvisvgm")
173
+ return path_to_dvisvgm is not None and os.access(path_to_dvisvgm, os.X_OK)
@@ -0,0 +1,81 @@
1
+ """A CLI utility helping to diagnose problems with
2
+ your Manim installation.
3
+
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import sys
9
+
10
+ import click
11
+ import cloup
12
+
13
+ from .checks import HEALTH_CHECKS
14
+
15
+
16
+ @cloup.command(
17
+ context_settings=None,
18
+ )
19
+ def checkhealth():
20
+ """This subcommand checks whether Manim is installed correctly
21
+ and has access to its required (and optional) system dependencies.
22
+ """
23
+ click.echo(f"Python executable: {sys.executable}\n")
24
+ click.echo("Checking whether your installation of Manim Community is healthy...")
25
+ failed_checks = []
26
+
27
+ for check in HEALTH_CHECKS:
28
+ click.echo(f"- {check.description} ... ", nl=False)
29
+ if any(
30
+ failed_check.__name__ in check.skip_on_failed
31
+ for failed_check in failed_checks
32
+ ):
33
+ click.secho("SKIPPED", fg="blue")
34
+ continue
35
+ check_result = check()
36
+ if check_result:
37
+ click.secho("PASSED", fg="green")
38
+ else:
39
+ click.secho("FAILED", fg="red")
40
+ failed_checks.append(check)
41
+
42
+ click.echo()
43
+
44
+ if failed_checks:
45
+ click.echo(
46
+ "There are problems with your installation, "
47
+ "here are some recommendations to fix them:"
48
+ )
49
+ for ind, failed_check in enumerate(failed_checks):
50
+ click.echo(failed_check.recommendation)
51
+ if ind + 1 < len(failed_checks):
52
+ click.confirm("Continue with next recommendation?")
53
+
54
+ else: # no problems detected!
55
+ click.echo("No problems detected, your installation seems healthy!")
56
+ render_test_scene = click.confirm(
57
+ "Would you like to render and preview a test scene?"
58
+ )
59
+ if render_test_scene:
60
+ import manim as mn
61
+
62
+ class CheckHealthDemo(mn.Scene):
63
+ def construct(self):
64
+ banner = mn.ManimBanner().shift(mn.UP * 0.5)
65
+ self.play(banner.create())
66
+ self.wait(0.5)
67
+ self.play(banner.expand())
68
+ self.wait(0.5)
69
+ text_left = mn.Text("All systems operational!")
70
+ formula_right = mn.MathTex(r"\oint_{\gamma} f(z)~dz = 0")
71
+ text_tex_group = mn.VGroup(text_left, formula_right)
72
+ text_tex_group.arrange(mn.RIGHT, buff=1).next_to(banner, mn.DOWN)
73
+ self.play(mn.Write(text_tex_group))
74
+ self.wait(0.5)
75
+ self.play(
76
+ mn.FadeOut(banner, shift=mn.UP),
77
+ mn.FadeOut(text_tex_group, shift=mn.DOWN),
78
+ )
79
+
80
+ with mn.tempconfig({"preview": True, "disable_caching": True}):
81
+ CheckHealthDemo().render()
@@ -102,4 +102,10 @@ global_options: OptionGroupDecorator = option_group(
102
102
  help="Renders animations without outputting image or video files and disables the window",
103
103
  default=False,
104
104
  ),
105
+ option(
106
+ "--no_latex_cleanup",
107
+ is_flag=True,
108
+ help="Prevents deletion of .aux, .dvi, and .log files produced by Tex and MathTex.",
109
+ default=False,
110
+ ),
105
111
  )
manim/constants.py CHANGED
@@ -10,6 +10,8 @@ import numpy as np
10
10
  from cloup import Context
11
11
  from PIL.Image import Resampling
12
12
 
13
+ from manim.typing import Vector3
14
+
13
15
  __all__ = [
14
16
  "SCENE_NOT_FOUND_MESSAGE",
15
17
  "CHOOSE_NUMBER_MESSAGE",
@@ -62,6 +64,7 @@ __all__ = [
62
64
  "DEFAULT_POINT_DENSITY_1D",
63
65
  "DEFAULT_STROKE_WIDTH",
64
66
  "DEFAULT_FONT_SIZE",
67
+ "SCALE_FACTOR_PER_FONT_POINT",
65
68
  "PI",
66
69
  "TAU",
67
70
  "DEGREES",
@@ -76,34 +79,34 @@ __all__ = [
76
79
  ]
77
80
  # Messages
78
81
 
79
- SCENE_NOT_FOUND_MESSAGE: str = """
82
+ SCENE_NOT_FOUND_MESSAGE = """
80
83
  {} is not in the script
81
84
  """
82
- CHOOSE_NUMBER_MESSAGE: str = """
85
+ CHOOSE_NUMBER_MESSAGE = """
83
86
  Choose number corresponding to desired scene/arguments.
84
87
  (Use comma separated list for multiple entries)
85
88
  Choice(s): """
86
- INVALID_NUMBER_MESSAGE: str = "Invalid scene numbers have been specified. Aborting."
87
- NO_SCENE_MESSAGE: str = """
89
+ INVALID_NUMBER_MESSAGE = "Invalid scene numbers have been specified. Aborting."
90
+ NO_SCENE_MESSAGE = """
88
91
  There are no scenes inside that module
89
92
  """
90
93
 
91
94
  # Pango stuff
92
- NORMAL: str = "NORMAL"
93
- ITALIC: str = "ITALIC"
94
- OBLIQUE: str = "OBLIQUE"
95
- BOLD: str = "BOLD"
95
+ NORMAL = "NORMAL"
96
+ ITALIC = "ITALIC"
97
+ OBLIQUE = "OBLIQUE"
98
+ BOLD = "BOLD"
96
99
  # Only for Pango from below
97
- THIN: str = "THIN"
98
- ULTRALIGHT: str = "ULTRALIGHT"
99
- LIGHT: str = "LIGHT"
100
- SEMILIGHT: str = "SEMILIGHT"
101
- BOOK: str = "BOOK"
102
- MEDIUM: str = "MEDIUM"
103
- SEMIBOLD: str = "SEMIBOLD"
104
- ULTRABOLD: str = "ULTRABOLD"
105
- HEAVY: str = "HEAVY"
106
- ULTRAHEAVY: str = "ULTRAHEAVY"
100
+ THIN = "THIN"
101
+ ULTRALIGHT = "ULTRALIGHT"
102
+ LIGHT = "LIGHT"
103
+ SEMILIGHT = "SEMILIGHT"
104
+ BOOK = "BOOK"
105
+ MEDIUM = "MEDIUM"
106
+ SEMIBOLD = "SEMIBOLD"
107
+ ULTRABOLD = "ULTRABOLD"
108
+ HEAVY = "HEAVY"
109
+ ULTRAHEAVY = "ULTRAHEAVY"
107
110
 
108
111
  RESAMPLING_ALGORITHMS = {
109
112
  "nearest": Resampling.NEAREST,
@@ -119,79 +122,80 @@ RESAMPLING_ALGORITHMS = {
119
122
  }
120
123
 
121
124
  # Geometry: directions
122
- ORIGIN: np.ndarray = np.array((0.0, 0.0, 0.0))
125
+ ORIGIN: Vector3 = np.array((0.0, 0.0, 0.0))
123
126
  """The center of the coordinate system."""
124
127
 
125
- UP: np.ndarray = np.array((0.0, 1.0, 0.0))
128
+ UP: Vector3 = np.array((0.0, 1.0, 0.0))
126
129
  """One unit step in the positive Y direction."""
127
130
 
128
- DOWN: np.ndarray = np.array((0.0, -1.0, 0.0))
131
+ DOWN: Vector3 = np.array((0.0, -1.0, 0.0))
129
132
  """One unit step in the negative Y direction."""
130
133
 
131
- RIGHT: np.ndarray = np.array((1.0, 0.0, 0.0))
134
+ RIGHT: Vector3 = np.array((1.0, 0.0, 0.0))
132
135
  """One unit step in the positive X direction."""
133
136
 
134
- LEFT: np.ndarray = np.array((-1.0, 0.0, 0.0))
137
+ LEFT: Vector3 = np.array((-1.0, 0.0, 0.0))
135
138
  """One unit step in the negative X direction."""
136
139
 
137
- IN: np.ndarray = np.array((0.0, 0.0, -1.0))
140
+ IN: Vector3 = np.array((0.0, 0.0, -1.0))
138
141
  """One unit step in the negative Z direction."""
139
142
 
140
- OUT: np.ndarray = np.array((0.0, 0.0, 1.0))
143
+ OUT: Vector3 = np.array((0.0, 0.0, 1.0))
141
144
  """One unit step in the positive Z direction."""
142
145
 
143
146
  # Geometry: axes
144
- X_AXIS: np.ndarray = np.array((1.0, 0.0, 0.0))
145
- Y_AXIS: np.ndarray = np.array((0.0, 1.0, 0.0))
146
- Z_AXIS: np.ndarray = np.array((0.0, 0.0, 1.0))
147
+ X_AXIS: Vector3 = np.array((1.0, 0.0, 0.0))
148
+ Y_AXIS: Vector3 = np.array((0.0, 1.0, 0.0))
149
+ Z_AXIS: Vector3 = np.array((0.0, 0.0, 1.0))
147
150
 
148
151
  # Geometry: useful abbreviations for diagonals
149
- UL: np.ndarray = UP + LEFT
152
+ UL: Vector3 = UP + LEFT
150
153
  """One step up plus one step left."""
151
154
 
152
- UR: np.ndarray = UP + RIGHT
155
+ UR: Vector3 = UP + RIGHT
153
156
  """One step up plus one step right."""
154
157
 
155
- DL: np.ndarray = DOWN + LEFT
158
+ DL: Vector3 = DOWN + LEFT
156
159
  """One step down plus one step left."""
157
160
 
158
- DR: np.ndarray = DOWN + RIGHT
161
+ DR: Vector3 = DOWN + RIGHT
159
162
  """One step down plus one step right."""
160
163
 
161
164
  # Geometry
162
- START_X: int = 30
163
- START_Y: int = 20
164
- DEFAULT_DOT_RADIUS: float = 0.08
165
- DEFAULT_SMALL_DOT_RADIUS: float = 0.04
166
- DEFAULT_DASH_LENGTH: float = 0.05
167
- DEFAULT_ARROW_TIP_LENGTH: float = 0.35
165
+ START_X = 30
166
+ START_Y = 20
167
+ DEFAULT_DOT_RADIUS = 0.08
168
+ DEFAULT_SMALL_DOT_RADIUS = 0.04
169
+ DEFAULT_DASH_LENGTH = 0.05
170
+ DEFAULT_ARROW_TIP_LENGTH = 0.35
168
171
 
169
172
  # Default buffers (padding)
170
- SMALL_BUFF: float = 0.1
171
- MED_SMALL_BUFF: float = 0.25
172
- MED_LARGE_BUFF: float = 0.5
173
- LARGE_BUFF: float = 1
174
- DEFAULT_MOBJECT_TO_EDGE_BUFFER: float = MED_LARGE_BUFF
175
- DEFAULT_MOBJECT_TO_MOBJECT_BUFFER: float = MED_SMALL_BUFF
173
+ SMALL_BUFF = 0.1
174
+ MED_SMALL_BUFF = 0.25
175
+ MED_LARGE_BUFF = 0.5
176
+ LARGE_BUFF = 1
177
+ DEFAULT_MOBJECT_TO_EDGE_BUFFER = MED_LARGE_BUFF
178
+ DEFAULT_MOBJECT_TO_MOBJECT_BUFFER = MED_SMALL_BUFF
176
179
 
177
180
  # Times in seconds
178
- DEFAULT_POINTWISE_FUNCTION_RUN_TIME: float = 3.0
179
- DEFAULT_WAIT_TIME: float = 1.0
181
+ DEFAULT_POINTWISE_FUNCTION_RUN_TIME = 3.0
182
+ DEFAULT_WAIT_TIME = 1.0
180
183
 
181
184
  # Misc
182
- DEFAULT_POINT_DENSITY_2D: int = 25
183
- DEFAULT_POINT_DENSITY_1D: int = 10
184
- DEFAULT_STROKE_WIDTH: int = 4
185
- DEFAULT_FONT_SIZE: float = 48
185
+ DEFAULT_POINT_DENSITY_2D = 25
186
+ DEFAULT_POINT_DENSITY_1D = 10
187
+ DEFAULT_STROKE_WIDTH = 4
188
+ DEFAULT_FONT_SIZE = 48
189
+ SCALE_FACTOR_PER_FONT_POINT = 1 / 960
186
190
 
187
191
  # Mathematical constants
188
- PI: float = np.pi
192
+ PI = np.pi
189
193
  """The ratio of the circumference of a circle to its diameter."""
190
194
 
191
- TAU: float = 2 * PI
195
+ TAU = 2 * PI
192
196
  """The ratio of the circumference of a circle to its radius."""
193
197
 
194
- DEGREES: float = TAU / 360
198
+ DEGREES = TAU / 360
195
199
  """The exchange rate between radians and degrees."""
196
200
 
197
201
  # Video qualities
@@ -234,7 +238,7 @@ QUALITIES: dict[str, dict[str, str | int | None]] = {
234
238
  },
235
239
  }
236
240
 
237
- DEFAULT_QUALITY: str = "high_quality"
241
+ DEFAULT_QUALITY = "high_quality"
238
242
 
239
243
  EPILOG = "Made with <3 by Manim Community developers."
240
244
  SHIFT_VALUE = 65505
@@ -8,6 +8,7 @@ Modules
8
8
 
9
9
  ~arc
10
10
  ~boolean_ops
11
+ ~labeled
11
12
  ~line
12
13
  ~polygram
13
14
  ~shape_matchers