用python實現旋轉地球
素材
本文只講最簡單也是最常見的正側面旋轉地球。
首先你得有一張360度貼圖,效果如下圖。在網上搜一下,這種圖很多,容易獲得。
它的特點是高度恰好是寬度的一半,因為地球一周有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=[]foriinrange(w):forjinrange(h):r=math.sqrt((i-w/2)**2+(j-h/2)**2)ifr<150:pxList.append(i)pyList.append(j)
2 計算經緯度
首先從平面坐標獲得三維坐標
球面上的任意一點,有一個規律是x2 + y2 + z2 = 1
我們就用這個原理,可以獲得圓內每個點的z值
根據x,y,z計算球面的經緯度
為了讓計算速度盡量快一些,這里用numpy
defcalcSphereXY2XYZ(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_pide(v03,maxHeight)v1y=np.true_pide(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)#latv0lon=np.arctan2(v1z,-v1x)v1lon=np.add(v0lon,longOffset)#longv2lon=np.fmod(v1lon,math.pi*2)#longreturnv2lon,v1lat
3 獲取經緯度對應的xy坐標
就是一個簡單的坐標映射
defcalcShpereLatLong2XY(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)returnv3x2,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]foriinrange(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=[]foriinrange(0,360,10):a=-i*math.pi/180img=getPic(a)str1='temp%03d.png'%iimg.save(str1)im=imageio.imread(str1)frames.append(im)#img.show()imageio.mimsave('earth.gif',frames,'GIF',duration=0.25)
看完了這篇文章,相信你對如何用Python代碼實現旋轉地球有了一定的了解,想了解更多相關知識,歡迎關注本站行業資訊頻道,感謝各位的閱讀!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
哈嘍小伙伴們 ,今天給大家科普一個小知識。在日常生活中我們或多或少的都會接觸到求幾本穿越到仙界的小說方面的一些說法,有的小伙伴還不是很了解,今天就給大家詳細的介紹一下關于求幾本穿越到仙界的小說的相關內容。1、《仙界穿越》,作者是書鬼龍騎;(相關資料圖)2、《天界》,作者是落拓少年;3、《一仙當千》,作者是寒香寂寞;4、《妖孽之我是天皇》,作者是縹緲;5、《仙界學院之古月國》,作者是四小月夕;6、《...
中國食用油上市公司有哪些中國食用油上市公司有:道道全(002852)、東凌國際(000893)、新賽股份(600540)、金健米業(600127)、中糧生化(000930)、中糧糖業(600737)、西王食品(000639)。1、道道全(002852)作為中國主要的菜籽油類產品專業生產企業之一,公司始終重視“道道全”品牌營銷戰略,堅持品牌化經營思路。目前公司的“...
5月15日,央行、銀保監會聯合發布《關于調整差別化住房信貸政策有關問題的通知》,對于貸款購買普通自住房的居民家庭,首套住房商業性個人住房貸款利率下限調整為不低于相應期限貸款市場報價利率減20個基點,二套住房商業性個人住房貸款利率政策下限按現行規定執行?!锻ㄖ分赋?,在全國統一的貸款利率下限基礎上,人民銀行、銀保監會各派出機構按照“因城施策”的原則,指導各省級市場利率定價自律...