<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前言:
在上篇博文中使用了matplotlib
繪製了3D小紅花,本篇部落格主要介紹一下3D小紅花的繪製原理。
對於極座標系中的一點 P ,我們可以用極徑 r 和極角 θ 來表示,記為點 P ( r , θ ) ,
使用matplotlib繪製極座標系:
import matplotlib.pyplot as plt import numpy as np if __name__ == '__main__': # 極徑 r = np.arange(10) # 角度 theta = 0.5 * np.pi * r fig = plt.figure() plt.polar(theta, r, c='r', marker='o', ms=3, ls='-', lw=1) # plt.savefig('img/polar1.png') plt.show()
使用matplotlib繪製極座標散點圖:
import matplotlib.pyplot as plt import numpy as np if __name__ == '__main__': r = np.linspace(0, 10, num=10) theta = 2 * np.pi * r area = 3 * r ** 2 ax = plt.subplot(111, projection='polar') ax.scatter(theta, r, c=theta, s=area, cmap='hsv', alpha=0.75) # plt.savefig('img/polar2.png') plt.show()
有關matplotlib
極座標的引數更多介紹,可參閱官網手冊。
繪製r = s i n ( θ ) r=sin(theta)r=sin(θ)
在極座標系下的影象:
import matplotlib.pyplot as plt import numpy as np if __name__ == '__main__': fig = plt.figure() ax = plt.subplot(111, projection='polar') ax.set_rgrids(radii=np.linspace(-1, 1, num=5), labels='') theta = np.linspace(0, 2 * np.pi, num=200) r = np.sin(theta) ax.plot(theta, r) # plt.savefig('img/polar3.png') plt.show()
以 2 π 為一個週期,增加影象的旋轉週期:
r = np.sin(2 * theta)
繼續增加影象的旋轉週期:
r = np.sin(3 * theta) r = np.sin(4 * theta)
然後我們可以通過調整極徑係數和角度係數來調整影象:
import matplotlib.pyplot as plt import numpy as np if __name__ == '__main__': fig = plt.figure() ax = plt.subplot(111, projection='polar') ax.set_rgrids(radii=np.linspace(-1, 1, num=5), labels='') theta = np.linspace(0, 2 * np.pi, num=200) r1 = np.sin(4 * (theta + np.pi / 8)) r2 = 0.5 * np.sin(5 * theta) r3 = 2 * np.sin(6 * (theta + np.pi / 12)) ax.plot(theta, r1) ax.plot(theta, r2) ax.plot(theta, r3) # plt.savefig('img/polar4.png') plt.show()
現在可以將花瓣放置在三維空間上了,根據花瓣的生成規律,其花瓣外邊緣線在一條旋轉內縮的曲線上,這條曲線的極徑 r 隨著角度的增大逐漸變小,其高度 h 逐漸變大。
其函數影象如下:
這樣定義就滿足前面對花瓣外邊緣曲線的假設了,即 r 遞減, h 遞增。
現在將其放在三維空間中:
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D if __name__ == '__main__': fig = plt.figure() ax = Axes3D(fig) # plt.axis('off') x = np.linspace(0, 1, num=30) theta = np.linspace(0, 2 * np.pi, num=1200) theta = 30 * theta x, theta = np.meshgrid(x, theta) # f is a decreasing function of theta f = 0.5 * np.pi * np.exp(-theta / 50) r = x * np.sin(f) h = x * np.cos(f) # 極座標轉笛卡爾座標 X = r * np.cos(theta) Y = r * np.sin(theta) ax = ax.plot_surface(X, Y, h, rstride=1, cstride=1, cmap=plt.cm.cool) # plt.savefig('img/polar5.png') plt.show()
笛卡爾座標系(Cartesian coordinate system)
,即直角座標系。
然而,上述的表達仍然沒有得到花瓣的細節,因此我們需要在此基礎之上進行處理,以得到花瓣形狀。因此設計了一個花瓣函數:
其是一個以 2 π 為週期的周期函數,其值域為[ 0.5 , 1.0 ],影象如下圖所示:
再次繪製:
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D if __name__ == '__main__': fig = plt.figure() ax = Axes3D(fig) # plt.axis('off') x = np.linspace(0, 1, num=30) theta = np.linspace(0, 2 * np.pi, num=1200) theta = 30 * theta x, theta = np.meshgrid(x, theta) # f is a decreasing function of theta f = 0.5 * np.pi * np.exp(-theta / 50) # 通過改變函數週期來改變花瓣的形狀 # 改變值域也可以改變花瓣形狀 # u is a periodic function u = 1 - (1 - np.absolute(np.sin(3.3 * theta / 2))) / 2 r = x * u * np.sin(f) h = x * u * np.cos(f) # 極座標轉笛卡爾座標 X = r * np.cos(theta) Y = r * np.sin(theta) ax = ax.plot_surface(X, Y, h, rstride=1, cstride=1, cmap=plt.cm.RdPu_r) # plt.savefig('img/polar6.png') plt.show()
為了使花瓣更加真實,使花瓣的形態向下凹,因此需要對花瓣的形狀進行微調,這裡新增一個修正項和一個噪聲擾動,修正函數影象為:
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D if __name__ == '__main__': fig = plt.figure() ax = Axes3D(fig) # plt.axis('off') x = np.linspace(0, 1, num=30) theta = np.linspace(0, 2 * np.pi, num=1200) theta = 30 * theta x, theta = np.meshgrid(x, theta) # f is a decreasing function of theta f = 0.5 * np.pi * np.exp(-theta / 50) noise = np.sin(theta) / 30 # u is a periodic function u = 1 - (1 - np.absolute(np.sin(3.3 * theta / 2))) / 2 + noise # y is a correction function y = 2 * (x ** 2 - x) ** 2 * np.sin(f) r = u * (x * np.sin(f) + y * np.cos(f)) h = u * (x * np.cos(f) - y * np.sin(f)) X = r * np.cos(theta) Y = r * np.sin(theta) ax = ax.plot_surface(X, Y, h, rstride=1, cstride=1, cmap=plt.cm.RdPu_r) # plt.savefig('img/polar7.png') plt.show()
修正前後影象區別對比如下:
3D花的繪製主要原理是極座標,通過正弦/餘弦函數進行旋轉變形構造,引數略微變化就會出現不同的花朵,有趣!
到此這篇關於Matplotlib 3D
繪製小紅花原理的文章就介紹到這了,更多相關Matplotlib 繪製小紅花內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45