【Manim】用manim描述二次曲面——上

二次曲面是可以化为一般形式的任意方程的图形

A{x^2} + B{y^2} + C{z^2} + Dxy + Exz + Fyz + Gx + Hy + Iz + J = 0 这里面A,...,J是常数。我们不可能把它们都列出来,但是有一些标准方程所以这里是一些更常见的二次曲面的列表。

1. 椭球体

这是椭球体的一般方程。\frac{x^2}{a^2} + \frac{y^2}{b^2} + \frac{z^2}{c^2} = 1

这是一个典型椭球体的草图。

接下来我们用Manim实现该椭球体的绘制。

示例代码:

from manim import *  # 导入 Manim 的所有模块和类  class EllipsoidScene(ThreeDScene):  # 定义一个名为 EllipsoidScene 的 3D 场景类  def construct(self):  # 定义构造方法  self.camera.background_color = WHITE  # 设置相机背景颜色为白色  # 设置椭球体的参数  a, b, c = 1.5, 3.5, 1  # a, b, c 分别是椭球体的半径参数  # 使用参数方程创建椭球体  ellipsoid = Surface(  lambda u, v: np.array([  a * np.cos(u) * np.sin(v),  # x 坐标  b * np.sin(u) * np.sin(v),  # y 坐标  c * np.cos(v)                # z 坐标  ]),  u_range=[0, TAU],  # 参数 u 的范围为 0 到 2π  v_range=[0, 2*PI],  # 参数 v 的范围为 0 到 2π  resolution=(24, 48),  # 设置网格分辨率  )  # 设置椭球体的样式:填充颜色为红色,填充透明度为1,轮廓颜色为白色  ellipsoid.set_style(fill_color=(RED, RED_E), fill_opacity=1, stroke_color=WHITE)  # 在椭球体的表面上添加平行线  for v in np.linspace(-PI/2, PI/2, 5):  # 在 v 的范围内均匀分布5个值  line = Line(  start=np.array([a * np.cos(0) * np.sin(v), b * np.sin(0) * np.sin(v), c * np.cos(v)]),  end=np.array([a * np.cos(TAU) * np.sin(v), b * np.sin(TAU) * np.sin(v), c * np.cos(v)])  )  line.set_color(WHITE)  # 将线的颜色设置为白色  line.set_stroke(width=1.5)  # 设置线的宽度  self.add(line)  # 将线添加到场景中  # 将椭球体添加到场景中  self.add(ellipsoid)  # 添加坐标轴  axes = ThreeDAxes().set_color(BLACK)  # 创建坐标轴,并设置颜色为黑色  self.add(axes)  # 将坐标轴添加到场景中  # 为坐标轴添加标签  x_label = MathTex("X").next_to(axes.x_axis.get_end(), RIGHT).set_color(BLACK)   y_label = MathTex("Y").next_to(axes.y_axis.get_end(), UP).set_color(BLACK)  z_label = MathTex("Z").next_to(axes.z_axis.get_end(), RIGHT).set_color(BLACK)  self.add(x_label, y_label, z_label)  # 将标签添加到场景中  # 设置相机的旋转角度,以更好地查看椭球体  self.set_camera_orientation(phi=75 * DEGREES, theta=45 * DEGREES)  # self.set_camera_orientation(pitch=75 * DEGREES, yaw=145 * DEGREES, roll=130 * DEGREES)  # 这一行是备用的相机设置  # self.play( Rotate(ellipsoid, angle=-135 * DEGREES, axis=UP), run_time=2 )  # 为椭球体添加旋转动画  # self.wait(2)  # 等待2秒  # 运行此代码的命令为: manim -pql your_file.py EllipsoidScene  # 不要删除下面的命令,以使运行按钮正常工作  
%manim -qm -v WARNING EllipsoidScene

运行结果: 

代码解释

  1. 导入库:代码开始时导入了 manim 包,这是一个用于创建数学动画的 Python 库。

  2. 类定义

    • EllipsoidScene 继承自 ThreeDScene,是一个用于创建 3D 动画的场景类。
  3. 构造方法

    • construct 方法是用于构建场景的主要方法,包含了所有的绘制和动画逻辑。
  4. 设置背景和椭球体参数

    • 背景颜色被设置为白色,椭球体的三个半径参数 abc 定义了其形状和大小。
  5. 创建椭球体

    • 使用参数方程创建椭球体 ellipsoid,在给定的参数范围内生成表面。u 和 v 控制椭球体的各个方向。
  6. 添加平行线

    • 在椭球体的表面上添加几条平行线,以增强视觉效果。np.linspace 用于确定每条线的 v 值。
  7. 添加椭球体和坐标轴

    • 椭球体和黑色坐标轴被添加到场景中,并且为每个坐标轴添加了相应的标签(X、Y、Z)。
  8. 设置相机角度

    • 使用set_camera_orientation 设置相机的角度,从特定的视角观察椭球体。
  9. 注释和备用代码

    • 其中有几行代码被注释掉,可以通过解注释来执行动画或更改相机设置。

如果  a= b= c然后我们得到一个球体。

注意,我们只给出了以原点为中心的椭球的方程。显然椭球不必以原点为中心。然而,为了使本节的讨论更容易一些,我们选择以某种方式集中在原点“居中”的表面上。

2.圆锥体

  

这是圆锥体的方程 。

这是一个典型锥体的草图。

 示例代码

from manim import *  class ConeScene(ThreeDScene):  def construct(self):  # 设置背景颜色为白色  self.camera.background_color = WHITE  # 设置圆锥体的参数  a, b, c = 1.5, 1.5, 1.5  # 这里我定义了一个适合的 c 值用于圆锥体  # 创建圆锥体,使用参数方程  cone = Surface(  lambda u, v: np.array([  a * v * np.cos(u),  # x 轴坐标  b * v * np.sin(u),  # y 轴坐标  c * v                # z 轴坐标  ]),  u_range=[0, TAU],  # u 的范围从 0 到 2π  v_range=[1, -1],   # v 的范围从 1 到 -1 (表示从尖端到底部)  resolution=(24, 48),  )  # 设置圆锥体的样式  cone.set_style(fill_color=(DARK_BROWN, PINK), fill_opacity=0.55, stroke_color=YELLOW)  # 在圆锥体的表面添加平行线  for v in np.linspace(0, 1, 5):  # 在 v 的范围内均匀分布5个线段  line = Line(  start=np.array([a * 0 * np.cos(0), b * 0 * np.sin(0), c * 0]),  # 尖端位置  end=np.array([a * v * np.cos(TAU), b * v * np.sin(TAU), c * v])  # 底部边缘位置  )  line.set_color(BLUE_E)  # 设置线的颜色为蓝色  line.set_stroke(width=1)  # 设置线宽  self.add(line)  # 添加线到场景  # 将圆锥体添加到场景  self.add(cone)  # 添加三维坐标轴  axes = ThreeDAxes().set_color(BLACK)   self.add(axes)  # 给坐标轴添加标签  x_label = MathTex("X").next_to(axes.x_axis.get_end(), RIGHT).set_color(BLACK)   y_label = MathTex("Y").next_to(axes.y_axis.get_end(), UP).set_color(BLACK)  z_label = MathTex("Z").next_to(axes.z_axis.get_end(), RIGHT).set_color(BLACK)  self.add(x_label, y_label, z_label)  # 添加标签到场景  # 旋转坐标轴  self.set_camera_orientation(phi=75 * DEGREES, theta=45 * DEGREES)  # self.set_camera_orientation(pitch=75 * DEGREES, yaw=145 * DEGREES, roll=130 * DEGREES)  # self.wait(1)  # 等待一段时间(可选)  # 动画效果:旋转圆锥体以获得更好的视角(可选)  # self.play(Rotate(cone, angle=-135 * DEGREES, axis=UP), run_time=2)  # self.wait(2)  # 要运行该代码,请使用以下命令:manim -pql your_file.py ConeScene  # 请勿删除下面的命令以确保运行按钮有效  
%manim -qm -v WARNING ConeScene

 运行结果:

         现在,请注意,虽然我们称它为锥,但它更像是一个钟杯形状,而不是大多数人所说的锥。当然,钟形玻璃杯的上部和下部确实是我们通常认为的锥体。

        这就带来了一个问题:如果我们真的只想要上半部分或下半部分(即传统意义上的圆锥体)怎么办?这个问题很容易回答。我们要做的就是解出给定的 的方程,如下所示

         我们稍微化简了系数,使方程更容易处理。现在,我们知道平方根总是返回正数,所以我们可以看到z = \sqrt {​{A^2}{x^2} + {B^2}{y^2}}将总是正的,所以对于上面的“锥”的上半部分,方程也是正的。同样,z = - \sqrt {​{A^2}{x^2} + {B^2}{y^2}}总是负的,所以这个方程只是上面“锥”的下半部分。

        同时,注意这是一个沿z方向打开的圆锥的方程,设在。为了得到沿另一个轴打开的锥的方程我们需要做的就是对方程做一点修改。这将是我们将在本节中看到的其他表面的情况。在圆锥体的例子中,等号一侧的变量将决定圆锥体打开的轴。例如,一个沿x轴打开的圆锥体的方程,

 对于下列大多数曲面,我们将不给出其他可能的公式。然而,我们将承认如何改变每个公式来改变表面的方向。

3.圆柱体

这是圆柱体的一般方程。

这是一个横截面为椭圆的圆柱体。如果a= b我们有一个圆柱体,它的横截面是圆。我们会更多地处理这些圆柱体而不是一般形式的圆柱体所以具有圆形截面的圆柱体的方程是,

 这是一个典型的具有椭圆截面的圆柱体的草图。

 圆柱体将位于与没有出现在方程中的变量对应的轴的中心。
注意不要把这个和圆搞混了。在二维空间中它是一个圆,但在三维空间中它是一个圆柱体。

示例代码

from manim import *  class VerticalCylinderScene01(ThreeDScene):  def construct(self):  # 设置背景颜色为白色  self.camera.background_color = WHITE  # 定义圆柱体的参数  radius = 1  # 圆柱的半径  height = 3  # 圆柱的高度  # 创建圆柱体,方向为向上(沿z轴)  cylinder = Cylinder(radius=radius, height=height, direction=UL)  cylinder.set_fill(BLUE_D, opacity=0.6)  # 设置填充颜色和不透明度  cylinder.set_stroke(BLACK, width=2)  # 设置边框颜色和边框宽度  # 将圆柱体添加到场景  self.add(cylinder)  # 请勿删除下面的命令以确保运行按钮有效  
%manim -qm -v WARNING VerticalCylinderScene01

运行结果:

 

4.单叶双曲面 

这是单张双曲面的方程。

这是一个典型的单张双曲面的草图。前面带负号的变量将给出图形居中的轴。

接下来用manim实现一下该图像的绘制。

示例代码:

from manim import *  class HyperboloidofOneSheetScene01(ThreeDScene):  def construct(self):  self.camera.background_color = WHITE  # 设置参数  a, b, c = 0.8, 0.5, 1.1  # 双曲面的 semi-axis 长度  # 创建单叶双曲面  hyperboloid = Surface(  lambda u, v: np.array([  a * np.cosh(v) * np.cos(u),  # x = a * cosh(v) * cos(u)  b * np.cosh(v) * np.sin(u),  # y = b * cosh(v) * sin(u)  c * v                         # z = c * v(线性变化)  ]),  u_range=[0, TAU],  # u 从 0 到 2π  v_range=[-2, 2],   # v 的范围可以根据需要修改  resolution=(24, 48)  # 网格分辨率  )  hyperboloid.set_style(fill_color=(BLUE, DARK_BROWN), fill_opacity=1, stroke_color=BLACK)  # 在曲面上添加平行线  for v in np.linspace(-2, 2, 5):  # 在双曲面表面添加平行线  line = Line(  start=np.array([a * np.cosh(-2) * np.cos(0), b * np.cosh(-2) * np.sin(0), c * -2]),  end=np.array([a * np.cosh(2) * np.cos(TAU), b * np.cosh(2) * np.sin(TAU), c * 2])  )  line.set_color(BLACK)  line.set_stroke(width=0.5)  self.add(line)  # 将双曲面添加到场景中  self.add(hyperboloid)  # 添加三维坐标轴  axes = ThreeDAxes().set_color(BLACK)  self.add(axes)  # 添加坐标轴标签  x_label = MathTex("X").next_to(axes.x_axis.get_end(), RIGHT).set_color(BLACK)  y_label = MathTex("Y").next_to(axes.y_axis.get_end(), UP).set_color(BLACK)  z_label = MathTex("Z").next_to(axes.z_axis.get_end(), RIGHT).set_color(BLACK)  self.add(x_label, y_label, z_label)  # 设置相机视角  self.set_camera_orientation(phi=75 * DEGREES, theta=45 * DEGREES)  # 可选:为更好的视图旋转整个场景  # self.play(Rotate(hyperboloid, angle=-135 * DEGREES, axis=UP), run_time=2)  # self.wait(2)  # 运行此代码,请使用:manim -pql your_file.py HyperboloidofOneSheetScene  # 不要移除以下命令以使运行按钮正常工作  
%manim -qm -v WARNING HyperboloidofOneSheetScene01

 

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

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

相关文章

【CanMV K230 AI视觉】 人脸识别

【CanMV K230 AI视觉】 人脸识别 人脸识别 动态测试效果可以去下面网站自己看。) B站视频链接:已做成合集 抖音链接:已做成合集 人脸识别 前面学习过的人脸检测,只检测出人脸,而本实验要做的人脸识别,会学…

嵌入式人工智能项目及人工智能应用项目——大合集列表查阅

本文的项目合集列表可能更新不及时(会及时更新),可查阅实时更新的链接如下。 嵌入式人工智能及人工智能应用项目合集实时更新链接如下: 阿齐嵌入式人工智能及人工智能应用项目合集 (kdocs.cn)https://www.kdocs.cn/l/cc97tuieys4…

Python urllib

Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。 本文主要介绍 Python3 的 urllib。 urllib 包 包含以下几个模块: urllib.request - 打开和读取 URL。urllib.error - 包含 urllib.request 抛出的异常。urllib.parse - 解析 URL。url…

心觉:不能成事的根本原因

很多人一直都很努力,每天都很忙 每天都学习很多东西,学习各种道,各种方法论 但是许多年过去了依然一事无成 自己的目标没有达成,梦想没有实现 为什么呢 关键是没有开悟 那么什么是开悟呢 现在很多人都在讲开悟 貌似开悟很…

回收站永久删除的文件还能恢复吗?教你恢复技巧

在数字时代,电脑是我们工作、学习和娱乐的重要工具。然而,随着我们对电脑的频繁使用,误删文件的情况也时有发生。当我们在回收站中不小心永久删除了某个重要文件时,内心可能会充满焦虑和疑惑:这些文件还能恢复吗&#…

基于springboot+vue实现的智能垃圾分类系统 (源码+L文+ppt)4-063

摘 要 本论文主要完成不同用户的权限划分,不同用户具有不同权限的操作功能,系统包括用户、物业和管理员模块,主要功能有用户、物业、垃圾站点、垃圾投放、验收信息、积分商城、积分充值、通知物业等管理操作。 关键词:智能垃圾…

【LLM】中国在 GPT/LLM 大模型上是否已经实现了弯道超车?

还是谈一下现状吧。中国的大模型公司与美国的大模型公司其实在数量上可能中国更多一些吧。 美国的 OpenAI:No.1,毫无疑问!Google:尽管落了,但是依然是全球第二的实力吧?Meta:开源全靠它家的Ll…

【代码随想录训练营第42期 Day60打卡 - 图论Part10 - Bellman_ford算法系列运用

目录 一、Bellman_ford算法的应用 二、题目与题解 题目一:卡码网 94. 城市间货物运输 I 题目链接 题解:队列优化Bellman-Ford算法(SPFA) 题目二:卡码网 95. 城市间货物运输 II 题目链接 题解: 队列优…

Untangle电脑上网行为管理软件有哪些?(一口气看完,第一款建议收藏!)

控制上网的软件通常被称为上网行为管理软件或上网行为监控软件。 这类软件主要用于管理网络用户的上网行为,帮助企业或组织提升网络使用效率和工作效率,同时最大限度地避免不当上网行为带来的潜在风险和损失。 以下是一些值得推荐的电脑上网行为管理软件…

【C++】——继承与虚继承

文章目录 继承继承的概念继承的定义继承类模版基类与派生类的赋值转换继承的作用域派生类的默认成员函数构造函数与析构函数拷贝构造 不能被继承的类继承与友元继承与静态成员多继承与菱形继承 虚继承继承与组合 继承 什么是继承? 继承其实就是胆码复用的一种手段&…

江科大笔记—OLED显示屏

OLED显示屏 OLED的GND接到负极,OLED的VCC接正极,同时也会接到stm32上的PB6和PB7 SCL接PB8 SDA接PB9 在Hardware文件夹里面放3个文件:OLED.c、OLED.h、OLED_Font.h OLED_Font.h:存的是OLED的字库数据,因OLED是不带字库的&#xf…

APP测试--含【学车不】项目实战

本文参考黑马程序员以下课程; 1-002-App应用架构_哔哩哔哩_bilibili 1. APP环境 1.1 app应用系统架构 json是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来储存和表示数据 1.2 app 后台开发测试环境 预发布环境: 使用后端的测试代码&a…

Meta-Learning数学原理

文章目录 什么是元学习元学习的目标元学习的类型数学推导1. 传统机器学习的数学表述2. 元学习的基本思想3. MAML 算法推导3.1 元任务设置3.2 内层优化:任务级别学习3.3 外层优化:元级别学习3.4 元梯度计算3.5 最终更新规则 4. 算法合并5. 理解 MAML 的优…

钢索缺陷检测系统源码分享

钢索缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

在线制作PPT组织架构图!这个AI工具简单又好用!

ppt组织架构图如何制作,用哪个软件好? 在现代商业世界中,组织架构图是展示公司结构和层级关系的重要工具,譬如内部沟通或者对外展示等场合下,一个精美且清晰的组织架构图都能有效传达信息,提升企业形象。 …

高精度加法和减法

高精度加法 在C/C中,我们经常会碰到限定数据范围的情况,我们先来看看常用的int和long long两种数据类型的范围吧。 C标准规定:int占一个机器字长。在32位系统中int占32位,即4个字节,所以int的范围是[-2的31次方&#…

独立站技能树之建站33项自检清单 1.0丨出海笔记

很多时候大家建好站之后很嗨,但过一会就开始担忧各种纠结我是不是还有什么点没做好,或者我的站漏了什么东西,那么接下来以下这个独立站自检清单能很好的帮到你。其实对于新手我还是建议大家直接用一些模板,因为模板上面基本该有的…

基于SpringBoot+Vue+MySQL的在线招投标系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今商业环境中,招投标活动是企业获取项目、资源及合作伙伴的重要途径。然而,传统招投标过程往往繁琐复杂,涉及众多文件交换、信息审核与沟通环节,不仅效率低下,还易…

车市状态喜人,国内海外“两开花”

文/王俣祺 导语:随着中秋假期告一段落,“金九”也正式过半,整体上这个销售旺季的数据可以说十分喜人,各家车企不是发布新车、改款车就是推出了一系列购车权益,充分刺激了消费者的购车热情。再加上政府政策的鼎力支持&a…

动态线程池实战(一)

动态线程池 对项目的认知 为什么需要动态线程池 DynamicTp简介 接入步骤 功能介绍 模块划分 代码结构介绍