知行编程网知行编程网  2022-12-31 22:00 知行编程网 隐藏边栏  6 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python中用代码实现旋转地球!的相关知识,希望可以帮到处于编程学习途中的小伙伴

用 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)

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享