返回顶部
首页 > 资讯 > 后端开发 > Python >Python基于欧拉角怎么绘制一个立方体
  • 663
分享到

Python基于欧拉角怎么绘制一个立方体

2023-07-05 07:07:55 663人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本文小编为大家详细介绍“python基于欧拉角怎么绘制一个立方体”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python基于欧拉角怎么绘制一个立方体”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先画个立方体工

本文小编为大家详细介绍“python基于欧拉角怎么绘制一个立方体”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python基于欧拉角怎么绘制一个立方体”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

先画个立方体

工欲善其事、必先利其器,在开始学习欧拉角模拟之前,可先绘制一个立方体。

matplotlib中,这个任务可通过plt.voxels实现,下面先绘制一个最质朴的立方体

Python基于欧拉角怎么绘制一个立方体

代码为

import matplotlib.pyplot as pltimport numpy as npx, y, z = np.indices((2, 2, 2))filled = np.ones((1,1,1))ax = plt.subplot(projection='3D')ax.voxels(x,y,z, filled=filled)plt.show()

其中,x,y,z表示顶点,filled表示被填充的区域。由于其顶点数量为2×2×2,故只有一个立方体,从而filled是一个1×1×1的张量。

有了立方体之后,就可以进行欧拉角仿真了。

欧拉角和旋转矩阵

为了尽快进入演示部分,故对原理的介绍从略,仅从二维平面上的旋转矩阵出发,做一个简单的推导,而三维旋转矩阵,至少在形式上与二维是雷同的。

假设坐标系中有一个向量(x,y),其模长为r=√x2+y2,角度为θ0=arctan(y/x).若将其围绕坐标原点逆时针旋转θ,则其坐标变为

Python基于欧拉角怎么绘制一个立方体

由于x=rcosθ0, y=rsinθ0,则上式可以写为

Python基于欧拉角怎么绘制一个立方体

写成矩阵形式即为

Python基于欧拉角怎么绘制一个立方体

也就是说,在平面直角坐标系上,向量绕原点顺时针旋转θ,相当于左乘一个旋转矩阵。

推广到三维,为了限制xy坐标平面上的旋转,要将其旋转中心从原点扩展为绕着z轴旋转,从而三维旋转矩阵可推广为

Python基于欧拉角怎么绘制一个立方体

同理可得到绕三个轴转动的旋转矩阵,为了书写方便,记Sθ=sinθ,Cθ=cosθ,可列出下表。

Python基于欧拉角怎么绘制一个立方体

初步演示

将旋转矩阵写成函数是十分方便的,下面用lambda表达式来实现

import numpy as np# 将角度转弧度后再求余弦cos = lambda th : np.cos(np.deg2rad(th))sin = lambda th : np.sin(np.deg2rad(th))# 即 Rx(th) => MatrixRx = lambda th : np.array([    [1, 0,       0],    [0, cos(th), -sin(th)],    [0, sin(th), cos(th)]])Ry = lambda th : np.array([    [cos(th),  0, sin(th)],    [0      ,  1, 0],    [-sin(th), 0, cos(th)]])Rz = lambda th : np.array([    [cos(th) , sin(th), 0],    [-sin(th), cos(th), 0],    [0       , 0,       1]])

有了旋转矩阵,就可以旋转,接下来让正方体沿着三个轴分别旋转30°,其效果如下

Python基于欧拉角怎么绘制一个立方体

由于ax.voxels在绘图时,要求输入的是拥有三个维度的数组,而旋转矩阵是3 × 3 3\times33×3矩阵,相当于是二维数组,彼此之间可能很难计算,所以实际计算时,需要对数组维度进行调整

import matplotlib.pyplot as plt# 用于批量调节x,y,z的数组维度Reshape = lambda x,y,z : [x.reshape(2,2,2), y.reshape(2,2,2), z.reshape(2,2,2)]filled = np.ones((1,1,1))x, y, z = np.indices((2, 2, 2))# 将x,y,z展开,以便于矩阵计算xyz = np.array([x,y,z]).reshape(3,-1)fig = plt.figure("rotate")# 此为未旋转的正方体ax = fig.add_subplot(1,4,1, projection='3d')ax.voxels(x,y,z, filled=filled)# 绕x轴旋转30°X, Y, Z = Rx(30) @ xyzax = fig.add_subplot(1,4,2, projection='3d')ax.voxels(*Reshape(X, Y, Z), filled=filled)# 绕y轴旋转30°X, Y, Z = Ry(30) @ xyzax = fig.add_subplot(1,4,3, projection='3d')ax.voxels(*Reshape(X, Y, Z), filled=filled)# 绕z轴旋转30°X, Y, Z = Rz(30) @ xyzax = fig.add_subplot(1,4,4, projection='3d')ax.voxels(*Reshape(X, Y, Z), filled=filled)plt.show()

不同转动顺序的影响

众所周知,矩阵计算是不能交换的,反映到实际生活中,就是不同的旋转次序,可能会导致完全不同的结果,接下来沿着不同的旋转次序,来对正方体进行旋转,效果如下

Python基于欧拉角怎么绘制一个立方体

需要注意的是,由于矩阵左乘向量表示对向量进行旋转,所以距离向量最近的矩阵表示最先进行的操作,即RzRyRxr ⃗  表示先转Rx ,Ry次之,Rz最后。

代码如下

filled = np.ones((1,1,1))x, y, z = np.indices((2, 2, 2))xyz = np.array([x,y,z]).reshape(3,-1)fig = plt.figure("rotate")# 旋转顺序 x, y, zX, Y, Z = Rz(30) @ Ry(30) @ Rx(30) @ xyzax = fig.add_subplot(1,3,1, projection='3d')ax.voxels(*Reshape(X, Y, Z), filled=filled)# 旋转顺序 z, y, xX, Y, Z = Rx(30) @ Ry(30) @ Rz(30) @ xyzax = fig.add_subplot(1,3,2, projection='3d')ax.voxels(*Reshape(X, Y, Z), filled=filled)# 旋转顺序 y, x, zX, Y, Z = Rz(30) @ Rx(30) @ Ry(30) @ xyzax = fig.add_subplot(1,3,3, projection='3d')ax.voxels(*Reshape(X, Y, Z), filled=filled)plt.show()

总之,虽然分不清谁是谁,但最起码可以看清楚,不同的旋转顺序的确导致了不同的旋转结果。

旋转演示

为了更加清楚地表示这一过程,可以将正方体的旋转过程绘制下来,先考虑单轴旋转,假设每次旋转3°,绕X轴旋转30次,则可得到

Python基于欧拉角怎么绘制一个立方体

import numpy as npimport matplotlib.pyplot as pltfrom matplotlib import cmimport imageiofilled = np.ones((1,1,1))x, y, z = np.indices((2, 2, 2))xyz = np.array([x,y,z]).reshape(3,-1)def saveGif(X,Y,Z, gifs):    plt.cla()    ax = plt.subplot(projection='3d')    ax.voxels(*Reshape(X, Y, Z), filled=filled)    ax.set_xlim(-0.5,1.5)    ax.set_ylim(-0.5,1.5)    ax.set_zlim(-0.5,1.5)    ax.set_title(f"theta={th}")    plt.tight_layout()    plt.savefig(f"tmp.jpg")    gifs.append(imageio.imread(f"tmp.jpg"))gifImgs = []th = 0for i in range(30):    X,Y,Z = Rx(th)@xyz    th += 3    saveGif(X, Y, Z, gifImgs)imageio.mimsave("test.gif",gifImgs,fps=10)

通过这个方法,可以将不同顺序的旋转矩阵可视化表示,

filled = np.ones((1,1,1))x, y, z = np.indices((2, 2, 2))xyz = np.array([x,y,z]).reshape(3,-1)gifImgs = []th = 0for _ in range(10):    X,Y,Z = Rz(0) @ Rx(0) @ Ry(th) @ xyz    th += 3    saveGif(X, Y, Z, gifImgs)th = 0for i in range(10):    X,Y,Z = Rz(0) @ Rx(th) @ Ry(30) @ xyz    th += 3    saveGif(X, Y, Z, gifImgs)th = 0for i in range(10):    X,Y,Z = Rz(th) @ Rx(30) @ Ry(30) @ xyz    th += 3    saveGif(X, Y, Z, gifImgs)imageio.mimsave("test.gif",gifImgs,fps=10)

最后得到三种不同旋转顺序的区别

x-y-z

Python基于欧拉角怎么绘制一个立方体

z-y-x

Python基于欧拉角怎么绘制一个立方体

y-x-z

Python基于欧拉角怎么绘制一个立方体

读到这里,这篇“Python基于欧拉角怎么绘制一个立方体”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网Python频道。

--结束END--

本文标题: Python基于欧拉角怎么绘制一个立方体

本文链接: https://lsjlt.com/news/350222.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python基于欧拉角绘制一个立方体
    目录先画个立方体欧拉角和旋转矩阵初步演示不同转动顺序的影响旋转演示先画个立方体 工欲善其事、必先利其器,在开始学习欧拉角模拟之前,可先绘制一个立方体。 在matplotlib中,这个...
    99+
    2023-02-27
    Python欧拉角绘制立方体 Python绘制立方体 Python欧拉角
  • Python基于欧拉角怎么绘制一个立方体
    本文小编为大家详细介绍“Python基于欧拉角怎么绘制一个立方体”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python基于欧拉角怎么绘制一个立方体”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先画个立方体工...
    99+
    2023-07-05
  • 基于Python实现绘制一个足球
    目录前情提要先画六边形再画五边形前情提要 如果想优雅地绘制一个足球,那首先需要绘制正二十面体:用Python绘制正二十面体 其核心代码为 import numpy as np fro...
    99+
    2023-02-24
    Python绘制足球 Python足球
  • Python怎么绘制3D立体花朵
    本篇内容主要讲解“Python怎么绘制3D立体花朵”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么绘制3D立体花朵”吧!动态展示这是一个动态图哦导读兄弟们可以收藏一下哦!情人节可以...
    99+
    2023-06-21
  • 基于Python绘制3D立体爱心图案的示例详解
    目录原理点画法(实心)代码运行效果点画法(空心)代码运行效果折线画法 (线团)代码运行效果等高线画法(线框)代码运行效果原理 1.使用python中的mtplotlib库。 2.立体...
    99+
    2022-11-16
    Python绘制3D立体爱心 Python绘制3D爱心 Python 3D 爱心
  • 怎么用python绘制立体玫瑰花
    要使用Python绘制立体玫瑰花,可以使用matplotlib库和numpy库。下面是一个示例代码:```pythonimport ...
    99+
    2023-10-12
    python
  • 基于Python如何实现绘制一个足球
    今天小编给大家分享一下基于Python如何实现绘制一个足球的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前情提要其核心代码为...
    99+
    2023-07-05
  • CSS3中怎么绘制一个圆角矩形
    CSS3中怎么绘制一个圆角矩形,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。随着网络的发展,CSS 也在不断的完善,充分吸取多...
    99+
    2024-04-02
  • 基于Python绘制一个摸鱼倒计时界面
    目录前言实现过程前言 前段时间在微博看到一段摸鱼人的倒计时模板,感觉还挺有趣的。 于是我用了一小时的时间写了个页面出来 摸鱼办地址 (当然是摸鱼的时间啦)。 模板是这样的: 摸鱼办...
    99+
    2024-04-02
  • 使用canvas怎么绘制一个圆角头像
    使用canvas怎么绘制一个圆角头像?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先, 拿到头像在画布上的坐标和宽高:(具体怎么获取不在此做具体介绍)let&...
    99+
    2023-06-09
  • 基于QT怎么绘制一个漂亮的预警仪表
    这篇文章主要讲解了“基于QT怎么绘制一个漂亮的预警仪表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于QT怎么绘制一个漂亮的预警仪表”吧!以下是用Qt实现漂亮预警仪表的步骤和代码:创建一个...
    99+
    2023-07-05
  • 基于Python+Matplotlib怎么实现直方图的绘制
    今天小编给大家分享一下基于Python+Matplotlib怎么实现直方图的绘制的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-06-30
  • 如何基于Python绘制一个摸鱼倒计时界面
    这篇文章将为大家详细讲解有关如何基于Python绘制一个摸鱼倒计时界面,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现过程首先要知道、除了静态文字之外的比如当前日期、距离节日放假的天数等都是动态返回的,...
    99+
    2023-06-22
  • canvas里面怎么基于随机点绘制一个多边形
    这篇文章主要介绍canvas里面怎么基于随机点绘制一个多边形,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!起因今天在学习《HTML5+Javascript动画基础》这本书的时候,在第八章的第三节讲到如何用三个弹簧连接...
    99+
    2023-06-09
  • 怎么在Python中绘制一个数码晶体管日期
    本篇文章为大家展示了怎么在Python中绘制一个数码晶体管日期,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代码:import turtle, timedef draw...
    99+
    2023-06-06
  • 基于Python matplotlib库怎么绘制箱线图
    这篇文章主要介绍了基于Python matplotlib库怎么绘制箱线图的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Python matplotlib库怎么绘制箱线图文章都会有所收获,...
    99+
    2023-06-30
  • 怎么用JavaScript绘制一个渐变圆圈对角线
    这篇文章主要讲解了“怎么用JavaScript绘制一个渐变圆圈对角线”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用JavaScript绘制一个渐变圆圈...
    99+
    2024-04-02
  • Python中怎么利用Scribus创建一个RGB立方体
    本篇文章给大家分享的是有关Python中怎么利用Scribus创建一个RGB立方体,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。作为色轮的替代,我想在立方体表面使用一系列图形来...
    99+
    2023-06-16
  • 使用javascript怎么绘制一个方块
    本篇文章为大家展示了使用javascript怎么绘制一个方块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。html中插入javascript画矩形<!DOCTYPE <!DOC...
    99+
    2023-06-14
  • 使用Python怎么绘制一个爱心树
    今天就跟大家聊聊有关使用Python怎么绘制一个爱心树,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、爱心树import turtleimport random...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作