用manim实现三维向量和平面的结合

矩阵在线性代数中无处不在。矩阵的列描述了相应的基向量相对于初始基的位置。所有变换后的向量都是变换后的基向量的线性组合它们是矩阵的列,这也被称为线性。对矩阵进行操作的算法本质上只是改变了向量变换的方式,保留了一些性质。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yasen.M

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值