Python实现绘制3D地球旋转效果
作者:微小冷 发布时间:2021-04-17 22:25:37
标签:Python,地球,旋转
画一个地球
想画一个转动的地球,那么首先要有一个球,或者说要有一个球面,用参数方程可以表示为
x=rcosϕcosθ
y=rcosϕsinθ
z=rsinϕ
然后要有一个地球,或者说要有一个地图,用来作为贴图,映射到球面上。
import numpy as np
import matplotlib.pyplot as plt
path = "earth1.jpg"
img = plt.imread(path)
h, w, c = img.shape
ys, xs = np.indices([h, w])
th = xs/w*np.pi*2
phi = np.pi/2 - ys/h*np.pi
x = np.cos(phi)*np.cos(th)
y = np.cos(phi)*np.sin(th)
z = np.sin(phi)
cs = [tuple(c/255) for c in img.reshape(-1,3)]
ax = plt.subplot(projection='3d')
ax.scatter(x, y, z, marker='.', c=cs)
plt.axis('off')
plt.show()
其中scatter
画的是散点图,c=cs
为颜色映射参数,所以温馨提示,选取的地球图片不宜过大,否则点太多会让电脑爆掉。
最后得到的效果如下
让地球转起来
三维空间中的旋转矩阵如下表所示,具体讲解可参考这两篇博客:旋转坐标轴💎旋转正方体
有了旋转矩阵,接下来就是让地球转起来。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
cos = lambda th : np.cos(np.deg2rad(th))
sin = lambda th : np.sin(np.deg2rad(th))
Rz = lambda th : np.array([
[cos(th) , -sin(th), 0],
[sin(th), cos(th), 0],
[0 , 0, 1]])
xyz = np.array([x,y,z]).reshape(3,-1)
fig = plt.figure(figsize=(5,5))
ax = fig.add_subplot(projection='3d')
ax.grid()
lines = ax.scatter(x, y, z, marker='.', c=cs)
def animate(n):
# 按照xyz顺序旋转
axis = [2,1,0]
shape = xyz.shape
lines._offsets3d = Rz(n)@xyz
return lines,
ani = animation.FuncAnimation(fig, animate,
range(0, 360, 2), interval=25, blit=True)
#plt.show()
ani.save("zyx.gif")
效果如下
来源:https://tinycool.blog.csdn.net/article/details/128914226


猜你喜欢
- 通常表中会有一个Create date 创建日期的字段,其它数据库均有默认值的选项。MySQL也有默认值timestamp,但在MySQL中
- spring boot 测试单元修改数据库不成功spring boot 集成data jpa 在test区测试数据库操作的时候,查询正常,但
- 说明Django 默认的用户表 auth_user 包含 id, password, last_login, is_superuser, u
- 背景当 TKE 集群配置了节点池并启用了弹性伸缩,在节点资源不够时可以触发节点的自动扩容 (自动买机器并加入集群),但这个扩容流程需要一定的
- 如果你还在为python的各种urllib和urlibs,cookielib 头疼,或者还还在为python模拟登录和抓取数据而抓狂,那么来
- 详细参考:https://gitee.com/copperpeas/uniapp-paymentuniapp-payment介绍uniapp
- Python 队列Queue 队列是一种先进先出(FIFO)的数据类型, 新的元素通过 入队 的方式添加进 Queue 的末尾, 出队 就是
- 本文实例为大家分享了python获取地震信息微信实时推送的具体代码,供大家参考,具体内容如下import requests,timefrom
- 导语:哈喽,哈喽~今天小编又来分享小游戏了——flappy bird(飞扬的小鸟),这个游戏非常的经
- 前言在MySQL很多测试场景,需要人工生成一些测试数据来测试。本文提供一个构造MySQL大表存储过程,可以生成包含用户名,手机号码,出生日期
- 在自然语言处理过程中,全角、半角的的不一致会导致信息抽取不一致,因此需要统一。有规律(不含空格):全角字符unicode编码从65281~6
- 前言如题目所述,又是花费了两天的时间实现了该功能,本来今天下午有些心灰意冷,打算放弃嵌入到Scoll Area中的想法,但最后还是心里一紧,
- 1. Python的文件类型1. 源代码--直接由Python解析vi 1.py #!/usr/bin/pythonprint 'h
- #写在前面,这个程序我已经弄出来了,但是因为黄牛泛滥以及懒人太多,整个程序的代码就不贴出来了,这里纯粹就是技术交流。只做技术交流、、、、、
- 1、用户有三种:活跃用户、沉睡用户、外部用户。2、据不完全统计,外部用户8亿,沉睡用户1.2亿,活跃用户1千万。3、就算不去管活跃用户,或者
- 01直接生成这类方法是利用基本程序软件包numpy的随机数产生方法来生成各类用于聚类算法数据集合,也是自行制作轮子的生成方法。一、基础类型1
- MySQL超长字符截断又名"SQL-Column-Truncation",是安全研究者Stefan Esser在2008
- 整理了一下python 中文件的输入输出及主要介绍一些os模块中对文件系统的操作。文件输入输出1、内建函数open(file_name,文件
- 调用数据库存储过程见下:<%Set Dataconn = Server.CreateObject(&qu
- 1.认为FindControl方法寻找的范围是给定Control的后代控件。 <form id="form1" r