Surface类是Manim中专为创建和操控复杂的三维表面而打造的。

在实际应用中,无论是创建数学教学中的几何模型,还是模拟物理现象中的曲面变化,甚至是构建复杂的动画场景中的三维元素,Surface类都能以其强大的功能和灵活性满足我们的需求。

通过Surface类的参数和方法,我们可以创造出既逼真又富有创意的三维动画效果。

1. 主要参数

Surface的主要参数有4个:

参数名称 类型 说明
func Callable[[float, float], np.ndarray] 一个接受两个参数(通常称为u和v)的函数,返回三维空间中的一个点(x, y, z)的z坐标
u_range [float] 参数u的取值范围,决定了表面在u方向上的延伸情况
v_range [float] 参数v的取值范围,决定了表面在v方向上的延伸情况
resolution [int] 在u和v方向上的分辨率,即表面在这两个方向上的细分程度

其中,参数func比较重要,它决定了曲面的形状。

通过这个函数来创建任何可以用参数方程表示的三维表面,例如,球面、椭球面、双曲面等。

2. 主要方法

Surface类有2个设置去曲面样式的方法。

名称 说明
set_fill_by_checkerboard 通过交替颜色填充曲面,适用于需要视觉区分曲面不同部分的情况
set_fill_by_value 根据曲面上的数值使用颜色渐变进行填充,适用于表示连续变量的变化

3. 使用示例

下面通过几个示例来用演示如何使用Surface类。

3.1. 基本曲面

这个示例展示了如何使用Manim的Surface类创建一个基本的三维曲面。

曲面由func参数定义,该函数描述了曲面在三维空间中的形状。

# 创建一个基本的曲面
f = lambda u, v: (u, v, u**2 - v**2)
s = Surface(
func=f,
u_range=[-PI / 2, PI / 2],
v_range=[0, PI / 2],
)

3.2. 棋盘填充曲面

此示例演示了如何将曲面填充为棋盘样式。

通过使用set_fill_by_checkerboard方法,曲面被分割成多个小方格,并且这些小方格以交替的颜色(如红色和蓝色)填充,有助于区分曲面的不同部分。

# 创建一个基本的曲面
f = lambda u, v: (u, v, u * v)
s = Surface(
func=f,
u_range=[-PI / 2, PI / 2],
v_range=[0, PI / 2],
)
# 填充颜色
s.set_fill_by_checkerboard(RED, BLUE)

3.3. 值填充曲面

在这个示例中,曲面的填充颜色是根据曲面上的数值来确定的。

set_fill_by_value方法允许用户定义一个颜色渐变函数,该函数根据曲面上的每个点的值来返回对应的颜色。

# 创建一个基本的曲面
f = lambda u, v: axes.c2p(
u,
v,
np.sin(u * PI) * np.cos(v * PI),
)
s = Surface(
func=f,
u_range=[-PI, PI],
v_range=[0, PI],
)
# 使用值填充曲面,颜色根据曲面上的值变化
s.set_fill_by_value(
axes=axes,
colorscale=[
(RED, -0.5),
(YELLOW, 0),
(GREEN, 0.5),
],
axis=2,
)

3.4. 自定义曲面样式

此示例展示了如何自定义曲面的颜色和线宽。

通过使用stroke_color和stroke_width方法,用户可以分别设置曲面分割线的颜色和线条的宽度。

下面的示例中,使用黄色,且宽度为2的线来作为曲面上的分割线。

# 创建一个基本的曲面
f = lambda u, v: (u, v, u**2 - v**2)
s = Surface(
func=f,
stroke_color=YELLOW,
stroke_width=2,
u_range=[-PI / 2, PI / 2],
v_range=[0, PI / 3],
)

4. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(surface.py),

下载地址: 完整代码 (访问密码: 6872)

manim边做边学--曲面的更多相关文章

  1. 边做边学入门微信小程序之仿豆瓣评分

    微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...

  2. Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain

    近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...

  3. 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good

    作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...

  4. 【Leetcode 做题学算法周刊】第四期

    首发于微信公众号<前端成长记>,写于 2019.11.21 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 67 ...

  5. 做fzu oj 1045 做减法学到的sprintf()函数

    题目 做题一直输不出答案,于是就上网去百度了这题的解题,发现解答十分的简短,而且其中我看见了平时没见过的函数,sprintf(). 于是就百度sprintf()的使用. 如下: 函数功能:把格式化的数 ...

  6. 【Leetcode 做题学算法周刊】第一期

    首发于微信公众号<前端成长记>,写于 2019.10.28 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 1. ...

  7. 【Leetcode 做题学算法周刊】第二期

    首发于微信公众号<前端成长记>,写于 2019.11.05 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 20 ...

  8. 【Leetcode 做题学算法周刊】第三期

    首发于微信公众号<前端成长记>,写于 2019.11.13 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 35 ...

  9. 【Leetcode 做题学算法周刊】第六期

    首发于微信公众号<前端成长记>,写于 2019.12.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 11 ...

  10. 【Leetcode 做题学算法周刊】第七期

    首发于微信公众号<前端成长记>,写于 2020.01.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 12 ...

随机推荐

  1. 解决elementUI 表格el-table设置高度之后合计行不显示

    问题:elementUI el-table 设置了高度height 和合计行 show-summary 之后,合计行无法正常显示 一.问题分析 根据调试,发现该问题应该属于组件bug,表格主体中给 f ...

  2. 树状数组 java模板(纯代码)

    public class TrieNums { int n; /*Nums start from 0*/ int[] storage; /*TrieNums index start from 1*/ ...

  3. Maya 无法选中坐标轴 的 解决办法

    事件起因: 有项目组某同事在使用maya时,无法选中坐标轴,导致在拖动东西的时候总是无法对准坐标轴线. 解决办法: maya软件中设置: Windows -> Settings/Preferen ...

  4. PS安装插件提示无法加载扩展未正确签署 的解决办法

    PS安装插件提示无法加载扩展未正确签署解决方式 win系统: 1.打开"运行"窗口(点击电脑左下角"开始"菜单,从打开的菜单中依次点击"所有程序&qu ...

  5. 【赵渝强老师】大数据工作流引擎Oozie

    一.什么是工作流? 工作流(WorkFlow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算.工作流要解决的主要问题是:为实现某 ...

  6. 《Vue.js 设计与实现》读书笔记 - 第12章、组件的实现原理

    第12章.组件的实现原理 12.1 渲染组件 在渲染器内部的实现看,一个组件是一个特殊类型的虚拟 DOM 节点.之前在 patch 我们判断了 VNode 的 type 值来处理,现在来处理类型为对象 ...

  7. 点亮PC13- 使用寄存器点亮

    #include "stm32f10x.h" // Device header int main(void) { // 打卡GPIOC的时钟 RCC->APB2ENR = 0 ...

  8. webapi action 参数

    使用地址参数传递(queryString)数据:eg:http://localhost:5063/WeatherForecast?age=123 /// <summary> /// GET ...

  9. ajax异步请求数据还没有返回,页面时空白的如何处理

    使用骨架屏,给用户一种正在解析数据的感觉 : element-ui的骨架屏 :https://element.eleme.cn/#/zh-CN/component/skeleton

  10. 06 导师不敢和你说的水论文隐藏技巧,顶刊、顶会、水刊的论文读哪个,如何做一个称职的学术裁缝.md

    博客配套视频链接: https://www.bilibili.com/video/BV11g41127Zn/?spm_id_from=333.788&vd_source=b1ce52b6eb3 ...