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.
- manim/__init__.py +1 -0
- manim/__main__.py +2 -0
- manim/_config/__init__.py +0 -1
- manim/_config/logger_utils.py +1 -0
- manim/_config/utils.py +14 -5
- manim/animation/changing.py +9 -5
- manim/animation/creation.py +8 -3
- manim/animation/indication.py +4 -4
- manim/animation/speedmodifier.py +2 -4
- manim/animation/updaters/mobject_update_utils.py +134 -16
- manim/camera/camera.py +31 -17
- manim/cli/checkhealth/__init__.py +0 -0
- manim/cli/checkhealth/checks.py +173 -0
- manim/cli/checkhealth/commands.py +81 -0
- manim/cli/render/global_options.py +6 -0
- manim/constants.py +58 -54
- manim/mobject/geometry/__init__.py +1 -0
- manim/mobject/geometry/arc.py +126 -91
- manim/mobject/geometry/boolean_ops.py +6 -10
- manim/mobject/geometry/labeled.py +155 -0
- manim/mobject/geometry/line.py +66 -50
- manim/mobject/geometry/polygram.py +23 -15
- manim/mobject/geometry/shape_matchers.py +24 -15
- manim/mobject/geometry/tips.py +62 -40
- manim/mobject/graph.py +3 -4
- manim/mobject/graphing/coordinate_systems.py +190 -139
- manim/mobject/graphing/number_line.py +5 -2
- manim/mobject/graphing/probability.py +4 -3
- manim/mobject/graphing/scale.py +7 -7
- manim/mobject/logo.py +108 -22
- manim/mobject/matrix.py +33 -37
- manim/mobject/mobject.py +327 -260
- manim/mobject/opengl/opengl_image_mobject.py +1 -1
- manim/mobject/opengl/opengl_mobject.py +18 -12
- manim/mobject/opengl/opengl_point_cloud_mobject.py +1 -1
- manim/mobject/opengl/opengl_surface.py +1 -1
- manim/mobject/opengl/opengl_vectorized_mobject.py +21 -17
- manim/mobject/svg/brace.py +3 -1
- manim/mobject/svg/svg_mobject.py +9 -11
- manim/mobject/table.py +50 -54
- manim/mobject/text/numbers.py +48 -6
- manim/mobject/text/tex_mobject.py +8 -12
- manim/mobject/text/text_mobject.py +32 -24
- manim/mobject/three_d/three_d_utils.py +13 -8
- manim/mobject/three_d/three_dimensions.py +61 -43
- manim/mobject/types/image_mobject.py +5 -4
- manim/mobject/types/point_cloud_mobject.py +8 -6
- manim/mobject/types/vectorized_mobject.py +385 -258
- manim/mobject/vector_field.py +19 -11
- manim/plugins/import_plugins.py +1 -1
- manim/plugins/plugins_flags.py +1 -6
- manim/renderer/shader.py +2 -2
- manim/scene/scene.py +15 -7
- manim/scene/scene_file_writer.py +1 -2
- manim/scene/three_d_scene.py +1 -1
- manim/scene/vector_space_scene.py +17 -7
- manim/typing.py +133 -0
- manim/utils/bezier.py +267 -83
- manim/utils/color/AS2700.py +234 -0
- manim/utils/color/BS381.py +315 -0
- manim/utils/color/X11.py +530 -0
- manim/utils/color/XKCD.py +949 -0
- manim/utils/color/__init__.py +58 -0
- manim/utils/color/core.py +1036 -0
- manim/utils/color/manim_colors.py +220 -0
- manim/utils/docbuild/autocolor_directive.py +92 -0
- manim/utils/docbuild/manim_directive.py +40 -6
- manim/utils/file_ops.py +1 -1
- manim/utils/hashing.py +1 -1
- manim/utils/iterables.py +1 -1
- manim/utils/rate_functions.py +33 -0
- manim/utils/simple_functions.py +0 -18
- manim/utils/space_ops.py +55 -42
- manim/utils/testing/frames_comparison.py +9 -0
- manim/utils/tex.py +2 -0
- manim/utils/tex_file_writing.py +29 -2
- {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/METADATA +14 -14
- {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/RECORD +82 -71
- {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/WHEEL +1 -1
- manim/communitycolors.py +0 -9
- manim/utils/color.py +0 -552
- {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/LICENSE +0 -0
- {manim-0.17.3.dist-info → manim-0.18.0.post0.dist-info}/LICENSE.community +0 -0
- {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
|
|
82
|
+
SCENE_NOT_FOUND_MESSAGE = """
|
|
80
83
|
{} is not in the script
|
|
81
84
|
"""
|
|
82
|
-
CHOOSE_NUMBER_MESSAGE
|
|
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
|
|
87
|
-
NO_SCENE_MESSAGE
|
|
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
|
|
93
|
-
ITALIC
|
|
94
|
-
OBLIQUE
|
|
95
|
-
BOLD
|
|
95
|
+
NORMAL = "NORMAL"
|
|
96
|
+
ITALIC = "ITALIC"
|
|
97
|
+
OBLIQUE = "OBLIQUE"
|
|
98
|
+
BOLD = "BOLD"
|
|
96
99
|
# Only for Pango from below
|
|
97
|
-
THIN
|
|
98
|
-
ULTRALIGHT
|
|
99
|
-
LIGHT
|
|
100
|
-
SEMILIGHT
|
|
101
|
-
BOOK
|
|
102
|
-
MEDIUM
|
|
103
|
-
SEMIBOLD
|
|
104
|
-
ULTRABOLD
|
|
105
|
-
HEAVY
|
|
106
|
-
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:
|
|
125
|
+
ORIGIN: Vector3 = np.array((0.0, 0.0, 0.0))
|
|
123
126
|
"""The center of the coordinate system."""
|
|
124
127
|
|
|
125
|
-
UP:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
145
|
-
Y_AXIS:
|
|
146
|
-
Z_AXIS:
|
|
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:
|
|
152
|
+
UL: Vector3 = UP + LEFT
|
|
150
153
|
"""One step up plus one step left."""
|
|
151
154
|
|
|
152
|
-
UR:
|
|
155
|
+
UR: Vector3 = UP + RIGHT
|
|
153
156
|
"""One step up plus one step right."""
|
|
154
157
|
|
|
155
|
-
DL:
|
|
158
|
+
DL: Vector3 = DOWN + LEFT
|
|
156
159
|
"""One step down plus one step left."""
|
|
157
160
|
|
|
158
|
-
DR:
|
|
161
|
+
DR: Vector3 = DOWN + RIGHT
|
|
159
162
|
"""One step down plus one step right."""
|
|
160
163
|
|
|
161
164
|
# Geometry
|
|
162
|
-
START_X
|
|
163
|
-
START_Y
|
|
164
|
-
DEFAULT_DOT_RADIUS
|
|
165
|
-
DEFAULT_SMALL_DOT_RADIUS
|
|
166
|
-
DEFAULT_DASH_LENGTH
|
|
167
|
-
DEFAULT_ARROW_TIP_LENGTH
|
|
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
|
|
171
|
-
MED_SMALL_BUFF
|
|
172
|
-
MED_LARGE_BUFF
|
|
173
|
-
LARGE_BUFF
|
|
174
|
-
DEFAULT_MOBJECT_TO_EDGE_BUFFER
|
|
175
|
-
DEFAULT_MOBJECT_TO_MOBJECT_BUFFER
|
|
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
|
|
179
|
-
DEFAULT_WAIT_TIME
|
|
181
|
+
DEFAULT_POINTWISE_FUNCTION_RUN_TIME = 3.0
|
|
182
|
+
DEFAULT_WAIT_TIME = 1.0
|
|
180
183
|
|
|
181
184
|
# Misc
|
|
182
|
-
DEFAULT_POINT_DENSITY_2D
|
|
183
|
-
DEFAULT_POINT_DENSITY_1D
|
|
184
|
-
DEFAULT_STROKE_WIDTH
|
|
185
|
-
DEFAULT_FONT_SIZE
|
|
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
|
|
192
|
+
PI = np.pi
|
|
189
193
|
"""The ratio of the circumference of a circle to its diameter."""
|
|
190
194
|
|
|
191
|
-
TAU
|
|
195
|
+
TAU = 2 * PI
|
|
192
196
|
"""The ratio of the circumference of a circle to its radius."""
|
|
193
197
|
|
|
194
|
-
DEGREES
|
|
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
|
|
241
|
+
DEFAULT_QUALITY = "high_quality"
|
|
238
242
|
|
|
239
243
|
EPILOG = "Made with <3 by Manim Community developers."
|
|
240
244
|
SHIFT_VALUE = 65505
|