日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python莫比乌斯_用python绘出一个莫比乌斯环

發(fā)布時(shí)間:2024/3/12 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python莫比乌斯_用python绘出一个莫比乌斯环 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

昨天寫了一篇subplot的練習(xí)放到微信公眾賬號(hào)中,想用一個(gè)莫比烏斯環(huán)的圖片作為封面圖片,就去維基百科上扒了一個(gè)。但是分辨率很低,就想自己繪出一個(gè)來(lái)。沒(méi)想到越陷越深,就一起把3D繪圖給學(xué)習(xí)了一遍。

(我昨天在CSDN發(fā)表了這篇文章,今天竟然找不到了!)

源代碼:https://github.com/gt11799/mobiusband

有關(guān)莫比烏斯帶,請(qǐng)戳維基百科http://zh.wikipedia.org/wiki/%E8%8E%AB%E6%AF%94%E4%B9%8C%E6%96%AF%E5%B8%A6

函數(shù)已經(jīng)給出,剩下的就是取值,繪圖。要繪3D圖,X,Y,Z都得是矩陣。平常的做法就是遍歷,給矩陣中的每一個(gè)元素賦值,如果取樣點(diǎn)為100,那么計(jì)算X的賦值次數(shù)就是100*100,每次賦值還要計(jì)算兩次cos()。

這就要請(qǐng)出今天的明星-numpy。

numpy是python中的高效數(shù)值運(yùn)算模塊。其中包含了各種數(shù)學(xué)運(yùn)算,以及array數(shù)據(jù)類型,這些都是用C寫的,如果只是進(jìn)行少量數(shù)值的運(yùn)算,numpy的性能是低于math的,但是大批量的數(shù)值運(yùn)算,numpy的優(yōu)勢(shì)就體現(xiàn)出來(lái)了。

首先介紹的是array數(shù)據(jù)類型,很像list,但是可以不用迭代,直接運(yùn)算。

>>> from numpy import *

>>> a = array([1,2,3,4])

>>> a * 3

array([ 3,? 6,? 9, 12]) 這樣就可以直接把取樣點(diǎn)直接投到函數(shù)中得到X的值。

取樣也很方便,比如在這個(gè)例子中,我們可以這么取v和u:

v = linspace(-1.0, 1.0, num=500, endpoint=True)

u = linspace(0, 2*pi, num=500, endpoint=True) 參數(shù)分別是(start,stop,number of sample, 是否包含終止數(shù)值)

但是array沒(méi)有append或者add方法,而且,我試了很久,也沒(méi)有辦法把數(shù)據(jù)一行一行的添加到一個(gè)array中,于是我找了list當(dāng)作中間人。

把運(yùn)算復(fù)雜度高的u迭代,每次計(jì)算出全部的v。

for value_u in u:

answer.append((1. + v / 2. * cos(value_u/2.))?* cos(value_u)) 要提前把v和u取成array類型,要提前定義answer是list。更高效的是直接在list中迭代,我們可以為X,Y,Z分別建立函數(shù),返回?cái)?shù)值array。

def func_x(v, u):

answer = [((1. + v / 2. * cos(value_u/2.)) * cos(value_u)) for value_u in u]

return array(answer) 其他坐標(biāo)軸依此類推。

我們已經(jīng)準(zhǔn)備好了所需要材料,就等著下鍋了。3Dplot我用的是mpl_toolkits.mplot中的Axes3D模塊,這是matplotlib中的一部分。繪圖也很簡(jiǎn)單,我用的是其中的surface方法。

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')

surf = ax.plot_surface(X, Y, Z)

先新建一個(gè)figure(為了設(shè)置dpi),然后以添加子圖的形式添加進(jìn)去就行。這樣就已經(jīng)成型了,提高下dpi

fig = plt.figure(dpi=150) 增加點(diǎn)色彩變化

surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm) 需要從matplotlib中倒入cm,cm模塊很有趣,有著很多的色彩變化,可以參考官方文檔。我嘗試了多種,最后選擇是YlOrBr,是yellow or brand,效果圖最后會(huì)貼出來(lái)。

去掉那些黑色曲線

surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, linewidth=0) 然后還玩了一把透明度alpha,最后發(fā)現(xiàn)透明度低一點(diǎn)的好(alpha越小,透明度越高)

surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, linewidth=0, alpha=0.9) 現(xiàn)在的圖z軸太高,造成立體感不明顯,于是我們拉長(zhǎng)z軸,讓圖扁平一點(diǎn)。

ax.set_zlim(-2., 2.)

然后去掉坐標(biāo)軸

plt.axis('off') 如果用show()方法顯示圖表,然后保存,背景不是透明的,我們可以用figure.save()取保存

fig.savefig('mobiusband.png', transparent=True) 發(fā)現(xiàn)圖不夠清晰,增加dpi

fig.savefig('mobiusband.png', transparent=True, dpi=600) 然后就得到了最終的圖了

——————————————

github主頁(yè):https://github.com/gt11799

E-mail:gting405@163.com

總結(jié)

以上是生活随笔為你收集整理的python莫比乌斯_用python绘出一个莫比乌斯环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。