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)

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

相关推荐
博观而约取27 分钟前
Django ORM 1. 创建模型(Model)
数据库·python·django
精灵vector2 小时前
构建专家级SQL Agent交互
python·aigc·ai编程
Zonda要好好学习2 小时前
Python入门Day2
开发语言·python
Vertira2 小时前
pdf 合并 python实现(已解决)
前端·python·pdf
太凉2 小时前
Python之 sorted() 函数的基本语法
python
项目題供诗2 小时前
黑马python(二十四)
开发语言·python
晓13133 小时前
OpenCV篇——项目(二)OCR文档扫描
人工智能·python·opencv·pycharm·ocr
是小王同学啊~3 小时前
(LangChain)RAG系统链路向量检索器之Retrievers(五)
python·算法·langchain
AIGC包拥它3 小时前
提示技术系列——链式提示
人工智能·python·langchain·prompt
孟陬3 小时前
Python matplotlib 如何**同时**展示正文和 emoji
python