python实现动态数字的显示和变化

Numbers 是一个用于表示和处理数值的基础类,通常在数学可视化和动画中使用。它包含以下功能:

  1. 数值表示: 可以表示整数、小数等基本数值类型。
  2. 动态更新: 允许数值随时间变化,通常结合动画效果使用。
  3. 格式化输出: 支持自定义输出格式,如指定小数位数、文本颜色和字体大小。

应用场景:

  • 在数学动画中展示计算结果。
  • 创建动态交互式模拟,实时更新数值。
  • 可视化数据分析结果,增强观众理解。

Numbers 类的使用 在数学、物理等领域的教学和演示中尤为重要,可以帮助直观地传达抽象概念。

1.DecimalNumber: 用于显示小数值,支持自定义小数位数、颜色和字体大小。

DecimalNumber 用于在动画中显示一个小数值,支持多种配置选项。构造函数如下:

python 复制代码
DecimalNumber(number=0, num_decimal_places=2, mob_class=<class 
'manim.mobject.text.tex_mobject.MathTex'>, include_sign=False, group_with_commas=True, 
digit_buff_per_font_unit=0.001, show_ellipsis=False, unit=None, unit_buff_per_font_unit=0, 
include_background_rectangle=False, edge_to_fix=array([-1., 0., 0.]), font_size=48, 
stroke_width=0, fill_opacity=1.0, **kwargs)

以下是各参数的简要说明:

各参数的解释
  • number: 要显示的小数值,默认为0。
  • num_decimal_places: 小数位数,默认为2。
  • mob_class : 使用的对象类,默认为MathTex,用于显示数学文本。
  • include_sign: 是否包括正负号,默认为False。
  • group_with_commas: 是否以逗号分隔大数字部分,默认为True。
  • digit_buff_per_font_unit: 字符间距的缓冲量,默认为0.001。
  • show_ellipsis: 是否显示省略号,默认为False。
  • unit: 可选的单位,默认为None。
  • unit_buff_per_font_unit: 单位与数字之间的缓冲量,默认为0。
  • include_background_rectangle: 是否包含背景矩形,默认为False。
  • edge_to_fix : 修正边缘,默认为array([-1., 0., 0.]),用于调整位置。
  • font_size: 字体大小,默认为48。
  • stroke_width: 边框宽度,默认为0(无边框)。
  • fill_opacity: 填充不透明度,默认为1.0(完全不透明)。
  • kwargs: 其他可选参数。
示例代码

以下是一个使用所有参数的代码示例,展示如何创建一个DecimalNumber对象并配置其属性:

python 复制代码
from manim import *  

class DecimalNumberExample(Scene):  
    def construct(self):  
        # 创建一个DecimalNumber对象,初始值为12345.678  
        decimal_number = DecimalNumber(  
            number=12345.678,                  # 显示的小数值  
            num_decimal_places=5,              # 保留3位小数  
            mob_class=MathTex,                 # 使用MathTex显示数字  
            include_sign=True,                  # 包含正负号  
            group_with_commas=True,             # 使用逗号分隔大数字  
            digit_buff_per_font_unit=0.005,    # 字符间距的缓冲量  
            show_ellipsis=False,                 # 不显示省略号  
            unit="m/s",                         # 设置单位为米每秒  
            unit_buff_per_font_unit=0.02,       # 单位与数字之间的缓冲量  
            include_background_rectangle=True,   # 包含背景矩形  
            edge_to_fix=np.array([-1., 0., 0.]), # 修正边缘位置  
            font_size=48,                       # 设置字体大小  
            stroke_width=2,                     # 设置边框宽度  
            fill_opacity=0.7,                   # 设置填充不透明度  
        )  

        # 添加到场景  
        self.add(decimal_number)  
        
        # 设置背景矩形的颜色和透明度  
        background_rectangle = SurroundingRectangle(decimal_number, buff=0.1)  
        background_rectangle.set_fill(BLUE, opacity=0.3)  # 设置背景颜色为蓝色,透明度为0.3  
        self.add(background_rectangle)  # 将背景矩形添加到场景  

        # 动画将数值移动到原点位置  
        self.play(decimal_number.animate.move_to(ORIGIN)) 

示例2:

python 复制代码
class MovingSquareWithUpdaters(Scene):
    def construct(self):
        self.add(NumberPlane())
        decimal = DecimalNumber( 
            number=2.678,                  # 显示的小数值  
            num_decimal_places=5,              # 保留3位小数  
            mob_class=MathTex,                 # 使用MathTex显示数字  
            include_sign=True,                  # 包含正负号  
            group_with_commas=True,             # 使用逗号分隔大数字  
            digit_buff_per_font_unit=0.005,    # 字符间距的缓冲量  
            show_ellipsis=False,                 # 不显示省略号  
            unit="m/s",                         # 设置单位为米每秒  
            unit_buff_per_font_unit=0.002,       # 单位与数字之间的缓冲量  
            include_background_rectangle=True,   # 包含背景矩形  
            edge_to_fix=np.array([-1., 0., 0.]), # 修正边缘位置  
            font_size=48,                       # 设置字体大小  
            stroke_width=2,                     # 设置边框宽度  
            fill_opacity=0.25,                   # 设置填充不透明度  
        )  
        square = Dot(radius=0.1,color=RED).to_edge(UP+LEFT)#创建一个方形并将其移动到画面的顶部边缘 (UP)。

        decimal.add_updater(lambda d: d.next_to(square, RIGHT))
        decimal.add_updater(lambda d: d.set_value(square.get_center()[1]))
        #第一个更新器使得数字总是显示在方形的右侧。
        #第二个更新器将数字设置为方形的 Y 坐标值(方形当前位置的高度)。这意味着方形的高度变化时,数字的值会随之更新。
        self.add(square, decimal)#将方形和数字添加到场景中。
        self.play(
            square.animate.to_edge(DOWN),
            rate_func=there_and_back,
            run_time=5,
            #将方形动画移动到画面的底部边缘 (DOWN),动画持续时间为 5 秒。
            #rate_func=there_and_back 指定动画先向下运动再回到原处。
        )
        self.wait()

MovingSquareWithUpdaters

2.动态更新: 允许数值随时间变化

Integer: 用于显示整数值,支持自定义颜色和字体大小。动态更新:,允许数值随时间变化,通常结合动画效果使用。Integer 是 Manim 中用于显示整数的类,通常用来创建动态展示数字的对象。

python 复制代码
Integer(number=0, num_decimal_places=0, **kwargs)

以下是对 Integer 类及其参数的解释:

构造函数

Integer(number=0, num_decimal_places=0, **kwargs) 
参数解释
  1. number:

    • 类型:int
    • 默认值:0
    • 描述:初始化时显示的整数值。可以传入任何整数作为起始值。
  2. num_decimal_places:

    • 类型:int
    • 默认值:0
    • 描述:用于设置数字显示的小数位数。虽然这个参数在 Integer 中通常设置为 0,但它的存在可用于格式化目的,确保对呈现效果的控制。
  3. kwargs:

    • 描述:用于传递额外的关键字参数。例如,这些参数可以控制数字的颜色、大小、位置等视觉属性,具体取决于使用中支持的其他参数。
用法示例

当你使用 Integer 类时,可以创建一个简单的整数对象,例如:

number_display = Integer(number=5, num_decimal_places=0) 

这样你就得到了一个显示数字 5 的 Integer 对象,且不会显示任何小数部分。

示例:
python 复制代码
class IntegerExample(Scene):
    def construct(self):
        self.add(Integer(number=2.5).set_color(ORANGE).scale(2.5).set_x(-0.5).set_y(0.8))
        self.add(Integer(number=3.14159, show_ellipsis=True).set_x(3).set_y(3.3).scale(3.14159))
        self.add(Integer(number=42).set_x(2.5).set_y(-2.3).set_color_by_gradient(BLUE, TEAL).scale(1.7))
        self.add(Integer(number=6.28).set_x(-1.5).set_y(-2).set_color(YELLOW).scale(1.4))

3.创建和展示变量

Variable 是 Manim 中用于创建和展示变量的类,能够动态显示数值并与动画中的其他对象互动。以下是对 Variable 函数及其参数的详细解释:

构造函数

Variable(var, label, 
var_type=<class 'manim.mobject.text.numbers.DecimalNumber'>,
 num_decimal_places=2, **kwargs) 

参数解释

  1. var:

    • 类型:floatint
    • 描述:要展示的变量的数值。这个值可以在动画中动态更新,反映变量的当前状态。
  2. label:

    • 类型:str
    • 描述:与变量关联的标签,用于在显示时标识变量的名称。例如,如果 var 是速度,可以将 label 设置为 "v",以更好地理解它所代表的物理量。
  3. var_type:

    • 类型:类(默认为 DecimalNumber
    • 描述:指定要用于显示变量的类型。DecimalNumber 用于显示浮点数,可以使用其他类型(如 Integer)进行替换,以符合具体需求。
  4. num_decimal_places:

    • 类型:int
    • 默认值:2
    • 描述:设置显示的数字的小数位数。这是一个格式化参数,可以根据需要调整,以控制数字的呈现格式。
  5. kwargs:

    • 描述:用于传递额外的关键字参数,类似于 Integer 的用法。可用于控制变量的颜色、字体、大小等视觉属性。

用法示例

创建一个变量显示的实例:

speed = Variable(var=10, label="v",
 var_type=DecimalNumber, num_decimal_places=2) 

这段代码创建了一个名为 speedVariable 对象,显示的初始值为 10,标签为 $v$(速度),使用浮点数格式,并显示两个小数位。

python 复制代码
from manim import *

class VariablesWithValueTracker(Scene):
    def construct(self):
        var = 0.5
        on_screen_var = Variable(var, Text("var"), num_decimal_places=3)
        on_screen_var.label.set_color(RED)
        on_screen_var.value.set_color(GREEN)

        self.play(Write(on_screen_var))
        self.wait()
        var_tracker = on_screen_var.tracker
        var = 10.5
        self.play(var_tracker.animate.set_value(var))
        self.wait()

        int_var = 0
        on_screen_int_var = Variable(
            int_var, Text("int_var"), var_type=Integer
        ).next_to(on_screen_var, DOWN)
        on_screen_int_var.label.set_color(RED)
        on_screen_int_var.value.set_color(GREEN)

        self.play(Write(on_screen_int_var))
        self.wait()
        var_tracker = on_screen_int_var.tracker
        var = 10.5
        self.play(var_tracker.animate.set_value(var))
        self.wait()
        subscript_label_var = 10
        on_screen_subscript_var = Variable(subscript_label_var, "{a}_{i}").next_to(
            on_screen_int_var, DOWN
        )
        self.play(Write(on_screen_subscript_var))
        self.wait()

示例2:

python 复制代码
class VariableExample(Scene):
    def construct(self):
        start = 2.0

        x_var = Variable(start, 'x', num_decimal_places=3)
        sqr_var = Variable(start**2, 'x^4', num_decimal_places=3)
        Group(x_var, sqr_var).arrange(DOWN)

        sqr_var.add_updater(lambda v: v.tracker.set_value(x_var.tracker.get_value()**4))

        self.add(x_var, sqr_var)
        self.play(x_var.tracker.animate.set_value(5), run_time=2, rate_func=linear)
        self.wait(0.1)

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | |
| | |

相关推荐
最爱番茄味几秒前
Python实例之函数基础打卡篇
开发语言·python
程序猿000001号21 分钟前
探索Python的pytest库:简化单元测试的艺术
python·单元测试·pytest
engchina1 小时前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
Dream_Snowar2 小时前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶2 小时前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
汪洪墩2 小时前
【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换
开发语言·javascript·python·ecmascript·webgl·cesium
程序员shen1616114 小时前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
人人人人一样一样4 小时前
作业Python
python
四口鲸鱼爱吃盐4 小时前
Pytorch | 利用VMI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python