manim中文字和目标的对齐方法的使用

news2024/11/16 12:45:31

为什么要文字对齐 ? 

对齐原则在现实生活中无处不在,比如:书籍、货架、地铁座位等等;对齐的目的其实就是在规整文案信息,对齐有利于信息传达以及视觉规范,当我们做文字编排工作时,要根据构图形式选择合理的对齐原则,每种对齐形式所传达的视觉感受也不同:左对齐、右对齐给人以整齐、严谨、划分明显的感受;居中对齐则属于更加活跃、可塑性强;而两端对齐更适用于文本段落,底部对齐以及顶部对齐在做海报时的装饰性文本会用到。

用manim实现字体的对齐

        接下来我们一步一的来,实现文字对齐

第一步:无法对齐,都指向目标的中间点

from manim import *  # 导入manim库,允许我们创建数学动画  

class LinearAlgebraDiagram(Scene):  # 定义一个名为LinearAlgebraDiagram的场景类  
    def construct(self):  # 定义构造函数,创建场景中的元素  
        # 创建中心文本  
        title = Text("Linear Algebra", font_size=48).set_color(WHITE)  # 创建主标题文本,字体大小为48,颜色为白色  
        subtitle = Text("线性代数", font_size=36).next_to(title, DOWN)  # 创建副标题文本,字体大小为36,并将其放置在主标题下方  
        Vt = VGroup(title, subtitle).arrange(DOWN, buff=0.5).shift(LEFT * 3)  # 将标题和副标题组合成一个组,垂直排列,距离为0.5,向左移动3个单位  

        # 创建学科文本  
        subjects = [  # 创建一个包含不同学科的列表  
            Text("Computer science", font_size=36).shift(LEFT * 3 + DOWN * 2),  # 计算机科学  
            Text("Physics", font_size=36).shift(LEFT * 3 + DOWN * 3),  # 物理  
            Text("Electrical engineering", font_size=36).shift(LEFT * 3 + DOWN * 4),  # 电气工程  
            Text("Mechanical engineering", font_size=36).shift(LEFT * 3 + DOWN * 5),  # 机械工程  
            Text("Statistics", font_size=36).shift(LEFT * 3 + DOWN * 6),  # 统计学  
        ]  

        subject_group = VGroup(*subjects).arrange(DOWN, buff=0.5).shift(RIGHT * 3)  # 将所有学科文本组合成一个组,垂直排列,右移3个单位  

        # 创建箭头  
        arrows = []  # 初始化一个空列表以存储箭头  
        for subject in subjects:  # 对于每个学科文本  
            arrow = Arrow(start=title.get_bottom(), end=subject.get_top(), buff=0.1, color=YELLOW)  # 创建箭头,起点为主标题底部,终点为学科文本顶部,颜色为黄色  
            arrows.append(arrow)  # 将箭头添加到列表中  

        # 添加元素到场景中  
        self.play(Write(title), Write(subtitle))  # 播放动画,将主标题和副标题写入场景中  
        self.wait(1)  # 等待1秒  

        for arrow, subject in zip(arrows, subjects):  # 逐个播放箭头和学科文本的动画  
            self.play(Create(arrow), Write(subject))  # 创建箭头和写入学科文本  
            self.wait(0.5)  # 每次动画之间等待0.5秒  

        self.wait(2)  # 最后等待2秒

运行结果: 

代码解释:
  1. 引入库: 最开始,代码导入 manim 库,这是一个用于创建数学和科学可视化动画的Python库。

  2. 创建场景类LinearAlgebraDiagram 继承自 Scene 类。该类包含一个 construct 方法,用于定义场景中的所有元素。

  3. 添加文本元素: 使用 Text 创建主标题和副标题,并通过 VGroup 将它们组合在一起。

  4. 创建学科列表: 列表 subjects 包含多个学科的文本对象,每个对象都有其自身的位置。

  5. 箭头制作: 使用循环为每一个学科创建箭头,从主标题到底部学科文本,并将箭头存储在列表中。

  6. 动画播放: 使用 self.play 和 self.wait 方法添加动态效果,使标题、副标题、学科文本和箭头逐渐出现在动画中。

此代码的最终效果是在一个场景中演示线性代数及其相关学科,使用加载动画显示文本和箭头。

 第二步:对文字

from manim import *  # 导入manim库,允许我们进行数学动画的创建  

class AlignTextExample(Scene):  # 定义一个名为AlignTextExample的场景类,继承自Scene  
    def construct(self):  # 定义构造函数,创建场景中的元素  
        # 创建两个文本  
        title = Text("Linear Algebra", font_size=48).set_color(WHITE)  # 创建主标题文本,字体大小为48,颜色为白色  
        subtitle = Text("线性代数", font_size=48)  # 创建副标题文本,字体大小为48  

        # 将副标题移动到主标题的下方,并且左边对齐  
        subtitle.next_to(title, DOWN, buff=0)  # 将副标题紧挨在主标题下方,垂直对齐  

        # 获取标题和副标题的宽度  
        title_width = title.width  # 获取主标题的宽度  
        subtitle_width = subtitle.width  # 获取副标题的宽度  

        # 计算最大宽度,并根据最大宽度调整文本位置  
        max_width = max(title_width, subtitle_width)  # 计算两个文本中最大的宽度  

        # 将两个文本居左对齐  
        title.shift(LEFT * (max_width - title_width) / 2)  # 将主标题左移,使其与副标题左边对齐  
        subtitle.shift(LEFT * (max_width - subtitle_width) / 2)  # 将副标题左移,使其与主标题左边对齐  

        # 使用VGroup将它们组合  
        texts = VGroup(title, subtitle)  # 将主标题和副标题组合成一个组  

        # 将整个组合居中显示  
        texts.move_to(ORIGIN)  # 将组合的中心移动到原点(屏幕中心)  

        # 将组合添加到场景中  
        self.add(texts)  # 将准备好的文本组合添加到场景中

 运行结果:

注释解释:
  1. from manim import *: 这行引入 manim 库的所有功能,帮助我们生成动画。

  2. class AlignTextExample(Scene):: 定义了一个新的场景类 AlignTextExample,它将展示对齐文本的示例。

  3. def construct(self):construct 方法是定义场景中要展示的内容的地方。

  4. 创建文本: 使用 Text 类创建了主标题(“Linear Algebra”)和副标题(“线性代数”)的文本对象。

  5. 文本对齐: 将副标题放置在主标题的正下方,接着获取两个文本的宽度,以便后面进行对齐。

  6. 宽度计算: 计算出两段文本的最大宽度,在之后的步骤中用来进行对齐。

  7. 位置调整: 根据最大宽度将主标题和副标题的位置调整,使其左边对齐。

  8. 组合文本: 使用 VGroup 将主标题和副标题组合在一起,便于统一操作。

  9. 居中显示: 将组合文本的中心移动到屏幕的中心(原点)。

  10. 添加到场景: 将组合后的文本添加到场景中以显示。

代码整体解释:

        该代码的目的是创建一个包含主标题和副标题的简单场景,并使其左对齐。通过使用宽度计算和位移操作,确保两个文本的左边缘对齐,然后将整个文本组合居中放置在画布上。这种对齐方式在制作动画时很有用,可以确保文本显示的整洁美观。最终,所有内容被添加到场景中,以便在动画播放时展示出来。

manim中self目标的对齐

 第一步,创建主标题和副标题

from manim import *  

class LinearAlgebraDiagram12(Scene):  
    def construct(self):  
        # 创建中心文本  
        title = Text("Linear Algebra", font_size=48).set_color(WHITE)  
        subtitle = Text("线性代数", font_size=48)  
        # 将副标题移动到主标题的下方,并且左边对齐  
        subtitle.next_to(title, DOWN, buff=0)  # 把副标题紧挨在主标题下方    
        # 获取标题和副标题的宽度  
        title_width = title.width  
        subtitle_width = subtitle.width          
        # 计算最大宽度,并根据最大宽度调整文本位置  
        max_width = max(title_width, subtitle_width)  
        # 将两个文本居左对齐  
        
        title.shift(RIGHT * (max_width - title_width) / 2)  
        subtitle.shift(RIGHT * (max_width - subtitle_width) / 2)  
        # 使用VGroup将它们组合  
        texts = VGroup(title, subtitle).shift(3*LEFT) 
        # 将整个组合居中显示   

        # 将组合添加到场景中  
        #self.add(texts)  

        self.play(Write(texts))

        # 创建学科文本  
        subjects = [  
            Text("Computer science", font_size=36).shift(LEFT * 3 + DOWN * 2),  
            Text("Physics", font_size=36).shift(LEFT * 3 + DOWN * 3),  
            Text("Electrical engineering", font_size=36).shift(LEFT * 3 + DOWN * 4),  
            Text("Mechanical engineering", font_size=36).shift(LEFT * 3 + DOWN * 5),  
            Text("Statistics", font_size=36).shift(LEFT * 3 + DOWN * 6),  
        ]  

        subject_group = VGroup(*subjects).arrange(DOWN, buff=0.5).shift(RIGHT * 3)  

        arrow01 = Arrow(start=texts.get_bottom(), end=subtitle.get_top(), buff=0.1, color=YELLOW)  
        
        # 将箭头添加到场景中  
        self.add(arrow01)  

        # 创建箭头  
        arrows = []  
        for subject in subjects:  
            arrow = Arrow(start=texts.get_bottom(), end=subject.get_top(), buff=0.1, color=YELLOW)  
            arrows.append(arrow)  

        # 添加元素到场景中  
        #self.play(Write(title), Write(subtitle))  
        #self.wait(1)  

        for arrow, subject in zip(arrows, subjects):  
            self.play(Create(arrow), Write(subject))  
            self.wait(0.5)  

        self.wait(2)  

# 运行命令: manim -pql your_script.py LinearAlgebraDiagram

运行结果中发现,箭头向量的出发点是主标题的中心点,结束点也是副标题的中心点。这不是我们想要的结果。接下来我们在修改修改 

解释代码

这段代码使用Manim库创建了一个线性代数的动画场景。首先,创建了一个包含主标题和副标题的文本对象,并将副标题放置在主标题的下方。然后计算了主标题和副标题的宽度,并根据最大宽度调整它们的位置,使它们居中显示在屏幕上。

接着创建了一组学科文本对象,并按照一定的顺序排列在主标题和副标题的右侧。然后创建了一个从主标题指向副标题的箭头,并将箭头添加到场景中。接着循环创建了一系列从主标题指向各个学科文本的箭头,并逐步显示每个箭头和对应的学科文本。

第二步:

调整箭头响亮的出发和结束点

from manim import *  

class LinearAlgebraDiagram13(Scene):  
    def construct(self):  
        # 创建中心文本  
        title = Text("Linear Algebra", font_size=42).set_color(WHITE)  
        subtitle = Text("线  性  代  数", font_size=42)  
        
        # 将副标题移动到主标题的下方,并且左边对齐  
        subtitle.next_to(title, DOWN, buff=0)  # 把副标题紧挨在主标题下方    
        
        # 获取标题和副标题的宽度  
        title_width = title.width  
        subtitle_width = subtitle.width          
        # 计算最大宽度,并根据最大宽度调整文本位置  
        max_width = max(title_width, subtitle_width)  
        
        # 计算文本居左对齐的位置  
        title.shift(RIGHT * (max_width - title_width) / 2)  
        subtitle.shift(RIGHT * (max_width - subtitle_width) / 2)  
        
        # 使用VGroup将它们组合并移动整个组合  
        texts = VGroup(title, subtitle).shift(4 * LEFT)  

        self.play(Write(texts))  # 显示文本组合  

        # 创建学科文本  
        subjects = [  
            Text("Computer science", font_size=36),  
            Text("Physics", font_size=36),  
            Text("Electrical engineering", font_size=36),  
            Text("Mechanical engineering", font_size=36),  
            Text("Statistics", font_size=36),  
        ]  
       
        # 将科目文本左对齐并分别位置   
        for i, subject in enumerate(subjects):  
            subject.next_to(texts, DOWN, buff=0.5)  # 将每个学科文本放在文本组合的下方  
            subject.shift(DOWN * (i + 1))  
        
        subject_group = VGroup(*subjects).shift(RIGHT *5+5*UP)  # 将所有学科文本组合一起  
        
        # 创建箭头  
        arrows = []  
        for subject in subjects:  
            arrow = Arrow(start=texts.get_right(), end=subject.get_left(), buff=0.25, color=YELLOW)  
            arrows.append(arrow)  

        # 将箭头添加到场景中  
        for arrow, subject in zip(arrows, subjects):  
            self.play(Create(arrow), Write(subject))  
            self.wait(0.5)  

        self.wait(2)  

 运行结果:

运行结果中我们发现,箭头响亮的起始点正好对齐。但是,副标题没对齐 

解释代码:

        这段代码使用Manim库创建了一个线性代数的动画场景。首先,创建了一个包含主标题和副标题的文本对象,并将副标题放置在主标题的下方。然后计算了主标题和副标题的宽度,找到它们中较大的宽度作为最大宽度,然后调整文本位置使它们居中显示在屏幕左侧。

        接着创建了一组包含不同学科名称的文本对象,并根据索引位置逐个放置在主标题和副标题的下方。然后将所有学科文本组合在一起,并将整个组合向右移动5个单位,向上移动5个单位。

        接下来创建了一系列从主标题向各个学科文本的箭头,每个箭头的起点是主标题的右侧,终点是对应学科文本的左侧,并设置了箭头的样式为黄色。最后,循环逐个显示每个箭头和对应的学科文本,并在每次显示后等待0.5秒,最后等待2秒后动画结束。

 第三步:大功告成

from manim import *  

class LinearAlgebraDiagram114(Scene):  
    def construct(self): 
        self.camera.background_color = "#2F4F14"
        
        #"#ece6e2"
        # 创建中心文本  
        title = Text("Linear Algebra", font_size=42).set_color(WHITE)  
        subtitle = Text("线性代数", font_size=42)         
        # 将副标题移动到主标题的下方,并且左边对齐  
        subtitle.next_to(title, DOWN, buff=0)  # 把副标题紧挨在主标题下方            
        # 获取标题和副标题的宽度  
        title_width = title.width  
        subtitle_width = subtitle.width          
        # 计算最大宽度,并根据最大宽度调整文本位置  
        max_width = max(title_width, subtitle_width)          
        # 计算文本居左对齐的位置  
        title.shift(RIGHT * (max_width - title_width) / 2)  
        subtitle.shift(RIGHT * (max_width - subtitle_width) / 2)          
        # 使用VGroup将它们组合并移动整个组合  
        texts = VGroup(title, subtitle).shift(4.5 * LEFT)  
        self.play(Write(texts))  # 显示文本组合  

        # 创建学科文本  
        subjects = [  
            Text("计算机科学", font_size=36),  
            Text("物理学", font_size=36),  
            Text("电气工程", font_size=36),  
            Text("机械工程", font_size=36),  
            Text("建筑学", font_size=36),
            Text("统计学", font_size=36),
            Text("...等等", font_size=36),
        ]  

        # 将科目文本左对齐并分别定位  
        for i, subject in enumerate(subjects):  
            subject.align_to(texts, RIGHT)  # 左对齐到文本组合的左边  
            subject.next_to(texts, DOWN, buff=0.9 + i * 1).shift(5*UP+8.5*RIGHT)  # 将每个学科文本放在文本组合的下方,增加间隔  
        
        # 获取所有科目文本的最大宽度  
        max_subject_width = max(subject.width for subject in subjects)  

        # 将所有科目文本组合并左对齐  
        for subject in subjects:  
            subject.shift(LEFT * (max_subject_width - subject.width) / 2)  # 左对齐所有科目文本  

        # 创建箭头  
        arrows = []  
        for subject in subjects:  
            arrow = Arrow(start=texts.get_right(), end=subject.get_left(), buff=0.25,stroke_width=2, color=BLUE_A)  
            arrows.append(arrow)  

        # 将箭头添加到场景中  
        for arrow, subject in zip(arrows, subjects):  
            self.play(Create(arrow), Write(subject))  
            self.wait(0.5)  

        self.wait(2)  

# 如果需要运行此代码,请确保在支持的环境中执行。

 运行结果:

我们发现,运行结果和我们想要的结果完美闭合。 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2169032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络 - 基础问题】每日 3 题(二十六)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

基于springboot+vue 旅游网站的设计与实现

基于springbootvue 旅游网站的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c…

【中级通信工程师】终端与业务(五):市场与通信市场

【零基础3天通关中级通信工程师】 终端与业务(五):市场与通信市场 本文是中级通信工程师考试《终端与业务》科目第五章《市场与通信市场》的复习资料和真题汇总。终端与业务是通信考试中最基础的科目之一,复习重点包括通信市场的概念、通信市场结构、以…

【IOS】申请开发者账号(公司)

官网:Apple Developer (简体中文) 申请开发者账号前提 如果是第一次申请建议注册一个新的apple id作为组织的开发者账号。(确保apple id的个人信息是真实的,不能是网名或者是其他名。后续的申请步骤需要能和apple id的个人信息对上。&#…

嵌入式开发 —— IO口高阻态模式

目 录 高阻态输入模式一、区别于浮空输入二、高阻态输入的优点 高阻态输入模式 MCU管脚的高阻态模式是电路的一种输出或输入状态。在这种状态下,电路的输入端或输出端对地或对电源的电阻非常大,在实际应用中与引脚悬空类似。 电气特性 1、高电阻值&…

C#入门教程

目录 1.if分支语句 2.面向对象 3.static简单说明 1.if分支语句 我们的这个C#里面的if语句以及这个if-else语句和C语言里面没有区别,就是打这个输出上面的方式不一样,c#里面使用的是这个console.writeline这个指令,其他的这个判断逻辑都是一…

技术美术百人计划 | 《5.1.3 PBR-基于物理的灯光》笔记

1. 辐射度学 定义:辐射度学是一门以整个电磁波段的电磁辐射能测量为研究的科学。 而计算机图形学中涉及的辐射度学,则集中于整个电磁波普中光学谱段中的可见光谱段的辐射能的计算。 1.1. 立体角 概念:单位球体上的一块区域对应的球面部分的…

计算机毕业设计 中医院问诊系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

uniapp自定义底部tabBar

使用场景&#xff1a;在一个非tabbar页面&#xff0c;想要有底部导航效果&#xff0c;故自定义效果&#xff0c;系统原底部导航栏仍在正常使用 效果&#xff1a; 布局&#xff1a; <template><view class"tab-bar" :style"{height: height px}"…

《征服数据结构》哈夫曼树(Huffman Tree)

摘要&#xff1a; 1&#xff0c;哈夫曼树的介绍 2&#xff0c;哈夫曼树的构造 3&#xff0c;哈夫曼树带权路径长度计算 4&#xff0c;哈夫曼树的编码 5&#xff0c;哈夫曼树的解码 1&#xff0c;哈夫曼树的介绍 哈夫曼树(Huffman Tree)也叫霍夫曼树&#xff0c;或者赫夫曼树&am…

游戏怎么录制?王者荣耀游戏录制指南:iOS与电脑端全面教程

在王者荣耀的战场上&#xff0c;每一个五杀、每一次极限逃生都可能成为你游戏生涯中的高光时刻。但这些瞬间往往转瞬即逝&#xff0c;如何将它们永久保存&#xff0c;成为你游戏历程中不可磨灭的印记呢&#xff1f;本文将为你揭晓答案。无论你是手持iPhone的iOS用户&#xff0c…

正则中捕获组和非捕获组区别

捕获组和非捕获组 一. 捕获组&#xff08;Capturing Groups&#xff09;二. 非捕获组&#xff08;Non-Capturing Groups&#xff09;三. 区别四. 选择使用 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;…

GESP等级考试C++二级-数学函数

C的cmath库中有丰富的数学函数&#xff0c;通过这些函数可以进行相应的数学计算。 1 cmath库的导入 通过import指令导入cmath库&#xff0c;代码如图1所示。 图1 导入cmath库的代码 2 abs()函数 abs()函数用来获取指定数的绝对值&#xff0c;代码如图2所示。 图2 abs()函数…

【递归】7. leetcode 404 左叶子之和

1 题目描述 题目链接&#xff1a;左叶子之和 2 解答思路 递归分为三步&#xff0c;接下来就按照这三步来思考问题 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系…

macOS安装Redis教程, 通过brew命令, 时间是2024年9月26日, redis版本是0.7.2

搜索: brew search redis安装Redis: brew install redis关于启动命令的提示: To start redis now and restart at login:brew services start redis Or, if you dont want/need a background service you can just run:/opt/homebrew/opt/redis/bin/redis-server /opt/home…

【图像处理】多幅不同焦距的同一个物体的平面图象,合成一幅具有立体效果的单幅图像原理(二)

实现多幅不同焦距图像合成一幅具有立体效果的图像可以使用以下算法和开源库&#xff1a; 实现算法 图像对齐 使用特征点匹配&#xff08;如 SIFT、SURF 或 ORB&#xff09;来对齐图像。利用 RANSAC 算法剔除离群点&#xff0c;估计变换矩阵。 深度图生成 基于图像的焦距和视角…

Teams集成-会议侧边栏应用开发-会议转写

Teams应用开发&#xff0c;主要是权限比较麻烦&#xff0c;大量阅读和实践&#xff0c;摸索了几周&#xff0c;才搞明白。现将经验总结如下&#xff1a; 一、目标&#xff1a;开发一个Teams会议的侧边栏应用&#xff0c;实现会议的实时转写。 二、前提&#xff1a; 1&#x…

探索5 大 Node.js 功能

目录 单线程 Node.js 工作线程【Worker Threads】 Node.js 进程 进程缺点 工作线程 注意 集群进程模块【Cluster Process Module】 内部发生了什么&#xff1f; 为什么要使用集群 注意&#xff1a; 应用场景&#xff1a; 内置 HTTP/2 支持 这个 HTTP/2 是什么&…

OpenHarmony(鸿蒙南向)——平台驱动指南【PWM】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 PWM即脉冲宽度调制&#xff08;Pulse Width Modul…

【Linux】部署 flask

文章目录 一、安装Python3环境二、将本地开发环境的依赖项目生成清单文件三、创建虚拟环境启用虚拟环境退出虚拟环境 四、添加自定义系统服务(很重要) 一、安装Python3环境 1.首先安装编译环境(后续需要从python官网获取Python3的源码自己编译python yum install zlib-devel …