manim/tests/module/utils/_split_matrices.py
Francisco Manríquez Novoa 7b841c27cc
Created and optimized Bézier splitting functions such as partial_bezier_points() in manim.utils.bezier (#3766)
* Optimized manim.utils.partial_bezier_points()

* Added split_bezier, subdivide_bezier and bezier_remap, and tests

* Use bezier_remap() in VMobject and OpenGLVMobject()

* Note that partial_bezier_points is similar to calling split_bezier twice
2024-05-21 05:26:59 +00:00

215 lines
5 KiB
Python

import numpy as np
# Defined because pre-commit is inserting an unacceptable line-break
# between the "1" (or "2") and the "/ 3"
one_third = 1 / 3
two_thirds = 2 / 3
# Expected values for matrices in split_bezier
SPLIT_MATRICES = {
# For 0-degree Béziers
0: {
0: np.array([[1], [1]]),
one_third: np.array([[1], [1]]),
two_thirds: np.array([[1], [1]]),
1: np.array([[1], [1]]),
},
# For linear Béziers
1: {
0: np.array(
[
[1, 0],
[1, 0],
[1, 0],
[0, 1],
]
),
one_third: np.array(
[
[3, 0],
[2, 1],
[2, 1],
[0, 3],
]
)
/ 3,
two_thirds: np.array(
[
[3, 0],
[1, 2],
[1, 2],
[0, 3],
]
)
/ 3,
1: np.array(
[
[1, 0],
[0, 1],
[0, 1],
[0, 1],
]
),
},
# For quadratic Béziers
2: {
0: np.array(
[
[1, 0, 0],
[1, 0, 0],
[1, 0, 0],
[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
]
),
one_third: np.array(
[
[9, 0, 0],
[6, 3, 0],
[4, 4, 1],
[4, 4, 1],
[0, 6, 3],
[0, 0, 9],
]
)
/ 9,
two_thirds: np.array(
[
[9, 0, 0],
[3, 6, 0],
[1, 4, 4],
[1, 4, 4],
[0, 3, 6],
[0, 0, 9],
]
)
/ 9,
1: np.array(
[
[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[0, 0, 1],
[0, 0, 1],
[0, 0, 1],
]
),
},
# For cubic Béziers
3: {
0: np.array(
[
[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
]
),
one_third: np.array(
[
[27, 0, 0, 0],
[18, 9, 0, 0],
[12, 12, 3, 0],
[8, 12, 6, 1],
[8, 12, 6, 1],
[0, 12, 12, 3],
[0, 0, 18, 9],
[0, 0, 0, 27],
]
)
/ 27,
two_thirds: np.array(
[
[27, 0, 0, 0],
[9, 18, 0, 0],
[3, 12, 12, 0],
[1, 6, 12, 8],
[1, 6, 12, 8],
[0, 3, 12, 12],
[0, 0, 9, 18],
[0, 0, 0, 27],
]
)
/ 27,
1: np.array(
[
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 0, 0, 1],
[0, 0, 0, 1],
[0, 0, 0, 1],
[0, 0, 0, 1],
]
),
},
# Test case with a quartic Bézier
# to check if the fallback algorithms work
4: {
0: np.array(
[
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
]
),
one_third: np.array(
[
[81, 0, 0, 0, 0],
[54, 27, 0, 0, 0],
[36, 36, 9, 0, 0],
[24, 36, 18, 3, 0],
[16, 32, 24, 8, 1],
[16, 32, 24, 8, 1],
[0, 24, 36, 18, 3],
[0, 0, 36, 36, 9],
[0, 0, 0, 54, 27],
[0, 0, 0, 0, 81],
]
)
/ 81,
two_thirds: np.array(
[
[81, 0, 0, 0, 0],
[27, 54, 0, 0, 0],
[9, 36, 36, 0, 0],
[3, 18, 36, 24, 0],
[1, 8, 24, 32, 16],
[1, 8, 24, 32, 16],
[0, 3, 18, 36, 24],
[0, 0, 9, 36, 36],
[0, 0, 0, 27, 54],
[0, 0, 0, 0, 81],
]
)
/ 81,
1: np.array(
[
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 1],
]
),
},
}