天天看點

用python畫星空_用python畫一幅美瞳,今日份來自程式員的浪漫

如果說,眼睛是心靈的窗戶,那麼,美瞳就是心靈的彩窗,就像下圖中這樣。

用python畫星空_用python畫一幅美瞳,今日份來自程式員的浪漫

而我們今天所要挑戰的,就是用python畫美瞳,而且是五分鐘之内畫三百副争奇鬥豔、各領風騷、絕不重樣的美瞳。作為這顆地球上最純情的少年,我一直抱守着最質樸的信念——美麗,絕不NG!

江湖上一直都有傳言,python除了生孩子不會,别的都會!那麼,python作為理工男的玩具,程式員的武器,要攻下美瞳這塊屬于女孩子們的領地,雖然免不了會是一場曠日持久、拉拉扯扯的惡戰,也必定會決勝千裡、赢得帥氣!

最終得到的部分結果,可以先看下圖體會一下:

用python畫星空_用python畫一幅美瞳,今日份來自程式員的浪漫

那麼,接下來,牛皮吹完了,差不多可以收收心,開始準備幹活了。

首先,我們可以看到,美瞳的大緻形狀是橢圓,從橢圓的中心到外圍,顔色是在緩慢地漸變,自然地過渡,這樣才會顯得比較有縱深感。而這也就決定了,在三維空間中,用渲染橢球的方式來實作這樣的視覺效果,是更為可行的。

那麼,我們可以繪制橢球了,使用numpy庫,用100個經度值、100個緯度值就可以獲得10000個位于橢球面上的點,連接配接起來就是一個閉合的橢球面,繪制過程是通過matplotlib庫實作的。代碼實作如下:

u=np.linspace(0,2*pi,100)
    v=np.linspace(0,pi,100)

    x=a*np.outer(np.cos(u),np.sin(v))
    y=a*np.outer(np.sin(u),np.sin(v))
    z=b*np.outer(np.ones(np.size(u)),np.cos(v))
	#cmap指的是配色方案,預設為純藍色,可通過matplotlib.cm.cmap_d.keys()擷取所有配色方案,alpha指的是透明度
	ax.plot_surface(x,y,z,cmap=value,alpha=0.7)
           

先看一下,效果是這樣:

用python畫星空_用python畫一幅美瞳,今日份來自程式員的浪漫

這樣看的話,和美瞳的形狀是相去甚遠的,這是因為我們是從傾斜的角度去看這個橢球的。如果我們從正上方或者正下方看的話,就會發現形象接近了一些。而這隻需要加一行代碼就可以。

#将視點的位置偏轉90度
 ax.view_init(90,0)
           
用python畫星空_用python畫一幅美瞳,今日份來自程式員的浪漫

看着确實還是挺美的,但是還是略顯了一點單調和空洞,還是缺少了一些層次感。而要有層次感,光有漸變是不夠的,還要有停頓!

為了實作這一效果,我們可以在橢球的Z軸上畫一個圓錐。無論是通過圓錐看橢球,還是通過橢球看圓錐,都會發現雙方的架構已經合二為一,相愛相殺,眉頭解不開的結,命中解不開的解,是你,是你,夢見的就是你!

圓錐曲線的繪制并不算難,均勻地繪制100條直線,每條直線和赤道面的夾角保持相同,代碼如下:

for i in np.linspace(0,2*pi,100):
        x_yuanzhui=15000000*cos(radians(60))*sin(i)
        y_yuanzhui=15000000*cos(radians(60))*cos(i)
        z_yuanzhui=10000000-15000000*sin(radians(60))
        #linestyle中可以設定線形為破折号
        plt.plot([0, x_yuanzhui], [0, y_yuanzhui], [10000000, z_yuanzhui], color='black', linestyle='--')
           

用ax.view_init(90,0)和ax.view_init(270,0)分别指定視點方向為正北極和正南極,那麼,一顆橢球就可以得到兩副美瞳。還可以将獲得的美瞳儲存為PNG圖檔,用這句代碼就可以:

plt.savefig(filename)
           

在檔案夾中看就是醬紫的:

用python畫星空_用python畫一幅美瞳,今日份來自程式員的浪漫

美瞳是心靈的彩窗,而窗戶總要開開合合,如果顔色還能變化,那就更能展現出生活的缤紛多彩。我們可以通過imageio的生成gif來實作。代碼如下:

for filename in filenames:
        images.append(imageio.imread(filePath+"image"+filename))
imageio.mimsave(filePath+'result.gif',images,duration=0.2)
           

最終的效果就是這樣:

用python畫星空_用python畫一幅美瞳,今日份來自程式員的浪漫