温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何用Python代码实现旋转地球

发布时间:2020-06-24 09:57:23 来源:亿速云 阅读:400 作者:清晨 栏目:编程语言

小编给大家分享一下如何用Python代码实现旋转地球,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨方法吧!

用python实现旋转地球

素材

本文只讲最简单也是最常见的正侧面旋转地球。

首先你得有一张360度贴图,效果如下图。在网上搜一下,这种图很多,容易获得。

如何用Python代码实现旋转地球

它的特点是高度恰好是宽度的一半,因为地球一周有360度,而从南极到北极只有180度。这种360度贴图,标明了每个经纬度上地球的表面效果。仔细观察会注意到,南北两极变形剧烈,而中间地带和我们经常见到的地图比较相似。

我们称它为经纬度贴图。

基本原理

旋转地球之所以看起来是旋转的,只是因为它上面显示的内容在变。其实起点只是一个圆。我们所做的,只是把经纬度贴图中的像素以合理的方式贴到圆上去。然后再把一帧帧图片连接为GIF动图即可。

贴图的方法是:

1、选择圆内的所有点。

2、计算每一点对应的经纬度。

3、从经纬度贴图上获取该经纬度对应的xy坐标

4、获取像素写入图片

5、制作GIF

计算过程是比较简单的球面几何,下面结合代码讲解。

1 获得圆内所有的点

这个比较简单

  img= Image.new('RGBA', (300,300), 'black')     w= img.size[0]     h= img.size[1]     pxList=[]     pyList=[]     for i in range(w):         for j in range(h):             r= math.sqrt((i-w/2)**2+(j-h/2)**2)             if r<150:                 pxList.append(i)                             pyList.append(j)

2 计算经纬度

首先从平面坐标获得三维坐标

球面上的任意一点,有一个规律是x2 + y2 + z2 = 1

我们就用这个原理,可以获得圆内每个点的z值

根据x,y,z计算球面的经纬度

为了让计算速度尽量快一些,这里用numpy

def calcSphereXY2XYZ(px, py, maxHeight, longOffset):     v0x= np.array(px)     v0y= np.array(py)     v03= np.subtract(v0x, maxHeight)     v04= np.subtract(v0y, maxHeight)     v1x= np.true_divide(v03, maxHeight)     v1y= np.true_divide(v04, maxHeight)     v07= np.power(v1x,2)     v08= np.power(v1y,2)     v09= np.add(v07,v08)     v0a= np.subtract(1,v09)     v1z= np.power(v0a,1/2)                                  # z     # print('z:', max(v1z), min(v1z))     v1lat= np.multiply(v1y, math.pi/2)                      # lat     v0lon= np.arctan2(v1z, -v1x)                                  v1lon= np.add(v0lon, longOffset)                       # long     v2lon= np.fmod(v1lon, math.pi*2)                       # long     return v2lon, v1lat

3 获取经纬度对应的xy坐标

就是一个简单的坐标映射

def calcShpereLatLong2XY(vlon, vlat, width, height):     v3x0=np.multiply(vlon, width/2/math.pi)     v3y0=np.multiply(vlat, height/math.pi)     v3y1=np.add(v3y0, height/2)     v3x2=v3x0.astype(np.integer)     v3y2=v3y1.astype(np.integer)     return v3x2, v3y2

4 获得像素点,并写入图片

首先,载入经纬度贴图的素材并转为numpy格式

    imgBack= Image.open('EARTH_small.bmp')     width= imgBack.size[0]     height= imgBack.size[1]     imgBack= imgBack.convert('RGBA')     arrayBack= np.array(imgBack)

注意转换后的XY是反的,取点并直接赋值即可

  color= arrayBack[npy, npx]     for i in range(len(pxList)):         x= pxList[i]         y= pyList[i]         cc=color[i]         # print(cc)         cc= tuple(cc)         img.putpixel((x,y), cc)

5 GIF制作

使用的是imageio库

    frames=[]     for i in range(0, 360, 10):         a= -i*math.pi/ 180         img= getPic(a)         str1= 'temp%03d.png'%i         img.save(str1)         im = imageio.imread(str1)         frames.append(im)         # img.show()     imageio.mimsave('earth.gif', frames, 'GIF', duration=0.25)

看完了这篇文章,相信你对如何用Python代码实现旋转地球有了一定的了解,想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI