Manim:超赞的Python数学动画库

01

引言

本文将带大家走进Manim的世界!这是一个由大名鼎鼎的3Blue1Brown 的作者Grant Sanderson创建,它能通过精美的动画让数学栩栩如生,特别适合用于制作各类数学教学视频。

在本文中,我们将探索 Manim 在数学可视化方面的强大功能,看看它是如何将抽象的概念变得引人入胜、令人惊叹的。准备好大开眼界吧!

02

安装

在正式开始之前,我们需要进行安装,一般使用pip即可安装,命令如下:

pip install manim

安装完成后,我们就可以开始一起探索这个超棒的动画库了。准备好用 Manim 制作精美动画了吗?让我们接下来一起深入了解五个示例!我们将从简单的动画开始,逐步过渡到更复杂的动画,展示Manim 的强大功能和直观性。

03

显示简单文本

首先,让我们创建一个动画,在屏幕上显示文字 “Hello,Manim!”。下面是实现这一目的的代码片段:

# scene.py
from manim import *

class HelloWorld(Scene):
    def construct(self):
        text = Text("Hello, Manim!")
        self.play(Write(text))
        self.wait()

之后在当前文件所在目录下的命令行窗口,执行以下命令:

manim -pql scene.py HelloWorld

即可得到如下结果:

04

分析解释

在上述中,首先我们导入了 Manim 的基本组件,定义了一个继承自 Scene 的自定义类 HelloWorld,并创建了一个包含输出信息的Text对象,使用 Write函数制作文本动画,self.play()显示动画,self.wait()暂停动画片刻。

此外,我们对上述运行命令行进行分析:

manim -pql scene.py HelloWorld

首先,上述命令在包含描述绘画代码的文件scene.py上执行manim。此外,此命令告诉 manim 要渲染的确切场景,在本例中,它是HelloWorld。这是必需的,因为单个场景文件scene.py 可能包含多个场景类的定义。

接下来,标志位 -p 告诉 manim在渲染场景后播放场景,而 -ql 标志位告诉 manim 以低质量渲染场景。当然,指定渲染场景动画质量的其他选项还包括 -qm、-qh 和 -qk,分别表示中、高和4k高清质量。

05

绘制几何图形

现在,让我们用一个圆形和一个正方形制作一个简单的动画。


# scene.py
from manim import *

class Shapes(Scene):
    def construct(self):
        circle = Circle()
        square = Square()
        self.play(Create(circle))
        self.play(circle.animate.shift(LEFT))
        self.play(Create(square))
        self.play(square.animate.shift(RIGHT))
        self.wait()

上述代码中,我们定义了一个形状类Shapes,并创建了圆形和正方形对象。然后,我们使用 Create 绘制相应对象的形状,并使用animate.shift() 方法将它们分别向左和向右移动。

同样在命令行中,运行如下命令:

 manim -pql scene.py Shapes 

得到结果如下:

06

动画组合

接着让我们用动画演示从正方形到圆形的转换。

# scene.py
from manim import *

class Transformation(Scene):
 def construct(self):
 square = Square()
 circle = Circle()
 self.play(Create(square))
 self.play(Transform(square, circle))
 self.wait()

在本例中,我们同时创建了正方形和圆形对象,使用创建动画函数Create绘制正方形,然后使用变换动画函数Transform将正方形变为圆形。

同样在命令行中,运行如下命令:

manim -pql scene.py Transformation

得到结果如下:

06

演示数学函数

接着让我们来绘制一条简单的抛物线:


# scene.py

class FunctionPlot(Scene):
    def construct(self):
        ax = Axes(
            x_range=[-5, 5, 1],
            y_range=[-3, 3, 1],
            x_length=10,
            y_length=6,
            axis_config={"include_numbers": True},
        )
        func = lambda x: 0.1 * (x**2)
        curve = ax.plot(func, color=YELLOW)
        self.play(Create(ax))
        self.play(Write(curve))
        self.wait()

在上述代码中,我们首先要设置一个Axes对象,配置其 x 方向和 y方向的范围及长度,并启用沿轴显示数字。接下来,我们为抛物线曲线

(y=0.1x^2)定义一个 lambda函数。最后我们使用 plot() 方法生成函数的图形,并将其存储在变量curve中。

同样在命令行中,运行如下命令:

manim -pql scene.py FunctionPlot

得到结果如下:

07

演示复杂公式

事实上,我们经常会遇到一些数学上复杂的计算公式,此时我们可以使用 LaTeX 代码来表示对应的方程,举例如下:

class LaTeXFormula(Scene):
    def construct(self):
        formula = MathTex(r"\int_{-\infty}^{\infty} \frac{1}{\sqrt{2\pi\sigma^2}}dx")
        self.play(Write(formula))
        self.wait()

我们创建一个名为formula 的MathTex 对象,其中包含描述方程的LaTeX 代码。运行上述代码后,可以得到结果动画如下:

08

总结

只需简单几行代码,大家就可以使用 Manim 来制作出令人惊叹的数学动画。对数学和编程感兴趣的同学,推荐大家快来尝试,享受其中的乐趣吧!

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

  • 25
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pygame模块可以用来实现很多有趣的游戏,其中包括经典的贪吃蛇游戏。通过使用Pygame模块的绘图功能,可以实现一个具有视觉效果的贪吃蛇游戏。 下面是一个简单的贪吃蛇游戏的实现: ```python import pygame import random # 初始化游戏 pygame.init() # 定义游戏窗口大小 win_width = 800 win_height = 600 # 创建游戏窗口 win = pygame.display.set_mode((win_width, win_height)) # 设置游戏标题 pygame.display.set_caption("贪吃蛇") # 定义颜色 white = (255, 255, 255) black = (0, 0, 0) red = (255, 0, 0) green = (0, 255, 0) # 设置游戏时钟 clock = pygame.time.Clock() # 定义蛇的属性 snake_block = 10 snake_speed = 15 # 定义字体 font_style = pygame.font.SysFont(None, 50) # 定义函数,用于显示文字 def message(msg, color): message = font_style.render(msg, True, color) win.blit(message, [win_width / 6, win_height / 3]) # 定义函数,用于绘制蛇 def draw_snake(snake_block, snake_list): for x in snake_list: pygame.draw.rect(win, green, [x[0], x[1], snake_block, snake_block]) # 定义游戏循环 def game_loop(): game_over = False game_close = False # 定义蛇的初始位置 x1 = win_width / 2 y1 = win_height / 2 # 定义蛇的移动方向 x1_change = 0 y1_change = 0 # 定义蛇的初始长度 snake_List = [] Length_of_snake = 1 # 定义食物的初始位置 foodx = round(random.randrange(0, win_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, win_height - snake_block) / 10.0) * 10.0 # 游戏循环 while not game_over: while game_close == True: win.fill(white) message("你输了,按 Q 退出,按 C 重新开始!", red) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_over = True game_close = False if event.key == pygame.K_c: game_loop() for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -snake_block y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = snake_block y1_change = 0 elif event.key == pygame.K_UP: y1_change = -snake_block x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = snake_block x1_change = 0 # 判断蛇是否超出边界 if x1 >= win_width or x1 < 0 or y1 >= win_height or y1 < 0: game_close = True # 更新蛇的位置 x1 += x1_change y1 += y1_change # 绘制游戏背景 win.fill(white) # 绘制食物 pygame.draw.rect(win, red, [foodx, foody, snake_block, snake_block]) # 更新蛇的长度 snake_Head = [] snake_Head.append(x1) snake_Head.append(y1) snake_List.append(snake_Head) if len(snake_List) > Length_of_snake: del snake_List[0] # 判断蛇是否吃到食物 for x in snake_List[:-1]: if x == snake_Head: game_close = True # 绘制蛇 draw_snake(snake_block, snake_List) # 更新游戏窗口 pygame.display.update() # 判断蛇是否吃到食物 if x1 == foodx and y1 == foody: foodx = round(random.randrange(0, win_width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, win_height - snake_block) / 10.0) * 10.0 Length_of_snake += 1 # 设置游戏速度 clock.tick(snake_speed) # 退出游戏 pygame.quit() quit() # 启动游戏循环 game_loop() ``` 这个程序可以实现一个基本的贪吃蛇游戏,玩家可以使用方向键控制蛇的移动方向,吃到食物后蛇的长度会增加。当蛇碰到边界或自己时,游戏结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值