用Manim在图形和坐标轴上画线条

news2024/9/22 9:37:03

 用Manim在图形和坐标轴上画线条

.画图像函数的切线

angle_of_tangent(x, graph, dx=1e-08)

angle_of_tangent(x, graph, dx=1e-08)是 Manim 中用于计算图形在给定点的切线角度的函数。以下是对该函数参数的解释:

参数说明

  1. x:

    • 这是你想要计算切线角度的 x 坐标。在这个坐标处,函数会计算函数图形的切线。
  2. graph:

    • 这是一个函数图形对象,通常是通过 Axes 类的 plot 方法生成的。这个图形对象是你希望找出切线的曲线。
  3. dx (默认值为 1e-08):

    • 这是一个很小的数值,用于计算斜率。dx 在这里表示一个非常小的增量。通过在 x 的坐标上增加和减少 dx,可以通过有限差分法来计算在该点的导数(切线的斜率)。具体来说,它会使用公式:

slope=\frac{ f(x+dx)−f(x−dx)}{2⋅dx}

  • 这个方法可以有效地给出 x 处的斜率,从而帮助计算出切线的角度。

返回值

  • 该函数会计算并返回切线的角度,通常用弧度表示,可以在图形的画图和动画中使用,以展示切线在给定点的方向。

示例: 

from manim import *  
import numpy as np  

class ParabolaTangentWithAxes000(Scene):  
    def construct(self): 
        # 创建坐标轴  
        ax = Axes(  
            x_range=[-5, 5, 1],  
            y_range=[-1, 13, 1],  
            axis_config={"color": BLUE},  
        )  
        
        # 定义抛物线曲线  
        curve = ax.plot(lambda x: x**2, color=GREEN)  
        # 添加坐标轴和抛物线到场景中  
        self.add(ax, curve)   
        # 设置切线的 x 坐标  
        x_value = 1.5  
        # 计算切线的斜率  
        slope = self.derivative(x_value)  
        # 获取抛物线上的点  
        y_point = x_value**2  
        # 创建切线  
        tangent_line = self.create_tangent_line(ax, x_value, y_point, slope)  
        # 添加切线到场景中  
        self.add(tangent_line)  

    def derivative(self, x):  
        # y = x^2 的导数是 2x  
        return 2* x  

    def create_tangent_line(self, ax, x, y, slope):  
        # 设置切线的起点和终点  
        x_offset = 2  
        start_x = x - x_offset  
        end_x = x + x_offset  

        # 计算切线在起点和终点的 y 坐标  
        start_y = y + slope * (start_x - x)  
        end_y = y + slope * (end_x - x)  

        # 转换为坐标系坐标  
        start_point = ax.c2p(start_x, start_y)  
        end_point = ax.c2p(end_x, end_y)  

        # 创建并返回切线  
        return Line(start_point, end_point, color=RED)  

 运行结果:

示例2:

from manim import *  
import numpy as np  

class ParabolaTangentWithAxes000(Scene):  
    def construct(self): 
        # 创建坐标轴  
        ax = Axes(  
            x_range=[-5, 5, 1],  
            y_range=[-1, 13, 1],  
            axis_config={"color": BLUE},  
        )  
        
        # 定义抛物线曲线  
        curve = ax.plot(lambda x: x**3, color=GREEN)  
        # 添加坐标轴和抛物线到场景中  
        self.add(ax, curve)   
        # 设置切线的 x 坐标  
        x_value = 1 
        # 计算切线的斜率  
        slope = self.derivative(x_value)  
        # 获取抛物线上的点  
        y_point = x_value**2  
        # 创建切线  
        tangent_line = self.create_tangent_line(ax, x_value, y_point, slope)  
        # 添加切线到场景中  
        self.add(tangent_line)  

    def derivative(self, x):  
        # y = x^2 的导数是 2x  
        return 3* x**2  

    def create_tangent_line(self, ax, x, y, slope):  
        # 设置切线的起点和终点  
        x_offset = 2  
        start_x = x - x_offset  
        end_x = x + x_offset  

        # 计算切线在起点和终点的 y 坐标  
        start_y = y + slope * (start_x - x)  
        end_y = y + slope * (end_x - x)  

        # 转换为坐标系坐标  
        start_point = ax.c2p(start_x, start_y)  
        end_point = ax.c2p(end_x, end_y)  

        # 创建并返回切线  
        return Line(start_point, end_point, color=RED)  

运行结果:

 

c2p(*coords)

    c2p(*coords) 是 Manim 中的一个函数,用于将给定的坐标转换为可绘制的点,通常用于在 2D 或 3D 场景中定位对象。

参数解释

  • coords:
    • 这是一个或多个坐标,可以是以下类型之一:
      • float: 单个浮点数,表示一个坐标。
      • Sequence[float]: 一个序列(如列表或元组),表示一组坐标。对于 2D 场景,通常包含两个值(x 和 y),对于 3D 场景,则通常包含三个值(x、y 和 z)。
      • Sequence[Sequence[float]]: 多个序列的序列,每个序列表示一组坐标。例如,多个点的坐标。
      • ndarray: NumPy 数组,表示坐标点的集合。

返回类型

  • 返回类型是 numpy.ndarray,这是经过转换后的坐标,将其转换为可用于在场景中绘制的格式。

示例:

from manim import *  

class C2PExample(Scene):  
    def construct(self):  
        # 创建一个 Axes 对象,用于绘制坐标系  
        axes = Axes(x_range=[-5, 5], y_range=[-5, 5], axis_config={"color": BLUE})  

        # 使用 c2p 转换坐标  
        point_coords = (3, 2)  # x = 3, y = 2  
        point_location = axes.c2p(*point_coords)  # 转换坐标  

        # 创建一个点  
        self.play(Create(axes))  
        point = Dot(point_location, color=YELLOW)  

        # 添加坐标轴和点到场景中  
        self.play(Create(axes))  
        self.play(Create(point))  

        # 添加文本说明  
        label = MathTex("Point (3, 2)").next_to(point, DR)  
        self.play(Write(label))  

        self.wait(2)

运行结果:

 

 get_T_label 

         get_T_label是 Manim 中的一个函数,其作用是为给定的函数图形上的某个 x 坐标生成切线标记(T-label)和辅助线,这在可视化数学函数时非常有用。这个函数通常会返回一个切线的显示和一个标签,帮助观众理解导数和切线的概念。

参数解释

  • x_val:

    • 给定的 x 坐标,函数在该坐标处计算对应的 y 值,并生成切线。
  • graph:

    • 要分析的图形对象,通常是一个 Graph 类的实例,表示某个数学函数的图像。
  • label (可选):

    • 用于切线的文本标签,若不提供则默认为 None。
  • label_color (可选):

    • 标签文本的颜色,若不提供则默认为 None,使用默认颜色。
  • triangle_size (可选):

    • 三角形的大小,通常用于在切线标记上显示方向。
  • triangle_color (可选):

    • 三角形的颜色,默认为白色(ManimColor('#FFFFFF'))。
  • line_func (可选):

    • http://t.csdnimg.cn/cCLM7icon-default.png?t=N7T8http://t.csdnimg.cn/cCLM7

      自定义的线条类,默认为 Manim 的 Line 类。这允许您使用不同的线条样式。
  • line_color (可选):

    • 辅助线的颜色,默认为黄色(ManimColor('#FFFF00'))。

返回类型

该函数返回一个包含切线和标签的 Mobject 对象,便于在场景中添加。

 示例:

class TLabelExample(Scene):
    def construct(self):
        # defines the axes and linear function
        axes = Axes(x_range=[-1, 10], y_range=[-1, 10], x_length=9, y_length=6)
        func = axes.plot(lambda x: x**2, color=BLUE)
        # creates the T_label
        t_label = axes.get_T_label(x_val=2, graph=func, triangle_size=0.5,
                                   line_func=DashedLine,line_color=RED,label=Tex("x-V1"))
        t_label02 = axes.get_T_label(x_val=3, graph=func,line_func=Arrow,label=Tex("xV2"))
        self.add(axes, func, t_label,t_label02)

 运行结果:

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

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

相关文章

C++进阶之C++11

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 C进阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.列表初始化 1.1一切皆可用列表初始化 1.2init…

代码随想录 day 29 贪心

第八章 贪心算法 part03 134. 加油站 本题有点难度,不太好想,推荐大家熟悉一下方法二 https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html 135. 分发糖果 本题涉及到一个思想,就是想处理好一边再处理另一边,不…

MySQL基础操作全攻略:增删改查实用指南(上)

本节目标: CRUD : Create, Retrieve , Update , Delete 新增数据 查询数据 修改数据 删除数据 1. CRUD 注释:在 SQL 中可以使用 “-- 空格 描述 ” 来表示注释说明 CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、…

什么是 IDR —— Linux 内核中的一种整数管理机制

文章目录 1 什么是 IDR1.1 IDR 的设计目的 2 IDR 的结构和实现2.1 核心数据结构2.2 常用操作2.2.1 分配 ID2.2.2 查找指针2.2.3 删除映射 2.3 IDR 的优点 3 Linux 内核中的整数 ID3.1 作用3.2 常见的整数 ID 示例 4 为什么要将整数 ID 与指针关联4.1 举例说明4.2 好处4.3 示例代…

学习笔记-Cookie、Session、JWT

目录 一、验证码的生成与校验 1. 创建生成验证码的工具类 2. 写一个 Controller 3. 实现验证码验证 1. 获取验证码 2. 验证码请求过程 3. 验证码的校验 4. 原理说明 5. 验证 6. 总结 二、JWT登录鉴权 1. 为什么要做登录鉴权? 2. 什么是 JWT 3. JWT相比…

MATLAB优化模型(2)

一、前言 在MATLAB中实现动态规划、图论、网络流模型(如最短路、最大流、最小生成树)的优化模型,可以通过多种方法完成,但通常会依赖于MATLAB内置的函数或工具箱,比如Optimization Toolbox、Graph Theory Toolbox等。以…

Python 实现股票指标计算——SKDJ

SKDJ (Stochastic KDJ) - 慢速随机指标 1 公式 LOWV:LLV(LOW,N); HIGHV:HHV(HIGH,N); RSV:EMA((CLOSE-LOWV)/(HIGHV-LOWV)*100,M); K:EMA(RSV,M); D:MA(K,M); 2 数据准备 我们以科创50指数 000688 为例,指数开始日期为2019-12-31,数据格式如下&#…

Leetcode 第 135 场双周赛题解

Leetcode 第 135 场双周赛题解 Leetcode 第 135 场双周赛题解题目1:3222. 求出硬币游戏的赢家思路代码复杂度分析 题目2:3223. 操作后字符串的最短长度思路代码复杂度分析 题目3:3224. 使差值相等的最少数组改动次数思路代码复杂度分析 题目4…

SQL注入 报错注入、文件上传、布尔盲注、时间盲注

第7关 文件上传 ---面试官常问 1、MySQL上传shell的满足条件 如果面试官问你如何通过MySQL向网站上传一个shell脚本或者其他语言的一些脚本 ---就可以通过outfile导出的方式进行上传; outfile导出的前提条件:1、必须知道网站的物理路径&#xf…

Java每日一练_模拟面试题2(循环依赖)

一、啥事Spring里面的循环依赖 SpringBoot 循环依赖通常发生在两个或多个Bean相互依赖对方时,例如:A依赖B,同时B也依赖A。 二、如何解决? 解决方案: 构造器注入:如果循环依赖发生在构造器中,S…

[YashanDB认证]YashanDB个人版安装

为什么选择YashanDB? 崖山数据库系统YashanDB是深圳计算科学研究院完全自主研发设计的新型数据库系统,经工信部下属机构权威检测,内核代码自主率100%。在经典数据库理论基础上,融入原创的有界计算理论、近似计算理论、并行可扩展理论和跨模融…

Taro学习记录(具体项目实践)

一、安装taro-cli 二、项目文件 三、项目搭建 1、Eslint配置 在项目生成的 .eslintrc 中进行配置 {"extends": ["taro/react"], //一个配置文件,可以被基础配置中的已启用的规则继承"parser": "babel/eslint-parser…

荒原之梦考研:专科考研成功的可能性大吗?

专科还是本科不是决定考研能否成功的关键因素,决定考研能否成功的关键因素是自己是否有清晰的规划、是否有足够的专注能力,以及是否能够吃得了考研的“苦”。 首先要有清晰的规划,比如说,不是我们每个人足够努力就都能考上 TOP1 …

electron-updater实现electron全量更新和增量更新——主进程部分

同学们可以私信我加入学习群! 正文开始 前言更新功能所有文章汇总一、更新插件选择二、在main.js中引入我们的更新模块三、更新模块UpdateController.js暴露的方法checkUpdate四、更新模块UpdateController.js中的监听4.1监听是否有新版本需要更新?4.2 监…

红黑树与平衡二叉树的相同之处与不同之处

红黑树很多资料上写的非常繁杂,初次接触真的难以理解。写本文也就是为了记录一些思考和想法,并不会记录如何使用代码实现。 不记录代码还有个原因:黑红树的算法就是根据各种情况进行一些操作,情况很复杂,分插入的和删…

数据结构 二叉树和堆总结

树 概念 树是一种层次结构非线性的数据结构,其是由节点和边组成,可以用来表示层次关系的数据。 树的相关概念 节点:树的基本组成单位,每个节点都包含数据,同时与其他节点相互连接根节点:树的顶层节点&…

SpringBoot_第十一章(Thymeleaf模板引擎)

目录 1:什么是Thymeleaf模板引擎 2:springboot怎使用Thymeleaf 2.1:导入pom文件 2.2:查看ThymeleafAutoConfiguration 3:Thymeleaf核心语法 4:使用Thymeleaf 5:具体语法练习 1&#xff1a…

数据集划分方法

数据集划分是机器学习和数据科学中的一个重要步骤,主要目的是为了确保模型的有效性和可靠性。 留出法(简单交叉验证) 将数据集划分为互斥的子集:训练集和测试集。 训练集: 用于训练模型。 测试集: 用于评估模型的性能和验证其准确…

图神经网络揭秘:视觉和实用指南

目录 一、说明 二、图如何网络化? 三、你需要知道的 3.1 进入图神经网络 3.2 消息传递 3.3 我们如何处理最终的向量表示? 四、图神经网络,总结 4.1 为什么选择图形神经网络? 4.2 简而言之 一、说明 了解图神经网络的世界&#xff…

C#中投影运算的深入解析与实例应用

文章目录 1、投影运算的基本语法2、投影运算的高级用法3、投影运算在向量空间中的运用4、投影运算在数据库和XML中的实际应用5、投影运算能用于哪些实际场景?6、结论 在C#编程中,投影运算是一种常用的数据操作技术,它可以将一个数据集合转换成…