矩阵在线性代数中无处不在。矩阵的列描述了相应的基向量相对于初始基的位置。所有变换后的向量都是变换后的基向量的线性组合它们是矩阵的列,这也被称为线性。对矩阵进行操作的算法本质上只是改变了向量变换的方式,保留了一些性质。
from manim import * # 导入 Manim 库
class LinearTransformation3D02(ThreeDScene): # 定义一个名为 LinearTransformation3D02 的类,继承 ThreeDScene
def create_matrix(self, np_matrix): # 定义一个方法,用于创建矩阵对象
m = Matrix(np_matrix) # 创建一个矩阵 m
m.scale(0.5) # 将矩阵缩放到原来的一半大小
m.set_column_colors(GREEN, RED, GOLD) # 设置矩阵列的颜色
m.to_corner(UP + LEFT) # 将矩阵移动到屏幕的左上角
return m # 返回创建的矩阵对象
def construct(self): # 定义构建场景的方法
basis_i_color = GREEN # 设置 i 向量的颜色为绿色
basis_j_color = RED # 设置 j 向量的颜色为红色
basis_k_color = GOLD # 设置 k 向量的颜色为金色
M = np.array([ # 创建一个变换矩阵 M
[2, 2, -1],
[-2, 1, 2],
[3, 1, 0]
])
axes = ThreeDAxes() # 创建三维坐标轴对象
axes.set_color(GRAY) # 设置坐标轴的颜色为灰色
axes.add(axes.get_axis_labels()) # 为坐标轴添加轴标签
self.set_camera_orientation(phi=75 * DEGREES, theta=-45 * DEGREES) # 设置相机的旋转角度
basis_vector_helper = Tex("$i$" , "," , "$j$" , "," , "$k$") # 创建基础向量标签
basis_vector_helper[0].set_color(basis_i_color) # 设置 i 向量标签的颜色
basis_vector_helper[2].set_color(basis_j_color) # 设置 j 向量标签的颜色
basis_vector_helper[4].set_color(basis_k_color) # 设置 k 向量标签的颜色
basis_vector_helper.to_corner(UP + RIGHT) # 将标签移动到右上角
self.add_fixed_in_frame_mobjects(basis_vector_helper) # 将基础向量标签固定在屏幕上
matrix = self.create_matrix(M) # 创建矩阵对象
self.add_fixed_in_frame_mobjects(matrix) # 将矩阵固定在屏幕上
self.add(axes) # 添加坐标轴到场景
self.begin_ambient_camera_rotation(rate=0.2) # 开始相机的环绕旋转
cube = Cube(side_length=1, fill_color=BLUE, stroke_width=2, fill_opacity=0.1) # 创建透明的蓝色正方体
cube.set_stroke(BLUE_E) # 设置正方体的边框颜色
i_vec = Vector(np.array([1, 0, 0]), color=basis_i_color) # 创建 i 向量
j_vec = Vector(np.array([0, 1, 0]), color=basis_j_color) # 创建 j 向量
k_vec = Vector(np.array([0, 0, 1]), color=basis_k_color) # 创建 k 向量
i_vec_new = Vector(M @ np.array([1, 0, 0]), color=basis_i_color) # 计算变换后的 i 向量
j_vec_new = Vector(M @ np.array([0, 1, 0]), color=basis_j_color) # 计算变换后的 j 向量
k_vec_new = Vector(M @ np.array([0, 0, 1]), color=basis_k_color) # 计算变换后的 k 向量
self.play( # 播放初始动画
Create(cube), # 创建正方体动画
GrowArrow(i_vec), # 显示 i 向量动画
GrowArrow(j_vec), # 显示 j 向量动画
GrowArrow(k_vec), # 显示 k 向量动画
Write(basis_vector_helper) # 显示基础向量标签动画
)
self.wait(2) # 等待 2 秒以展示初始状态
# 变换 i 向量
matrix_anim_i = ApplyMatrix(M, cube) # 创建应用矩阵 M 的动画
self.pl