用 Manim 库来生成一个树形结构的动画

完整代码:

from manim import *  class LargeTreeGeneration01(MovingCameraScene):  DEPTH = 3  CHILDREN_PER_VERTEX = 2  LAYOUT_CONFIG = {"vertex_spacing": (0.8, 1)}  VERTEX_CONF = {"radius": 0.12, "color": BLUE_B, "fill_opacity": 1}  def expand_vertex(self, g, vertex_id: str, depth: int):  new_vertices = [f"{vertex_id}/{i}" for i in range(self.CHILDREN_PER_VERTEX)]  new_edges = [(vertex_id, child_id) for child_id in new_vertices]  g.add_edges(  *new_edges,  vertex_config=self.VERTEX_CONF,  positions={  k: g.vertices[vertex_id].get_center() + 0.1 * DOWN for k in new_vertices  },  )  if depth < self.DEPTH:  for child_id in new_vertices:  self.expand_vertex(g, child_id, depth + 1)  return g  def construct(self):  # 创建一个空的图,只有一个根节点  g = Graph(["ROOT"], [], vertex_config=self.VERTEX_CONF)  # 扩展树结构  g = self.expand_vertex(g, "ROOT", 1)  self.add(g)  # 改变布局,并添加动画  self.play(  g.animate.change_layout(  "tree",  root_vertex="ROOT",  layout_config=self.LAYOUT_CONFIG,  )  )  # 自动缩放相机以适应图形  self.play(self.camera.auto_zoom(g, margin=1), run_time=0.5)  

运行结果:https://download.csdn.net/download/qq_45449625/89591393icon-default.png?t=N7T8https://download.csdn.net/download/qq_45449625/89591393

接下来解释一下代码吧:

 

1. 导入所需库

from manim import * 

这一行导入了 Manim 库的所有内容。Manim 是一个用于制作数学动画的 Python 库。

2. 创建类

class LargeTreeGeneration(MovingCameraScene): 

这个类 LargeTreeGeneration 继承自 MovingCameraSceneMovingCameraScene 提供了相应的方法来控制相机的移动和缩放,适合用于制作动态场景。

3. 定义类属性

DEPTH = 4 CHILDREN_PER_VERTEX = 3 LAYOUT_CONFIG = {"vertex_spacing": (0.5, 1)} VERTEX_CONF = {"radius": 0.12, "color": BLUE_B, "fill_opacity": 1} 
  • DEPTH:指树的深度(最深的层级)。
  • CHILDREN_PER_VERTEX:每个节点的子节点数量。
  • LAYOUT_CONFIG:布局配置,控制节点间的垂直和水平间距。
  • VERTEX_CONF:节点的属性配置,包括半径、颜色和填充透明度。

4. 扩展树的节点

def expand_vertex(self, g, vertex_id: str, depth: int): 

这个方法用于递归地生成树的节点和连接。

  • g:当前的图形对象。
  • vertex_id:当前节点的 ID。
  • depth:当前的深度,始于1。
方法内的逻辑:
new_vertices = [f"{vertex_id}/{i}" for i in range(self.CHILDREN_PER_VERTEX)] 

根据当前节点 ID 生成子节点的 ID。

new_edges = [(vertex_id, child_id) for child_id in new_vertices] 

创建从当前节点到所有子节点的边。

g.add_edges( *new_edges, vertex_config=self.VERTEX_CONF, positions={ k: g.vertices[vertex_id].get_center() + 0.1 * DOWN for k in new_vertices }, ) 

将这些边添加到图形对象中,同时为新节点设置位置和配置。

if depth < self.DEPTH: for child_id in new_vertices: self.expand_vertex(g, child_id, depth + 1) 

如果当前深度小于指定的深度,则递归调用自己,为每个新子节点继续生成其子节点。

5. 构建场景

def construct(self): 

这是 Manim 中用来生成场景的主要方法。

g = Graph(["ROOT"], [], vertex_config=self.VERTEX_CONF) 

创建一个图形,从一个根节点("ROOT")开始,且没有初始边。

g = self.expand_vertex(g, "ROOT", 1) 

调用 expand_vertex 方法,扩展整个图形。

self.add(g) 

将图形添加到当前场景中。

6. 动画效果

self.play( g.animate.change_layout( "tree", root_vertex="ROOT", layout_config=self.LAYOUT_CONFIG, ) ) 

使用 g.animate.change_layout 方法将图形转换为树形布局,并在动画中展示。

self.play(self.camera.auto_zoom(g, margin=1), run_time=0.5) 

将相机自动缩放,以适应整个图形,并在0.5秒内完成该动作。

7. 运行代码

最后一行

%manim -qm -v WARNING LargeTreeGeneration 

是用来在 Jupyter Notebook 中运行这个场景的命令,它会编译并展示动画。

总结

整体来看,这段代码使用了递归方法生成功能强大的树形结构,同时通过相机动画使得最终的展示更加生动。设计上颇具灵活性,可通过调整 DEPTH 和 CHILDREN_PER_VERTEX 属性轻松实现不同规模的树。

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

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

相关文章

java基础概念05-运算符

一、自增自减运算符 二、赋值运算符 2-1、注意 三、关系运算符 四、逻辑运算符 4-1、短路逻辑运算符 五、三元运算符 六、运算符的优先级

Catalyst优化器:让你的Spark SQL查询提速10倍

目录 1 逻辑优化阶段 2.1 逻辑计划解析 2.2 逻辑计划优化 2.2.1 Catalys的优化过程 2.2.2 Cache Manager优化 2 物理优化阶段 2.1 优化 Spark Plan 2.1.1 Catalyst 的 Join 策略 2.1.2 如何决定选择哪一种 Join 策略 2.2 Physical Plan 2.2.1 EnsureRequirements 规则 3 相关文…

Linux基本用法(上)

1.计算机主要由 硬件和软件 组成 2.操作系统是什么 ? 有什么作用&#xff1f; 操作系统是软件的一类 主要作用是协助用户调度硬件工作&#xff0c;充当用户和计算机之间的桥梁 3.常见的操作系统有哪些? PC端: Windows&#xff0c;Linux,MacOS 移动端: Android&#xff…

搭建cool-admin-java(前端vue)项目

为什么选择 Cool Admin&#xff1f;​ 随着技术不断地发展&#xff0c;特别是最近 Ai 相关的技术发展&#xff0c;以往的框架已经越来越不能满足现代化的开发需求。 Cool Admin 做为后来者有后发优势&#xff0c;主要特点&#xff1a; Ai 编码&#xff0c;从页面到后端代码&…

数据库实验:SQL Server创建数据库及基本表

一、实验目的&#xff1a; 1、掌握使用SQL SERVER Management Studio工具连接数据库引擎&#xff1b; 2、掌握使用CREATE TABLE 创建基本表的用法&#xff1b; 3、掌握使用ALTER TABLE 修改基本表的用法&#xff1b; 4、掌握使用DROP TABLE删除基本表的用法&#xff1b; 二…

姜夔,师法自然的不仕道人

姜夔&#xff08;ku&#xff09;&#xff0c;字尧章&#xff0c;号白石道人&#xff0c;约生于南宋绍兴二十四年&#xff08;公元1154年&#xff09;&#xff0c;卒于南宋嘉定十四年&#xff08;公元1221年&#xff09;&#xff0c;享年67岁。他的艺术成就涵盖了诗词、散文、书…

Rpi Zero W做的老头乐声控灯

祭图__|\0>历经各种尝试&#xff0c;最后选了docker 里装个rhasspy&#xff0c;配上paho-mqtt搞出了这个奇葩夜灯。各种曲折就不说了&#xff0c;直接分享捷径思路。 这个绿板子是respeaker hat with 2 mic 用的是seeed-voicecard&#xff0c;跟着github编译&#xff0c;不…

微信小程序开发(百货商战)实战项目的购物车和个人中心的创建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

玩转usbserver之usbserver日志报警

一、graylog 介绍 graylog是一个简单易用、功能较全面的日志管理工具&#xff0c;graylog也采用Elasticsearch作为存储和索引以保障性能&#xff0c;MongoDB用来存储少量的自身配置信息&#xff0c;master-node模式具有很好的扩展性&#xff0c;UI上自带的基础查询与分析功能比…

JAVAWeb实战(后端篇)

因为前后端代码内容过多&#xff0c;这篇只写后端的代码&#xff0c;前端的在另一篇写 项目实战一&#xff1a; 1.创建数据库,表等数据 创建数据库 create database schedule_system 创建表&#xff0c;并添加内容 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------…

向日葵RCE复现(CNVD-2022-10270/CNVD-2022-03672)

一、环境 1.1 网上下载低版本的向日葵<2022 二、开始复现 2.1 在目标主机上打开旧版向日葵 2.2 首先打开nmap扫描向日葵主机端口 2.3 在浏览器中访问ip端口号cgi-bin/rpc?actionverify-haras &#xff08;端口号&#xff1a;每一个都尝试&#xff0c;直到获取到session值…

动手学深度学习V2每日笔记(权重衰退+Dropout)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1UK4y1o7dy/vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&#xff0c;内容不会特别严谨仅供参考。 1.函数目录…

科普文:万字详解Kafka基本原理和应用

一、Kafka 简介 1. 消息引擎系统ABC Apache Kafka是一款开源的消息引擎系统&#xff0c;也是一个分布式流处理平台。除此之外&#xff0c;Kafka还能够被用作分布式存储系统&#xff08;极少&#xff09;。 A. 常见的两种消息引擎系统传输协议&#xff08;即用什么方式把消息…

【机器学习】探索图神经网络 (GNNs): 揭秘图结构数据处理的未来

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ ​ &#x1f48e;1. 引言 图结构数据在现实世界中无处不在&#xff0c;从社交网络中的用户关系&#xff0c;到推荐系统中的用户-物品交互&#xff0c;再到生物信息学中的分子结构。传统的机器学习模型在处理这些数据时常常力…

【Unity插件】Editor Console Pro:提升开发效率的神器

在 Unity 开发过程中&#xff0c;控制台&#xff08;Console&#xff09;是我们排查错误、获取信息的重要窗口。而 Editor Console Pro 则是 Unity 编辑器控制台的强大替代品&#xff0c;为 Unity 的控制台带来了更多实用的功能和改进&#xff0c;极大地提升了开发效率。 一、…

力扣刷题----42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xf…

TCP程序设计

TCP概述 建立连接 客户端和服务器端在建立连接时&#xff1a; 服务端是典型的监听接受连接的模式&#xff0c;就是ListenAccept 客户端是主动建立连接的模式&#xff0c;就是Dial Go语言中使用 net包实现网络的相关操作&#xff0c;包括我们TCP的操作。 用于建立连接的典型…

【JavaEE】阻塞队列

目录 一.阻塞队列(Blocking Queue) 1.什么是阻塞队列 2.特性 二.生产者消费者模型 1.什么是生产者消费者模型&#xff1f; 2.生产者消费模型的好处 2.1解耦合 2.2削峰填谷 三.如何在java中使用阻塞队列 四.模拟实现阻塞队列 1.加锁 2.阻塞等待实现 3.解决interru…

学习c语言第十三天(结构体)

一.结构体声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 描述复杂对象。 结构体成员可以是标量、数组、指针、结构体。 定义和初始化&#xff1a; struct peo {char namer[20];char tele[12];char sex[5];int high; }; s…

git 迁移仓库的方法

git Git是一个开源的分布式版本控制系统&#xff0c;由Linus Torvalds在2005年创建&#xff0c;用于有效、高速地处理从小到大的项目管理。它最初是为Linux内核开发而设计的&#xff0c;但很快被广泛用于各种项目。 以下是Git的一些主要特性&#xff1a; 分布式架构&#xff…