manim中获取并定位不规则页面的中心位置

news2024/9/28 11:28:07

介绍中心点

找到中心点非常重要,因为它在多个领域中都有重要的应用和意义。中心点可以指一个几何形状的中心、数据集的平均值中心、或是特定情境下的关键焦点。以下是一些中心点重要性的具体解释:

  1. 数学与几何:在几何中,中心点(例如圆的中心)是形状的对称性和结构的关键。它决定了形状的性质和位置,帮助进行准确的测量与计算。

  2. 数据分析:在统计学中,数据集的中心点(例如平均值、中位数、众数)帮助我们理解数据的集中趋势。找到数据的中心点可以揭示出数据的分布特征,为决策提供依据。

  3. 心理学与社会学:在社会交往和心理学研究中,中心点可以代表群体中的领袖、焦点或者关键人物。他们的存在和决策往往影响整个群体的动态。

  4. 实用应用:在日常生活中,找到中心点有助于更好地组织和安排事务,比如在空间布局、时间管理和资源分配中,中心点的概念能够帮助我们优化流程,提高效率。

总之,找到中心点能够提供方向感、揭示趋势和促进决策,无论是在理论还是实际操作中都具有重要意义。

在页面中获取必要的参数

from manim import *  

class InfiniteLines042(Scene):  
    def construct(self):  
        # 设置背景颜色  
        self.camera.background_color = "#2F4F14"    
        
        # 获取场景的宽度和高度  
        width = config.frame_width  
        height = config.frame_height  

        print(width)  
        print(height)  
        print(UP)  

        # 计算中心线的位置  
        horizontal_center = 0  # 横线的 y 轴位置  
        vertical_center = 0  # 竖线的 x 轴位置  

        # 创建无限虚线横向线和竖向线  
        horizontal_line = Line(start=LEFT * 8, end=RIGHT * 8, color=WHITE).shift(2.8 * UP)  
        vertical_line = Line(start=DOWN * 8, end=UP * 8, color=WHITE)   
        
        # 添加横线和竖线  
        self.add(horizontal_line, vertical_line)  

        # 横线的 y 坐标  
        horizontal_y_coordinate = horizontal_line.get_start()[1]  # 取起始点的 y 坐标  
        print(f"Horizontal line Y coordinate: {horizontal_y_coordinate}")  
        
        # 竖线的 x 坐标  
        vertical_x_coordinate = vertical_line.get_start()[0]  # 取起始点的 x 坐标  
        print(f"Vertical line X coordinate: {vertical_x_coordinate}")  

        # 标记中心点  
        center_point = Dot(point=ORIGIN, color=YELLOW, radius=0.1)  # 中心点  
        self.add(center_point)  

        Cl1=DashedLine(start=LEFT * 8, end=RIGHT * 8, color=WHITE)
        Cl2=DashedLine(start=DOWN * 8, end=UP * 8, color=WHITE)
        self.add(Cl1,Cl2)
        

        # 创建表示宽度和高度的箭头  
        width_arrow1 = Arrow(start=ORIGIN, end=RIGHT * width / 2, color=BLUE,buff=0).shift(2*DOWN)
        width_arrow2 = Arrow(start=ORIGIN, end=-(RIGHT * width / 2), color=BLUE,buff=0).shift(2*DOWN)
        
        height_arrow1 = Arrow(start=ORIGIN, end=UP * height / 2, color=PINK,buff=0).shift(2*RIGHT)
        height_arrow2 = Arrow(start=ORIGIN, end=-(UP * height / 2), color=PINK,buff=0).shift(2*RIGHT)
        
        # 创建箭头旁边的文本  
        width_text = Tex(f"Width: {width:.2f}", color=BLUE).next_to([4,-2,0],2*DOWN)  
        height_text = Tex(f"Height: {height}", color=PINK).next_to([1,1.3,0], RIGHT).rotate(PI/2)

        # 创建表示横线 Y 坐标的箭头  
        y_coordinate_arrow = Arrow(start=ORIGIN, end=2.8 * UP, color=RED,buff=0).shift(2*LEFT)  
        y_coordinate_text = Tex(f"Yh: {horizontal_y_coordinate:.1f}", color=RED).next_to(y_coordinate_arrow, RIGHT).rotate(PI/2)  

        # 添加箭头和文本到场景  
        self.add(width_arrow1, height_arrow1,width_arrow2, height_arrow2, width_text, 
                 height_text, y_coordinate_arrow, y_coordinate_text)  

 

代码核心逻辑和算法解析:

  1. 背景设置

    self.camera.background_color = "#2F4F14" 

    设置场景的背景颜色为深绿色,提供一个视觉上的对比环境。

  2. 获取场景尺寸

    width = config.frame_width height = config.frame_height 

    使用 config.frame_width 和 config.frame_height 获取场景的宽度和高度。这些值将用于箭头的大小和位置。

  3. 绘制中心线

    horizontal_line = Line(start=LEFT * 8, end=RIGHT * 8, color=WHITE).shift(2.8 * UP) 
    vertical_line = Line(start=DOWN * 8, end=UP * 8, color=WHITE) 

    代码创建了两条线段,分别表示水平线和垂直线,水平线的 y 坐标被设置为上移 2.8 个单位。

  4. 获取坐标信息

    horizontal_y_coordinate = horizontal_line.get_start()[1] vertical_x_coordinate = vertical_line.get_start()[0] 

    通过调用 .get_start() 来获取线段的起始点坐标,进而提取 x 和 y 坐标。这个信息可以用于后面的箭头文本标记。

  5. 标记中心点

    center_point = Dot(point=ORIGIN, color=YELLOW, radius=0.1) 

    使用 Dot 在原点位置显示一个中心点。

  6. 创建虚线

    Cl1 = DashedLine(start=LEFT * 8, end=RIGHT * 8, color=WHITE) 
    Cl2 = DashedLine(start=DOWN * 8, end=UP * 8, color=WHITE) 

    这里再次创建虚线用于表示坐标轴,虽然之前已经有了线段,但这更清晰。

  7. 创建箭头

    width_arrow1 = Arrow(start=ORIGIN, end=RIGHT * width / 2, color=BLUE, buff=0).shift(2 * DOWN) 

    这里创建了多个箭头,分别指示页面的宽度和高度。使用 buff=0 表

 对得到的中心点进行应用

#页面分四个,并找到中心位置

from manim import *  

class InfiniteLines089(Scene):  
    def construct(self):  
        # 设置背景颜色  
        self.camera.background_color = "#3B4B51"    
        
        # 获取场景的宽度和高度  
        width = config.frame_width  
        height = config.frame_height

        print(width)
        print(height)
        print(UP)

        

        # 计算中心线的位置  
        horizontal_center = 0  # 横线的 y 轴位置  
        vertical_center = 0  # 竖线的 x 轴位置  

        # 创建无限横向线和竖向线  
        # 创建无限横向线  
        horizontal_line = Line(start=LEFT * 8, end=RIGHT * 8, color=WHITE).shift(2.8 * UP)  
        vertical_line = Line(start=DOWN * 8, end=UP * 8, color=WHITE) 

        # 横线的 y 坐标  
        horizontal_y_coordinate = horizontal_line.get_start()[1]  # 取起始点的 y 坐标  
        print(f"Horizontal line Y coordinate: {horizontal_y_coordinate}")  
        
        # 竖线的 x 坐标  
        vertical_x_coordinate = vertical_line.get_start()[0]  # 取起始点的 x 坐标  
        print(f"Vertical line X coordinate: {vertical_x_coordinate}")

        # 添加线条到场景  
        self.play(Create(horizontal_line))  
        self.play(Create(vertical_line))  

        # 计算每个象限的中心点并绘制圆  
        centers = [(-width / 4,(height/2-horizontal_y_coordinate)/2+horizontal_y_coordinate ),  # 第一象限  
                   (width / 4, (height/2-horizontal_y_coordinate)/2+horizontal_y_coordinate ),  # 第二象限  
                   (-width / 4, (2*horizontal_y_coordinate-height)/4), # 第三象限  
                   (width / 4, (2*horizontal_y_coordinate-height)/4)]  # 第四象限 
        
        shapes = []
#第三个空白位置,# 创建矩阵 A 和 B 的文本表示
        matrix_A = MathTex(r"A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}")
        matrix_B = MathTex(r"B = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix}")
        ab=VGroup(matrix_A,matrix_B).arrange(RIGHT, buff=0.1)
        # 创建矩阵乘法的文本表示
        matrix_product = MathTex(r"A \times B = \begin{bmatrix} 1*5+2*7 & 1*6+2*8 \\ 3*5 + 4*7 & 3*6 + 4*8 \end{bmatrix}")
        ss=MathTex(r"= \begin{bmatrix} 19 & 22 \\ 43 & 50 \end{bmatrix}")
        matrix_product.scale(0.8)
        abn=VGroup(ab,matrix_product,ss).arrange(DOWN,buff=0.75)

# Add arrows# 添加向量和结果的箭头 
        vector_A = Vector([1, 3], color=BLUE)
        vector_B = Vector([2, 1], color=GREEN)
        vector_result = Vector([-3.5, -3.5], color=ORANGE)
        
        arrow_A = Arrow(ORIGIN, vector_A.get_end(), color=BLUE,buff=0)
        arrow_B = Arrow(ORIGIN, vector_B.get_end(), color=GREEN,buff=0)
        arrow_result = Arrow(ORIGIN, vector_result.get_end(), color=ORANGE,buff=0)
        AddAr=VGroup(arrow_A,arrow_B,arrow_result)

#第四个空白位置,坐标轴和响亮的添加
        number_plane = NumberPlane(x_range=(-1, 7, 1),y_range=(-1, 7, 1),x_length=6.6,y_length=6.6,
                            background_line_style={"stroke_color": TEAL,
                                                   "stroke_width": 4,
                                                   "stroke_opacity": 0.6
                                                  }
                                  )


        all4=VGroup(number_plane,AddAr)
        

        object_classes = [Text("数值运算",font_size=44,color=WHITE),    # 椭圆  
                          Text("几何直观",font_size=44,color=WHITE),                       # 星形  
                          abn, # 长方形  
                          all4]  # 六边形  
        
        for (x, y), shape in zip(centers, object_classes):  
            shape.move_to(RIGHT * x + UP * y)  # 移动到中心点  
            shapes.append(shape)  # 添加到形状列表  

        # 添加所有形状到场景  
        for shape in shapes:  
            self.play(Create(shape))  
                   
        

        self.wait(2)  # 保持场景2秒
%manim -qm -v WARNING InfiniteLines089

 运行结果;

        在manim中获取并定位不规则页面的中心位置可以通过一些数学计算和几何原理来实现。首先,需要确定页面的边界或轮廓,可以使用Polygon类或自定义的路径来表示页面的形状。然后,可以通过计算页面的重心或质心来确定页面的中心位置。重心是页面所有点的平均位置,可以通过计算所有点的坐标的平均值来得到。另外,还可以利用页面的边界框来确定中心位置,边界框是包围页面的最小矩形,中心位置即为边界框的中心点。通过这些方法,可以在manim中轻松获取并定位不则页面的中心位置,从而进行后续的动画或布局设计。

绝对中心点和相对中心点

        绝对中心点和相对中心点是描述中心位置的两种概念,通常用于不同的上下文中。以下是这两种中心点的定义和主要区别:

1. 绝对中心点

定义:绝对中心点是指在一个特定的空间或集合中,可以被明确地定义为中心的点。它通常与参考点无关,具有固定的坐标或数值,并且在某种意义上表示该空间或集合的"中心"。

例子

  • 在几何图形中,圆的中心是一个绝对中心点,所有点到圆心的距离都相等。
  • 在二维坐标系中,一个几何形状的重心(如三角形的质心)可以视为其绝对中心点。

2. 相对中心点

定义:相对中心点是基于某种参考框架或其他点的位置来定义的中心。它是相对的,可能会因为观察者的位置或比较对象的变化而改变。

例子

  • 在社会网络中,一个人的影响力可以被视为相对中心点,依赖于他与其他人的关系网络。
  • 在空间布局中,某个区域的中心可能相对于周围建筑或道路的位置而变化。

总结

  • 绝对中心点是固定的、独立于外部因素的中心位置,而相对中心点则是依赖于比较和参考框架的,受到周边环境影响。
  • 理解这两种中心点的概念可以帮助我们在不同的领域中更好地分析和描述数据、现象和空间关系。

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

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

相关文章

jinaai/jina-embeddings-v2-base-zh向量模型报错解决

报错信息 OSError: We couldn’t connect to ‘https://huggingface.co’ to load this file, couldn’t find it in the cached files and it looks like jinaai/jina-bert-implementation is not the path to a directory containing a file named configuration_bert.py. 报…

C++ | Leetcode C++题解之第441题排列硬币

题目: 题解: class Solution { public:int arrangeCoins(int n) {return (int) ((sqrt((long long) 8 * n 1) - 1) / 2);} };

探索Python新境界:funboost库揭秘

文章目录 探索Python新境界:funboost库揭秘背景:为什么选择funboost?funboost是什么?如何安装funboost?简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python新境界:funboost库揭秘 背景&#x…

什么是前缀索引?

什么是前缀索引? 1、什么是前缀索引?2、为什么要使用前缀索引?3、如何选择前缀长度?4、创建前缀索引的SQL语法5、示例 💖The Begin💖点点关注,收藏不迷路💖 在处理包含长字符串的数据…

yolo自动化项目实例解析(七)自建UI--工具栏选项

在上一章我们基本实现了关于预览窗口的显示,现在我们主要完善一下工具栏菜单按键 一、添加工具栏ui 1、配置文件读取 我们后面要改的东西越来越多了,先加个变量文件方便我们后面调用 下面我们使用的config.get意思是从./datas/setting.ini文件中读取关键…

RedisBoost Web缓存加速平台

1.产品介绍 产品名称:RedisBoost Web缓存加速平台 主要功能: 智能缓存策略配置 功能描述:RedisBoost提供了一套直观易用的缓存策略配置界面,允许用户根据业务场景自定义缓存策略,包括缓存时间(TTL)、缓存淘汰算法(如LRU、LFU)、数据分区与分片策略等。支持动态调整策…

SSM私人诊所管理系统—计算机毕业设计源码36406

摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存…

Redis高级特性及应用

一、Redis慢查询 1.1 Redis命令流程 1.2 慢查询配置: 可以通过以下命令配置慢查询时间阈值(慢查询值得是上图中执行命令的时间,不包含其他时间) config set slowlog-log-slower-than 10000 //单位微秒 config rewrite //写入…

【设计模式-访问者模式】

定义 访问者模式(Visitor Pattern)是一种行为型设计模式,允许你在不修改已有类的情况下向这些类添加新的功能或行为。它通过将操作的执行逻辑从对象的类中分离出来,使得你可以在保持类的封闭性(符合开闭原则&#xff…

Leetcode 740. 删除并获得点数

原题链接:. - 力扣(LeetCode) 给你一个整数数组 nums ,你可以对它进行一些操作。 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和…

LeetCode题练习与总结:搜索二维矩阵 Ⅱ--240

一、题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],…

详细解析msyql和消息队列数据一致性问题

目录 前言 保持系统数据同步(双写问题) 消息队列消息丢失的问题 总结 前言 在当今互联网飞速发展的时代,随着业务复杂性的不断增加,消息队列作为一种重要的技术手段,越来越多地被应用于各种场景。它们不仅能有效解…

ChatGPT-o1用来进行数据分析,对比效果很惊人!

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 在进行数据分析的时候,通常有一个场景:我有一批数据,但是不知道该怎么分析,才能找到写论文的突破口和角度。ChatGPT能不能给我一…

Java项目实战II基于Java+Spring Boot+MySQL的厨艺交流平台设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在美食文化…

江协科技STM32学习- P20 实验-TIM编码器接口测速

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

游戏厅计时器ps5计算时间的软件 佳易王电玩计时计费管理系统操作教程

一、前言 游戏厅计时器ps5计算时间的软件 佳易王电玩计时计费管理系统操作教程 软件为绿色免安装版,解压即可使用。 二、软件程序教程 计时的时候,点击 开始计时按钮 开台后可设置定时语音提醒的时间 时间设置好后,点击 开启提醒 即可 三、…

无人机飞手入伍当兵技术优势分析

随着现代战争形态的不断演变,无人机技术在军事领域的应用日益广泛,成为提升军队作战能力的重要手段。对于无人机飞手而言,其专业技能和实战经验在入伍当兵后能够转化为显著的技术优势,为国防事业贡献重要力量。以下是从专业技能优…

“不关心⚠️Warning”的代价:http自动升级https导致免费的存储服务扣费

背景 7 月 12 日的时候我手机突然收到一条短信:显示我在 LeanCloud 平台的账户欠费了。虽然只是欠费 0.01 元,但还是有些疑惑,怎么免费的存储服务突然扣费了? 然而这只是个开始。起初我并没有很在意这扣费的 0.01 元(…

阿里发布Qwen2.5:编程与数学的AI新革命!

阿里发布Qwen2.5:编程与数学的AI新革命! 阿里发布了Qwen2.5系列模型🚀,带来编程和数学领域的超强升级🦸‍♂️。多种规格可选,开源模型推动创新🔓,让AI助手更智能!快来体…

一阶低通滤波器Simulink仿真测试

1、低通滤波器(SMART PLC双线性变化和后向差分对比测试 低通滤波器(SMART PLC双线性变换和后向差分对比测试)_后向差分 和 双线性-CSDN博客文章浏览阅读367次。该博客详细探讨了低通滤波器的设计,对比了SMART PLC中的双线性变换和后向差分法。内容包括Tustin变换公式、后向差…