mplot3d是matplotlib里用于绘制3D图形的一个模块。关于mplot3d 绘图模块的介绍请见:https://blog.csdn.net/dahunihao/article/details/77833877。

莫比乌斯环(mobius strip)是一种只有一个曲面的拓扑结构。把一个纸条扭转180°后,两头再粘接起来,这样的纸带只有一个面(即单侧曲面),一只小虫可以爬遍整个曲面而不必跨过它的边缘。

莫比乌斯环是一个二维的紧致流形 (即一个有边界的面),可以嵌入到三维或更高维的流形中 。那么如何在3D空间上画莫比乌斯环呢?可以利用现有的方程式,将莫比乌斯环的两个参数(角度,宽度)映射到三维空间中。以下摘自维基百科(https://en.wikipedia.org/wiki/M%C3%B6bius_strip):

"""

One way to represent the Möbius strip as a subset of three-dimensional Euclidean space is using the parametrization:

where 0 ≤ u < 2π and −1 ≤ v ≤ 1. This creates a Möbius strip of width 1 whose center circle has radius 1, lies in the xyplane and is centered at (0, 0, 0). The parameter u runs around the strip while v moves from one edge to the other.

"""

大概的意思就是:这个方程组可以创造一个宽度为1,中心圆半径为1的莫比乌斯环,其所处位置为x-y平面,中心为(0,0,0)。参数u绕整个环转圈,参数v则从一个边缘移动到另一个边缘。

下面让我们一步一步来画莫比乌斯环。首先导入numpy,matplotlib和其3D模块,创建一个图形和一个三维坐标轴:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = plt.axes(projection='3d')

其次,定义u,v参数(u为绕环一圈的角度,v为环的宽度):

u = np.linspace(0, 2*np.pi, endpoint=True, num=50)
v = np.linspace(-1, 1, endpoint=True, num=10)

然后,按照方程式,将u,v参数映射到三维空间(x轴,y轴和z轴):

u,v=np.meshgrid(u,v)
u=u.flatten()
v=v.flatten()
x = (1 + 0.5 * v * np.cos(u / 2.0)) * np.cos(u)
y = (1 + 0.5 * v * np.cos(u / 2.0)) * np.sin(u)
z = 0.5 * v * np.sin(u / 2.0)

最后,选一个好看的配色方案,画出图像:

ax.plot_trisurf(x,y,z,cmap="cool")

此时图像如下:

可以看出图像已基本成型,但是部分地方还有缺角。这是因为三角剖分还不正确。可以使用matplotlib现成的方法定义三角剖分:

import matplotlib.tri as mtri
tri = mtri.Triangulation(u, v)

最后的最后,把图像变大一点,把x轴,y轴和z轴的上下限修改一下,这样图像看起来更好一些。

完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10,6))
ax = plt.axes(projection='3d')# u, v are parameterisation variables
u = np.linspace(0, 2*np.pi, endpoint=True, num=50)
v = np.linspace(-1, 1, endpoint=True, num=10)# This is the Mobius mapping, taking a u, v pair and returning an x, y, z
# triple
u,v=np.meshgrid(u,v) #用meshgrid函数来产生三维绘图时的矩阵
u=u.flatten() #把u展开,变成一维数组
v=v.flatten() #把v展开,变成一维数组
x = (1 + 0.5 * v * np.cos(u / 2.0)) * np.cos(u)
y = (1 + 0.5 * v * np.cos(u / 2.0)) * np.sin(u)
z = 0.5 * v * np.sin(u / 2.0)# Triangulate parameter space to determine the triangles
import matplotlib.tri as mtri
tri = mtri.Triangulation(u, v)# Plot the surface.  The triangles in parameter space determine which x, y, z
# points are connected by an edge.
ax.plot_trisurf(x,y,z,cmap="cool",triangles=tri.triangles)
ax.set_xlim(-1.1, 1.1)
ax.set_ylim(-1.1, 1.1)
ax.set_zlim(-1, 1)plt.show()

图像如下:

参考:https://matplotlib.org/gallery/mplot3d/trisurf3d_2.html?highlight=mobius

转载于:https://www.cnblogs.com/HuZihu/p/9441217.html

Matplotlib学习---用mplot3d画莫比乌斯环(Mobius strip)相关推荐

  1. 莫比乌斯函数_莫比乌斯环:python-matplotlib可视化实现

    1 说明: ===== 1.1 莫比乌斯环:mobius strip,又叫莫比乌斯带. 1.2 公元1858年,德国数学家莫比乌斯(Mobius,1790~1868)和约翰·李斯丁发现. 图片来自网络 ...

  2. Python使用matplotlib进行3D可视化分析:3d柱状图、3d直方图、3d线框图、3d曲面图、3d翼面图(莫比乌斯环)

    Python使用matplotlib进行3D可视化分析:3d柱状图.3d直方图.3d线框图.3d曲面图.3d翼面图(莫比乌斯环) 目录

  3. Matplotlib学习---用matplotlib画箱线图(boxplot)

    箱线图通过数据的四分位数来展示数据的分布情况.例如:数据的中心位置,数据间的离散程度,是否有异常值等. 把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)分 ...

  4. Python实现3D莫比乌斯环的绘制

    Python实现3D莫比乌斯环的绘制 在Python中,我们可以使用matplotlib库来实现3D图形的绘制,并且提供了很多方便的工具函数.本文将介绍如何使用Python绘制一个3D莫比乌斯环. 首 ...

  5. 莫比乌斯带catia建模_用sw2018制作莫比乌斯环图文教程

    概述: 莫比乌斯环的概念来自于莫比乌斯带,公元1858年,德国数学家莫比乌斯(Mobius,1790-1868)和约翰·李斯丁发现:把一根纸条扭转180°后,两头再粘接起来做成的纸带圈,具有魔术般的性 ...

  6. python莫比乌斯_用python绘出一个莫比乌斯环

    昨天写了一篇subplot的练习放到微信公众账号中,想用一个莫比乌斯环的图片作为封面图片,就去维基百科上扒了一个.但是分辨率很低,就想自己绘出一个来.没想到越陷越深,就一起把3D绘图给学习了一遍. ( ...

  7. python莫比乌斯环_【干货】用python绘出神奇的莫比乌斯环~

    昨天写了一篇subplot的练习放到微信公众账号中,想用一个莫比乌斯环的图片作为封面图片,就去维基百科上扒了一个.但是分辨率很低,就想自己绘出一个来.没想到越陷越深,就一起把3D绘图给学习了一遍. 源 ...

  8. c莫比乌斯函数_代佳璇缘起一条莫比乌斯环,我爱上了难缠的数学!

    上期回顾 代佳璇: 郑州市枫杨外国语学校八年级: 总成绩稳居年级前十. 自述   代佳璇   编辑   张璐莹  在小学阶段,大家可能都会遇到这样一种题:数一数图中有几条线段?变个问法:一共有三个人, ...

  9. python绘图工具基础-matplotlib学习之基本使用

    matplotlib学习之基本使用 1.figure学习2.设置坐标轴3.Legend 图例4.Annotation 标注5.tick能见度 1.figure学习 导包 import matplotl ...

最新文章

  1. 数据结构50:二分查找法(折半查找法)
  2. Linux进程调度策略分析
  3. manifest.mf._MANIFEST.MF和feature.xml版本控制规则
  4. 两个精彩的比喻:吞吐量和延迟、信号量和互斥锁
  5. 传奇新增物品和装备的内观外观及特效Pak文件详解
  6. 拼多多砍价小程序源码/流量主系列微信小程序源码
  7. [系统安全] 十七.Windows PE病毒概念、分类及感染方式详解
  8. 详解电脑机械硬盘装什么系统好
  9. 设计一个小型的物联网应用系统_点赞 | 面向能源物联网的智能传感芯片设计与应用...
  10. 今年最后一月数据库排名公布!前三难以撼动!
  11. 计算机专业保研英语自我介绍,计算机专业保研面试英文自我介绍
  12. 混沌工程-为什么推广的如此困难
  13. word07去掉回车符
  14. 在Golang里如何实现结构体成员指针到结构体自身指针的转换
  15. 计算机主机如何睡眠,电脑如何设置睡眠
  16. 什么是共模干扰差模干扰共模信号差模信号
  17. 网络编程--TCP实例
  18. 「张一鸣」“突袭”「王兴」
  19. vue内容横向循环滚动_在Vue中使用better-scroll实现横向滚动和竖向滚动
  20. js实现简单的动态添加或删除一行数据

热门文章

  1. python 参数封装_扩展Python模块系列(三)----参数解析与结果封装
  2. 知识付费内容靠什么“变现”
  3. 自动编码器(AE、SDA、SDAE)的理解
  4. 软件架构设计系列总结—7—设计箴言理解
  5. 年终体检,你会紧张么?
  6. 外企面试的常见英语表达3
  7. 【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法
  8. 力不如我的同学,靠这份Java面试八股文,秋招拿到了60w+的offer
  9. OSI 模型的七层是什么?
  10. bcc校验位怎么算的_BCC(异或校验)、CRC、LRC校验算法